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:
| Eigenschaft | Beschreibung |
|---|---|
slug | URL-sichere Kennung (z.B. posts, products) |
label | Anzeigename (z.B. “Blog-Beiträge”) |
labelSingular | Singularform (z.B. “Beitrag”) |
description | Optionale Beschreibung für Redakteure |
icon | Lucide-Icon-Name für die Admin-Seitenleiste |
supports | Funktionen wie Entwürfe, Revisionen, Vorschau, Planung, Suche, SEO |
Sammlungsfunktionen
Beim Erstellen einer Sammlung aktivieren Sie die benötigten Funktionen:
| Funktion | Beschreibung |
|---|---|
drafts | Entwurf/Veröffentlicht-Workflow aktivieren |
revisions | Inhaltsverlauf mit Versionsschnappschüssen verfolgen |
preview | Signierte Vorschau-URLs für Entwurfsinhalte generieren |
scheduling | Inhalte 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:
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
slug | string | Spaltenname in der Datenbank |
label | string | Anzeigebezeichnung in der Admin-Oberfläche |
type | FieldType | Einer der 16 Feldtypen |
required | boolean | Ob das Feld einen Wert haben muss |
unique | boolean | Ob Werte über Einträge hinweg eindeutig sein müssen |
defaultValue | unknown | Standardwert für neue Einträge |
validation | object | Typspezifische Validierungsregeln |
widget | string | Benutzerdefinierte Widget-Kennung |
options | object | Widget-spezifische Konfiguration |
sortOrder | number | Anzeigereihenfolge 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:
| Feldtyp | SQLite-Typ | Hinweise |
|---|---|---|
string | TEXT | |
text | TEXT | |
slug | TEXT | |
url | TEXT | |
number | REAL | 64-Bit-Gleitkommazahl |
integer | INTEGER | 64-Bit-Ganzzahl mit Vorzeichen |
boolean | INTEGER | 0 oder 1 |
datetime | TEXT | ISO 8601-Format |
select | TEXT | |
multiSelect | JSON | Array von Strings |
portableText | JSON | Block-Array |
image | TEXT | Medien-ID |
file | TEXT | Medien-ID |
reference | TEXT | Eintrags-ID |
json | JSON | Beliebiges JSON |
repeater | JSON | Array von Unterfeldern |
Nächste Schritte
Inhaltsmodell
Verstehen Sie das Inhaltsmodell.
Taxonomien
Organisieren Sie Inhalte mit Kategorien und Tags.
Medienbibliothek
Verwalten Sie Bilder und Dateien.