Une collection est un type de contenu (articles, pages, produits). Ses définitions de champs déterminent la structure des données de chaque entrée.
Créer des collections
Créez des collections via le panneau d’administration sous Content Types. Chaque collection possède les propriétés suivantes :
| Propriété | Description |
|---|---|
slug | Identifiant sûr pour les URL (ex., posts, products) |
label | Nom d’affichage (ex., “Blog Posts”) |
labelSingular | Forme singulière (ex., “Post”) |
description | Description optionnelle pour les éditeurs |
icon | Nom d’icône Lucide pour la barre latérale admin |
supports | Fonctionnalités comme brouillons, révisions, aperçu, planification, recherche, seo |
Fonctionnalités de collection
Lors de la création d’une collection, activez les fonctionnalités dont vous avez besoin :
| Fonctionnalité | Description |
|---|---|
drafts | Activer le flux 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 |
La collection suivante active les quatre fonctionnalités :
{
slug: "posts",
label: "Blog Posts",
labelSingular: "Post",
supports: ["drafts", "revisions", "preview", "scheduling"]
}
Types de champs
EmDash prend en charge 16 types de champs qui correspondent aux types de colonnes SQLite.
Champs texte
string
Saisie de texte court. Correspond à la colonne TEXT.
{ slug: "title", type: "string", label: "Title" } text
Zone de texte multiligne. Correspond à la colonne TEXT.
{ slug: "excerpt", type: "text", label: "Excerpt" } slug
Champ slug sûr pour les URL. Correspond à la colonne TEXT.
{ slug: "handle", type: "slug", label: "URL Handle" } Contenu riche
portableText
Éditeur de texte riche (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.
json
Données JSON arbitraires. Stocké en JSON.
{ slug: "metadata", type: "json", label: "Custom Metadata" } Nombres
number
Nombres décimaux. Correspond à la colonne REAL.
{ slug: "price", type: "number", label: "Price" } integer
Nombres entiers. Correspond à la colonne INTEGER.
{ slug: "quantity", type: "integer", label: "Stock Quantity" } Booléens et dates
boolean
Interrupteur vrai/faux. Correspond à INTEGER (0/1).
{ slug: "featured", type: "boolean", label: "Featured Post" } datetime
Sélecteur de date et heure. Stocké en chaîne ISO 8601.
{ slug: "eventDate", type: "datetime", label: "Event Date" } Sélection
select
Option unique depuis une liste. Correspond à la colonne TEXT.
{
slug: "status",
type: "select",
label: "Product Status",
validation: {
options: ["active", "discontinued", "coming_soon"]
}
} multiSelect
Options multiples depuis une liste. Stocké en tableau JSON.
{
slug: "features",
type: "multiSelect",
label: "Product Features",
validation: {
options: ["wireless", "waterproof", "eco-friendly"]
}
} Médias et références
image
Sélecteur d’image depuis la bibliothèque de médias. Stocke l’ID du média en TEXT.
{ slug: "featuredImage", type: "image", label: "Featured Image" } file
Sélecteur de fichier depuis la bibliothèque de médias. Stocke l’ID du média en TEXT.
{ slug: "attachment", type: "file", label: "PDF Attachment" } reference
Référence vers l’entrée d’une autre collection. Stocke l’ID de l’entrée en TEXT.
{
slug: "author",
type: "reference",
label: "Author",
options: {
collection: "authors"
}
} Propriétés des champs
Chaque champ prend en charge ces propriétés :
| Propriété | Type | Description |
|---|---|---|
slug | string | Nom de colonne dans la base de données |
label | string | Libellé d’affichage dans l’interface admin |
type | FieldType | L’un des 16 types de champs |
required | boolean | Si le champ doit avoir une valeur |
unique | boolean | Si les valeurs doivent être uniques entre les entrées |
indexed | boolean | Permettre le tri et le filtrage efficaces par ce champ |
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 |
Définissez indexed: true lorsqu’une requête de collection doit utiliser un champ personnalisé dans orderBy ou un filtre de champ. Les index sont pris en charge pour les champs string, url, number, integer, boolean, datetime, select, reference et slug. EmDash rejette les champs JSON indexés, le contenu riche et les autres types de champs non scalaires.
Règles de validation
L’objet validation varie selon le type de champ. Sa forme complète est :
interface FieldValidation {
required?: boolean; // Tous les 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
}
Le champ suivant nécessite une adresse e-mail unique et validée par motif :
{
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,}$"
}
}
Options de widget
L’objet options configure le comportement UI spécifique au champ. Sa forme complète est :
interface FieldWidgetOptions {
rows?: number; // text (lignes de zone de texte)
showPreview?: boolean; // image, file
collection?: string; // reference (collection cible)
allowMultiple?: boolean; // reference (refs multiples)
[key: string]: unknown; // Options de widget personnalisées
}
Le champ de référence suivant lie à plusieurs produits :
{
slug: "relatedProducts",
type: "reference",
label: "Related Products",
options: {
collection: "products",
allowMultiple: true
}
}
Interroger les collections
Utilisez les fonctions de requête fournies pour récupérer le contenu. Celles-ci suivent le modèle de collections en direct d’Astro, retournant des résultats structurés. L’exemple suivant montre les options de requête courantes :
import { getEmDashCollection, getEmDashEntry } from "emdash";
// Obtenir toutes les entrées - retourne { 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 par slug - retourne { entry, error, isPreview }
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");
// Gestion des erreurs
const { entries, error } = await getEmDashCollection("posts");
if (error) {
console.error("Failed to load posts:", error);
}
Génération de types
Exécutez npx emdash types pour générer des types TypeScript depuis votre schéma. Le fichier généré contient une interface par collection :
export interface Post {
title: string;
content: PortableTextBlock[];
excerpt?: string;
featuredImage?: string;
author: string; // ID de référence
}
export interface Product {
title: string;
price: number;
description: PortableTextBlock[];
}
Correspondance base de données
Les types de champs correspondent aux types de colonnes SQLite comme suit :
| Type de champ | Type SQLite | Notes |
|---|---|---|
string | TEXT | |
text | TEXT | |
slug | TEXT | |
url | 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 de média |
file | TEXT | ID de média |
reference | TEXT | ID d’entrée |
json | JSON | JSON arbitraire |
repeater | JSON | Tableau de sous-champs |
Prochaines étapes
Modèle de contenu
Comprenez le modèle de contenu.
Taxonomies
Organisez le contenu avec les catégories et tags.
Bibliothèque de médias
Gérez les images et fichiers.