Modèle de Contenu

Sur cette page

Votre modèle de contenu est l’ensemble des collections et des champs que votre site stocke. Vous le définissez dans le panneau d’administration ou avec la CLI, vous le modifiez quand vous en avez besoin et générez éventuellement des types TypeScript à partir de celui-ci. Cette page explique comment l’utiliser.

Collections et champs

Une collection est un type de contenu (articles, produits, auteurs). Chaque collection possède des champs que vous définissez (un titre, un corps, un prix). Chaque entrée dispose également de champs système gérés par EmDash pour vous.

Vous créez et modifiez les collections et les champs visuellement dans le panneau d’administration sous Content Types, ou avec la CLI. Les modifications prennent effet immédiatement, et une personne non-développeuse peut le faire.

Champs système

En plus des champs que vous définissez, chaque entrée possède ceux-ci, toujours présents :

ChampObjectif
idIdentifiant unique stable
slugIdentifiant sûr pour URL, unique par locale
statusdraft, published ou scheduled
author_idL’utilisateur qui a créé l’entrée
created_at / updated_at / published_atHorodatages
deleted_atDéfini lors de la suppression douce ; la ligne est conservée
versionS’incrémente à chaque sauvegarde

La suppression d’une entrée est une suppression douce : elle peut être restaurée.

Modifier le modèle à tout moment

Vous pouvez ajouter, renommer, supprimer ou modifier le type d’un champ sur une collection en production à tout moment, via le panneau d’administration ou la CLI. Le contenu existant est préservé.

Types TypeScript

La génération de types est facultative mais recommandée. Générez des types à partir de votre modèle actuel :

npx emdash types

Cela écrit .emdash/types.ts avec une interface par collection et des surcharges de requête typées, de sorte que getEmDashCollection("posts") renvoie des entrées entièrement typées :

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

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

Relancez la commande après avoir modifié le modèle pour garder les types synchronisés.

Workflows

Les deux workflows modifient le même modèle.

Une personne non-développeuse utilise le panneau d’administration :

  1. Ouvrez Content Types dans le panneau d’administration.
  2. Cliquez sur Add Collection.
  3. Définissez les champs avec le constructeur visuel.
  4. Commencez à créer du contenu.

Un développeur peut utiliser la CLI pour générer des types et déplacer le modèle entre environnements :

npx emdash types                     # générer les types TypeScript
npx emdash export-seed > seed.json   # exporter le modèle comme fichier seed

Fichiers seed

Un fichier seed est une description JSON des collections, taxonomies et menus. Les templates en fournissent un, et vous pouvez exporter le vôtre pour le contrôle de version ou pour configurer un autre environnement.

{
	"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" }]
}

L’application d’un seed est idempotente, il est donc sûr de le réexécuter :

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" });

Voir Format de fichier seed pour le schéma complet.

Prochaines étapes