Sammlungen & Felder

Auf dieser Seite

Eine Sammlung (Collection) ist ein Inhaltstyp (Beiträge, Seiten, Produkte). Ihre Felddefinitionen legen die Struktur der Daten jedes Eintrags fest.

Sammlungen erstellen

Erstellen Sie Sammlungen über das Admin-Panel unter Inhaltstypen. Jede Sammlung hat folgende Eigenschaften:

EmDash-Inhaltstypen zeigen Seiten, Beiträge und benutzerdefinierte Sammlungen mit ihren Funktionen
EigenschaftBeschreibung
slugURL-sichere Kennung (z.B. posts, products)
labelAnzeigename (z.B. “Blog-Beiträge”)
labelSingularSingularform (z.B. “Beitrag”)
descriptionOptionale Beschreibung für Redakteure
iconLucide-Icon-Name für die Admin-Seitenleiste
supportsFunktionen wie Entwürfe, Revisionen, Vorschau, Planung, Suche, SEO

Sammlungsfunktionen

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

FunktionBeschreibung
draftsEntwurf/Veröffentlicht-Workflow aktivieren
revisionsInhaltsverlauf mit Versionsschnappschüssen verfolgen
previewSignierte Vorschau-URLs für Entwurfsinhalte generieren
schedulingInhalte für zukünftige Veröffentlichung planen

Die folgende Sammlung aktiviert alle vier Funktionen:

{
  slug: "posts",
  label: "Blog Posts",
  labelSingular: "Post",
  supports: ["drafts", "revisions", "preview", "scheduling"]
}

Feldtypen

EmDash unterstützt 16 Feldtypen, die auf SQLite-Spaltentypen abgebildet werden.

Textfelder

string

Kurze Texteingabe. Wird auf TEXT-Spalte abgebildet.

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

text

Mehrzeiliges Textarea. Wird auf TEXT-Spalte abgebildet.

{ slug: "excerpt", type: "text", label: "Excerpt" }

slug

URL-sicheres Slug-Feld. Wird auf TEXT-Spalte abgebildet.

{ slug: "handle", type: "slug", label: "URL Handle" }

Rich Content

portableText

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

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

Portable Text ist ein blockbasiertes Format, das die Struktur ohne eingebettetes HTML bewahrt.

json

Beliebige JSON-Daten. Als JSON gespeichert.

{ slug: "metadata", type: "json", label: "Custom Metadata" }

Zahlen

number

Dezimalzahlen. Wird auf REAL-Spalte abgebildet.

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

integer

Ganze Zahlen. Wird auf INTEGER-Spalte abgebildet.

{ slug: "quantity", type: "integer", label: "Stock Quantity" }

Boolesche Werte und Daten

boolean

Wahr/Falsch-Schalter. Wird auf INTEGER (0/1) abgebildet.

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

datetime

Datums- und Zeitauswahl. Gespeichert als ISO 8601-String.

{ slug: "eventDate", type: "datetime", label: "Event Date" }

Auswahl

select

Einzelne Option aus einer Liste. Wird auf TEXT-Spalte abgebildet.

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

multiSelect

Mehrere Optionen aus einer Liste. Gespeichert als JSON-Array.

{
  slug: "features",
  type: "multiSelect",
  label: "Product Features",
  validation: {
    options: ["wireless", "waterproof", "eco-friendly"]
  }
}

Medien und Referenzen

image

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

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

file

Dateiauswahl aus der Medienbibliothek. Speichert Medien-ID als TEXT.

{ slug: "attachment", type: "file", label: "PDF Attachment" }

reference

Verweis auf einen Eintrag einer anderen Sammlung. Speichert Eintrags-ID als TEXT.

{
  slug: "author",
  type: "reference",
  label: "Author",
  options: {
    collection: "authors"
  }
}

Feldeigenschaften

Jedes Feld unterstützt diese Eigenschaften:

EigenschaftTypBeschreibung
slugstringSpaltenname in der Datenbank
labelstringAnzeigebezeichnung in der Admin-Oberfläche
typeFieldTypeEiner der 16 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
widgetstringBenutzerdefinierte Widget-Kennung
optionsobjectWidget-spezifische Konfiguration
sortOrdernumberAnzeigereihenfolge im Editor

Validierungsregeln

Das validation-Objekt variiert je nach Feldtyp. Seine vollständige Form ist:

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
}

Das folgende Feld erfordert eine eindeutige, musterabgeglichene E-Mail-Adresse:

{
  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,}$"
  }
}

Widget-Optionen

Das options-Objekt konfiguriert feldspezifisches UI-Verhalten. Seine vollständige Form ist:

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
}

Das folgende Referenzfeld verknüpft mehrere Produkte:

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

Sammlungen abfragen

Verwenden Sie die bereitgestellten Abfragefunktionen zum Abrufen von Inhalten. Diese folgen dem Live-Collections-Muster von Astro und geben strukturierte Ergebnisse zurück. Das folgende Beispiel zeigt die gängigen Abfrageoptionen:

import { getEmDashCollection, getEmDashEntry } from "emdash";

// Get all entries - returns { entries, error }
const { entries: posts } = await getEmDashCollection("posts");

// Filter by status
const { entries: drafts } = await getEmDashCollection("posts", {
	status: "draft",
});

// Limit results
const { entries: recent } = await getEmDashCollection("posts", {
	limit: 5,
});

// Filter by taxonomy
const { entries: newsPosts } = await getEmDashCollection("posts", {
	where: { category: "news" },
});

// Get a single entry by slug - returns { entry, error, isPreview }
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");

// Handle errors
const { entries, error } = await getEmDashCollection("posts");
if (error) {
	console.error("Failed to load posts:", error);
}

Typgenerierung

Führen Sie npx emdash types aus, um TypeScript-Typen aus Ihrem Schema zu generieren. Die generierte Datei enthält ein Interface pro Sammlung:

export interface Post {
	title: string;
	content: PortableTextBlock[];
	excerpt?: string;
	featuredImage?: string;
	author: string; // reference ID
}

export interface Product {
	title: string;
	price: number;
	description: PortableTextBlock[];
}

Datenbank-Mapping

Feldtypen werden wie folgt auf SQLite-Spaltentypen abgebildet:

FeldtypSQLite-TypHinweise
stringTEXT
textTEXT
slugTEXT
urlTEXT
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
repeaterJSONArray von Unterfeldern

Nächste Schritte