Zum Inhalt springen

Sammlungen & Felder

Sammlungen sind die Grundlage des Inhaltsmodells von EmDash. Jede Sammlung repräsentiert einen Inhaltstyp (Beiträge, Seiten, Produkte) und enthält Felddefinitionen, die die Struktur Ihrer Daten bestimmen.

Erstellen Sie Sammlungen über das Admin-Oberfläche unter Inhaltstypen. Jede Sammlung hat:

EmDash content types showing Pages, Posts, and custom collections with their features
EigenschaftBeschreibung
slugURL-sicherer Bezeichner (z.B. posts, products)
labelAnzeigename (z.B. “Blogbeiträge”)
labelSingularSingularform (z.B. “Beitrag”)
descriptionOptionale Beschreibung für Redakteure
iconLucide-Icon-Name für die Admin-Seitenleiste
supportsFunktionen wie Entwürfe, Revisionen, Vorschau, Zeitplanung, Suche, SEO

Beim Erstellen einer Sammlung aktivieren Sie die benötigten Funktionen:

FunktionBeschreibung
draftsEntwurf/Veröffentlicht-Workflow aktivieren
revisionsInhaltsverlauf mit Versions-Snapshots verfolgen
previewSignierte Vorschau-URLs für Entwurfsinhalte generieren
schedulingInhalte für Veröffentlichung zu einem zukünftigen Datum planen
// Example collection with all features enabled
{
slug: "posts",
label: "Blog Posts",
labelSingular: "Post",
supports: ["drafts", "revisions", "preview", "scheduling"]
}

EmDash unterstützt 15 Feldtypen, die SQLite-Spaltentypen zugeordnet sind:

Kurze Texteingabe. Wird der TEXT-Spalte zugeordnet.

{ slug: "title", type: "string", label: "Title" }

Rich-Text-Editor (TipTap/ProseMirror). Wird als JSON gespeichert.

{ slug: "content", type: "portableText", label: "Content" }

Portable Text ist ein blockbasiertes Format, das Struktur erhält, ohne HTML einzubetten.

Dezimalzahlen. Wird der REAL-Spalte zugeordnet.

{ slug: "price", type: "number", label: "Price" }

Wahr/Falsch-Umschalter. Wird INTEGER (0/1) zugeordnet.

{ slug: "featured", type: "boolean", label: "Featured Post" }

Einzelne Option aus einer Liste. Wird der TEXT-Spalte zugeordnet.

{
slug: "status",
type: "select",
label: "Produktstatus",
validation: {
options: ["active", "discontinued", "coming_soon"]
}
}

Bildauswahl aus der Mediathek. Speichert Medien-ID als TEXT.

{ slug: "featuredImage", type: "image", label: "Featured Image" }

Jedes Feld unterstützt diese Eigenschaften:

EigenschaftTypBeschreibung
slugstringSpaltenname in der Datenbank
labelstringAnzeigelabel in der Admin-UI
typeFieldTypeEiner der 15 Feldtypen
requiredbooleanOb das Feld einen Wert haben muss
uniquebooleanOb Werte über Einträge hinweg eindeutig sein müssen
defaultValueunknownStandardwert für neue Einträge
validationobjectTypspezifische Validierungsregeln
widgetstringBenutzerdefinierter Widget-Bezeichner
optionsobjectWidget-spezifische Konfiguration
sortOrdernumberAnzeigereihenfolge im Editor

Das validation-Objekt variiert je nach Feldtyp:

interface FieldValidation {
required?: boolean; // All types
min?: number; // number, integer
max?: number; // number, integer
minLength?: number; // string, text
maxLength?: number; // string, text
pattern?: string; // string (regex)
options?: string[]; // select, multiSelect
}

Beispiel mit Validierung:

{
slug: "email",
type: "string",
label: "Email Address",
required: true,
unique: true,
validation: {
pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
}
}

Das options-Objekt konfiguriert das feld-spezifische UI-Verhalten:

interface FieldWidgetOptions {
rows?: number; // text (textarea rows)
showPreview?: boolean; // image, file
collection?: string; // reference (target collection)
allowMultiple?: boolean; // reference (multiple refs)
[key: string]: unknown; // Custom widget options
}

Beispiel-Referenzfeld:

{
slug: "relatedProducts",
type: "reference",
label: "Related Products",
options: {
collection: "products",
allowMultiple: true
}
}

Verwenden Sie die bereitgestellten Abfragefunktionen, um Inhalte abzurufen. Diese folgen Astros Live-Sammlungs-Muster und geben strukturierte Ergebnisse zurück:

import { getEmDashCollection, getEmDashEntry } from "emdash";
// Alle Einträge abrufen - gibt { entries, error } zurück
const { entries: posts } = await getEmDashCollection("posts");
// Nach Status filtern
const { entries: drafts } = await getEmDashCollection("posts", {
status: "draft",
});
// Ergebnisse begrenzen
const { entries: recent } = await getEmDashCollection("posts", {
limit: 5,
});
// Nach Taxonomie filtern
const { entries: newsPosts } = await getEmDashCollection("posts", {
where: { category: "news" },
});
// Einen einzelnen Eintrag anhand des Slugs abrufen - gibt { entry, error, isPreview } zurück
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");
// Fehler behandeln
const { entries, error } = await getEmDashCollection("posts");
if (error) {
console.error("Failed to load posts:", error);
}

Führen Sie npx emdash types aus, um TypeScript-Typen aus Ihrem Schema zu generieren:

// .emdash/types.ts (generated)
export interface Post {
title: string;
content: PortableTextBlock[];
excerpt?: string;
featuredImage?: string;
author: string; // reference ID
}
export interface Product {
title: string;
price: number;
description: PortableTextBlock[];
}

Feldtypen werden auf SQLite-Spaltentypen abgebildet:

FeldtypSQLite-TypAnmerkungen
stringTEXT
textTEXT
slugTEXT
numberREAL64-Bit-Gleitkommazahl
integerINTEGER64-Bit-Ganzzahl mit Vorzeichen
booleanINTEGER0 oder 1
datetimeTEXTISO-8601-Format
selectTEXT
multiSelectJSONArray von Strings
portableTextJSONBlock-Array
imageTEXTMedien-ID
fileTEXTMedien-ID
referenceTEXTEintrags-ID
jsonJSONBeliebiges JSON