Content-Modell

Auf dieser Seite

Ihr Content-Modell ist die Gesamtheit der Collections und Felder, die Ihre Website speichert. Sie definieren es im Admin-Panel oder mit der CLI, ändern es bei Bedarf und generieren optional TypeScript-Typen daraus. Diese Seite zeigt, wie Sie damit arbeiten.

Collections und Felder

Eine Collection ist ein Inhaltstyp (Posts, Produkte, Autoren). Jede Collection hat Felder, die Sie definieren (ein Titel, ein Text, ein Preis). Jeder Eintrag hat außerdem Systemfelder, die EmDash für Sie verwaltet.

Sie erstellen und bearbeiten Collections und Felder visuell im Admin-Panel unter Content Types oder mit der CLI. Änderungen werden sofort wirksam, und ein Nicht-Entwickler kann dies tun.

Systemfelder

Zusätzlich zu den von Ihnen definierten Feldern hat jeder Eintrag diese Felder, die immer vorhanden sind:

FeldZweck
idStabiler eindeutiger Bezeichner
slugURL-sicherer Bezeichner, eindeutig pro Locale
statusdraft, published oder scheduled
author_idDer Benutzer, der den Eintrag erstellt hat
created_at / updated_at / published_atZeitstempel
deleted_atBei Soft-Delete gesetzt; die Zeile bleibt
versionWird bei jedem Speichern erhöht

Das Löschen eines Eintrags ist ein Soft-Delete: Er kann wiederhergestellt werden.

Das Modell jederzeit ändern

Sie können jederzeit ein Feld einer Live-Collection hinzufügen, umbenennen, entfernen oder neu typisieren — über das Admin-Panel oder die CLI. Vorhandene Inhalte bleiben erhalten.

TypeScript-Typen

Die Typgenerierung ist optional, aber empfohlen. Generieren Sie Typen aus Ihrem aktuellen Modell:

npx emdash types

Dies schreibt .emdash/types.ts mit einem Interface pro Collection und typisierten Query-Überladungen, sodass getEmDashCollection("posts") vollständig typisierte Einträge zurückgibt:

export interface Post {
	title: string;
	content: PortableTextBlock[];
	excerpt?: string;
}

declare module "emdash" {
	export function getEmDashCollection(
		type: "posts",
	): Promise<{ entries: ContentEntry<Post>[]; error?: Error }>;
}

Führen Sie den Befehl nach Modelländerungen erneut aus, um die Typen synchron zu halten.

Workflows

Beide Workflows ändern dasselbe Modell.

Ein Nicht-Entwickler nutzt das Admin-Panel:

  1. Öffnen Sie Content Types im Admin-Panel.
  2. Klicken Sie auf Add Collection.
  3. Definieren Sie Felder mit dem visuellen Builder.
  4. Beginnen Sie mit der Erstellung von Inhalten.

Ein Entwickler kann die CLI verwenden, um Typen zu generieren und das Modell zwischen Umgebungen zu verschieben:

npx emdash types                     # TypeScript-Typen generieren
npx emdash export-seed > seed.json   # Modell als Seed-Datei exportieren

Seed-Dateien

Eine Seed-Datei ist eine JSON-Beschreibung von Collections, Taxonomien und Menüs. Templates liefern eine mit, und Sie können Ihre eigene für die Versionskontrolle oder zum Einrichten einer anderen Umgebung exportieren.

{
	"version": "1",
	"collections": [
		{
			"slug": "posts",
			"label": "Blog Posts",
			"labelSingular": "Post",
			"supports": ["drafts", "revisions", "preview"],
			"fields": [
				{ "slug": "title", "type": "string", "required": true },
				{ "slug": "content", "type": "portableText" }
			]
		}
	],
	"taxonomies": [{ "name": "category", "label": "Categories", "hierarchical": true }],
	"menus": [{ "name": "primary", "label": "Primary Navigation" }]
}

Das Anwenden eines Seeds ist idempotent, es ist also sicher, ihn erneut auszuführen:

import { applySeed, validateSeed } from "emdash/seed";
import seedData from "./.emdash/seed.json";

const { valid, errors } = validateSeed(seedData);
await applySeed(db, seedData, { includeContent: true, onConflict: "skip" });

Siehe Seed-Dateiformat für das vollständige Schema.

Nächste Schritte