Modèle de contenu
Comprenez l’approche base de données d’abord.
Les collections sont le fondement du modèle de contenu d’EmDash. Chaque collection représente un type de contenu (articles, pages, produits) et contient des définitions de champs qui déterminent la structure de vos données.
Créez des collections via le panneau d’administration sous Types de contenu. Chaque collection possède :
| Propriété | Description |
|---|---|
slug | Identifiant adapté aux URL (ex : posts, products) |
label | Nom d’affichage (ex : “Articles de blog”) |
labelSingular | Forme singulière (ex : “Article”) |
description | Description optionnelle pour les éditeurs |
icon | Nom de l’icône Lucide pour la barre latérale d’admin |
supports | Fonctionnalités comme brouillons, révisions, aperçu, planification, recherche, seo |
Lors de la création d’une collection, activez les fonctionnalités dont vous avez besoin :
| Fonctionnalité | Description |
|---|---|
drafts | Activer le flux de travail brouillon/publié |
revisions | Suivre l’historique du contenu avec des instantanés de version |
preview | Générer des URL d’aperçu signées pour le contenu brouillon |
scheduling | Planifier la publication du contenu à une date future |
// Example collection with all features enabled{ slug: "posts", label: "Blog Posts", labelSingular: "Post", supports: ["drafts", "revisions", "preview", "scheduling"]}EmDash prend en charge 15 types de champs qui correspondent aux types de colonnes SQLite :
Saisie de texte court. Correspond à la colonne TEXT.
{ slug: "title", type: "string", label: "Title" }Zone de texte multiligne. Correspond à la colonne TEXT.
{ slug: "excerpt", type: "text", label: "Excerpt" }Champ slug adapté aux URL. Correspond à la colonne TEXT.
{ slug: "handle", type: "slug", label: "URL Handle" }Éditeur de texte enrichi (TipTap/ProseMirror). Stocké en JSON.
{ slug: "content", type: "portableText", label: "Content" }Portable Text est un format basé sur des blocs qui préserve la structure sans intégrer de HTML.
Données JSON arbitraires. Stockées en JSON.
{ slug: "metadata", type: "json", label: "Custom Metadata" }Nombres décimaux. Correspond à la colonne REAL.
{ slug: "price", type: "number", label: "Price" }Nombres entiers. Correspond à la colonne INTEGER.
{ slug: "quantity", type: "integer", label: "Stock Quantity" }Basculer vrai/faux. Correspond à INTEGER (0/1).
{ slug: "featured", type: "boolean", label: "Featured Post" }Sélecteur de date et d’heure. Stocké sous forme de chaîne ISO 8601.
{ slug: "eventDate", type: "datetime", label: "Event Date" }Option unique dans une liste. Correspond à la colonne TEXT.
{ slug: "status", type: "select", label: "Product Status", validation: { options: ["active", "discontinued", "coming_soon"] }}Options multiples dans une liste. Stockées sous forme de tableau JSON.
{ slug: "features", type: "multiSelect", label: "Product Features", validation: { options: ["wireless", "waterproof", "eco-friendly"] }}Sélecteur d’image depuis la bibliothèque multimédia. Stocke l’ID média sous forme TEXT.
{ slug: "featuredImage", type: "image", label: "Featured Image" }Sélecteur de fichier depuis la bibliothèque multimédia. Stocke l’ID média sous forme TEXT.
{ slug: "attachment", type: "file", label: "PDF Attachment" }Référence à une entrée d’une autre collection. Stocke l’ID de l’entrée sous forme TEXT.
{ slug: "author", type: "reference", label: "Author", options: { collection: "authors" }}Chaque champ prend en charge ces propriétés :
| Propriété | Type | Description |
|---|---|---|
slug | string | Nom de la colonne dans la base de données |
label | string | Libellé d’affichage dans l’interface admin |
type | FieldType | Un des 15 types de champs |
required | boolean | Indique si le champ doit avoir une valeur |
unique | boolean | Indique si les valeurs doivent être uniques entre les entrées |
defaultValue | unknown | Valeur par défaut pour les nouvelles entrées |
validation | object | Règles de validation spécifiques au type |
widget | string | Identifiant de widget personnalisé |
options | object | Configuration spécifique au widget |
sortOrder | number | Ordre d’affichage dans l’éditeur |
L’objet validation varie selon le type de champ :
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}Exemple avec validation :
{ 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,}$" }}L’objet options configure le comportement spécifique de l’interface utilisateur du champ :
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}Exemple de champ de référence :
{ slug: "relatedProducts", type: "reference", label: "Related Products", options: { collection: "products", allowMultiple: true }}Utilisez les fonctions de requête fournies pour récupérer du contenu. Elles suivent le modèle des collections dynamiques d’Astro, renvoyant des résultats structurés :
import { getEmDashCollection, getEmDashEntry } from "emdash";
// Obtenir toutes les entrées - renvoie { entries, error }const { entries: posts } = await getEmDashCollection("posts");
// Filtrer par statutconst { entries: drafts } = await getEmDashCollection("posts", { status: "draft",});
// Limiter les résultatsconst { entries: recent } = await getEmDashCollection("posts", { limit: 5,});
// Filtrer par taxonomieconst { entries: newsPosts } = await getEmDashCollection("posts", { where: { category: "news" },});
// Obtenir une entrée unique par slug - renvoie { entry, error, isPreview }const { entry: post } = await getEmDashEntry("posts", "my-post-slug");
// Gérer les erreursconst { entries, error } = await getEmDashCollection("posts");if (error) { console.error("Failed to load posts:", error);}Exécutez npx emdash types pour générer les types TypeScript à partir de votre schéma :
// .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[];}Les types de champs correspondent aux types de colonnes SQLite :
| Type de champ | Type SQLite | Notes |
|---|---|---|
string | TEXT | |
text | TEXT | |
slug | TEXT | |
number | REAL | Virgule flottante 64 bits |
integer | INTEGER | Entier signé 64 bits |
boolean | INTEGER | 0 ou 1 |
datetime | TEXT | Format ISO 8601 |
select | TEXT | |
multiSelect | JSON | Tableau de chaînes |
portableText | JSON | Tableau de blocs |
image | TEXT | ID média |
file | TEXT | ID média |
reference | TEXT | ID d’entrée |
json | JSON | JSON arbitraire |
Modèle de contenu
Comprenez l’approche base de données d’abord.
Taxonomies
Organisez le contenu avec catégories et étiquettes.
Médiathèque
Gérez les images et fichiers.