Collections et champs

Sur cette page

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 :

Types de contenu EmDash montrant les Pages, Articles et collections personnalisées avec leurs fonctionnalités
PropriétéDescription
slugIdentifiant sûr pour les URL (ex., posts, products)
labelNom d’affichage (ex., “Blog Posts”)
labelSingularForme singulière (ex., “Post”)
descriptionDescription optionnelle pour les éditeurs
iconNom d’icône Lucide pour la barre latérale admin
supportsFonctionnalité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
draftsActiver le flux 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

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éTypeDescription
slugstringNom de colonne dans la base de données
labelstringLibellé d’affichage dans l’interface admin
typeFieldTypeL’un des 16 types de champs
requiredbooleanSi le champ doit avoir une valeur
uniquebooleanSi les valeurs doivent être uniques entre les entrées
indexedbooleanPermettre le tri et le filtrage efficaces par ce champ
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

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 champType SQLiteNotes
stringTEXT
textTEXT
slugTEXT
urlTEXT
numberREALVirgule flottante 64 bits
integerINTEGEREntier signé 64 bits
booleanINTEGER0 ou 1
datetimeTEXTFormat ISO 8601
selectTEXT
multiSelectJSONTableau de chaînes
portableTextJSONTableau de blocs
imageTEXTID de média
fileTEXTID de média
referenceTEXTID d’entrée
jsonJSONJSON arbitraire
repeaterJSONTableau de sous-champs

Prochaines étapes