Aller au contenu

Collections & Champs

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 :

EmDash content types showing Pages, Posts, and custom collections with their features
PropriétéDescription
slugIdentifiant adapté aux URL (ex : posts, products)
labelNom d’affichage (ex : “Articles de blog”)
labelSingularForme singulière (ex : “Article”)
descriptionDescription optionnelle pour les éditeurs
iconNom de l’icône Lucide pour la barre latérale d’admin
supportsFonctionnalité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
draftsActiver le flux de travail brouillon/publié
revisionsSuivre l’historique du contenu avec des instantanés de version
previewGénérer des URL d’aperçu signées pour le contenu brouillon
schedulingPlanifier 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" }

É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.

Nombres décimaux. Correspond à la colonne REAL.

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

Basculer vrai/faux. Correspond à INTEGER (0/1).

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

Option unique dans une liste. Correspond à la colonne TEXT.

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

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

Chaque champ prend en charge ces propriétés :

PropriétéTypeDescription
slugstringNom de la colonne dans la base de données
labelstringLibellé d’affichage dans l’interface admin
typeFieldTypeUn des 15 types de champs
requiredbooleanIndique si le champ doit avoir une valeur
uniquebooleanIndique si les valeurs doivent être uniques entre les entrées
defaultValueunknownValeur par défaut pour les nouvelles entrées
validationobjectRègles de validation spécifiques au type
widgetstringIdentifiant de widget personnalisé
optionsobjectConfiguration spécifique au widget
sortOrdernumberOrdre 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 statut
const { entries: drafts } = await getEmDashCollection("posts", {
status: "draft",
});
// Limiter les résultats
const { entries: recent } = await getEmDashCollection("posts", {
limit: 5,
});
// Filtrer par taxonomie
const { 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 erreurs
const { 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 champType SQLiteNotes
stringTEXT
textTEXT
slugTEXT
numberREALVirgule flottante 64 bits
integerINTEGEREntier signé 64 bits
booleanINTEGER0 ou 1
datetimeTEXTFormat ISO 8601
selectTEXT
multiSelectJSONTableau de chaînes
portableTextJSONTableau de blocs
imageTEXTID média
fileTEXTID média
referenceTEXTID d’entrée
jsonJSONJSON arbitraire