Une collection est un type de contenu (articles, pages, produits). Ses définitions de champs définissent la structure des données de chaque entrée.
Créer des collections
Créez des collections via le panneau d’administration sous Types de Contenu. Chaque collection possède les propriétés suivantes :
| Propriété | Description |
|---|---|
slug | Identifiant sûr pour 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 d’icône Lucide pour la barre latérale d’administration |
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 workflow brouillon/publié |
revisions | Suivre l’historique du contenu avec des instantanés de version |
preview | Générer des URLs 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 champ
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 URL. Correspond à la colonne TEXT.
{ slug: "handle", type: "slug", label: "URL Handle" } Contenu enrichi
portableText
É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.
json
Données JSON arbitraires. Stockées 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 d’heure. Stocké sous forme de chaîne ISO 8601.
{ slug: "eventDate", type: "datetime", label: "Event Date" } Sélection
select
Option unique d’une liste. Correspond à la colonne TEXT.
{
slug: "status",
type: "select",
label: "Product Status",
validation: {
options: ["active", "discontinued", "coming_soon"]
}
} multiSelect
Plusieurs options d’une liste. Stockées sous forme de 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 de la bibliothèque de médias. Stocke l’ID de média en TEXT.
{ slug: "featuredImage", type: "image", label: "Featured Image" } file
Sélecteur de fichier de la bibliothèque de médias. Stocke l’ID de média en TEXT.
{ slug: "attachment", type: "file", label: "PDF Attachment" } reference
Référence à l’entrée d’une autre collection. Stocke l’ID d’entrée en TEXT.
{
slug: "author",
type: "reference",
label: "Author",
options: {
collection: "authors"
}
} Propriétés de champ
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 | Étiquette d’affichage dans l’interface d’administration |
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 |
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 |
Règles de validation
L’objet validation varie selon le type de champ. Sa forme complète est :
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
}
Le champ suivant nécessite une adresse e-mail unique correspondant à un 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 de l’interface utilisateur spécifique au champ. Sa forme complète est :
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
}
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 du contenu. Elles suivent le modèle de collections en direct d’Astro, renvoyant des résultats structurés. L’exemple suivant montre les options de requête courantes :
import { getEmDashCollection, getEmDashEntry } from "emdash";
// Get all entries - returns { entries, error }
const { entries: posts } = await getEmDashCollection("posts");
// Filter by status
const { entries: drafts } = await getEmDashCollection("posts", {
status: "draft",
});
// Limit results
const { entries: recent } = await getEmDashCollection("posts", {
limit: 5,
});
// Filter by taxonomy
const { entries: newsPosts } = await getEmDashCollection("posts", {
where: { category: "news" },
});
// Get a single entry by slug - returns { entry, error, isPreview }
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");
// Handle errors
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 à partir de 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; // reference ID
}
export interface Product {
title: string;
price: number;
description: PortableTextBlock[];
}
Mappage de 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
Comprendre le modèle de contenu.
Taxonomies
Organiser le contenu avec catégories et tags.
Bibliothèque de Médias
Gérer les images et fichiers.