Collections et Champs

Sur cette page

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 :

Types de contenu EmDash montrant Pages, Articles et collections personnalisées avec leurs fonctionnalités
PropriétéDescription
slugIdentifiant sûr pour URL (ex., posts, products)
labelNom d’affichage (ex., “Articles de Blog”)
labelSingularForme singulière (ex., “Article”)
descriptionDescription optionnelle pour les éditeurs
iconNom d’icône Lucide pour la barre latérale d’administration
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 workflow brouillon/publié
revisionsSuivre l’historique du contenu avec des instantanés de version
previewGénérer des URLs 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 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éTypeDescription
slugstringNom de colonne dans la base de données
labelstringÉtiquette d’affichage dans l’interface d’administration
typeFieldTypeL’un des 16 types de champs
requiredbooleanSi le champ doit avoir une valeur
uniquebooleanSi 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

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