Una collezione è un tipo di contenuto (articoli, pagine, prodotti). Le definizioni dei campi stabiliscono la struttura dei dati di ogni voce.
Creare collezioni
Crea collezioni tramite il pannello di amministrazione sotto Content Types. Ogni collezione ha le seguenti proprietà:
| Proprietà | Descrizione |
|---|---|
slug | Identificatore sicuro per URL (es., posts, products) |
label | Nome visualizzato (es., “Blog Posts”) |
labelSingular | Forma singolare (es., “Post”) |
description | Descrizione opzionale per gli editor |
icon | Nome icona Lucide per la barra laterale admin |
supports | Funzionalità come bozze, revisioni, anteprima, pianificazione, ricerca, seo |
Funzionalità delle collezioni
Quando crei una collezione, abilita le funzionalità di cui hai bisogno:
| Funzionalità | Descrizione |
|---|---|
drafts | Abilitare il flusso di lavoro bozza/pubblicato |
revisions | Tracciare la cronologia del contenuto con istantanee delle versioni |
preview | Generare URL di anteprima firmati per il contenuto in bozza |
scheduling | Pianificare la pubblicazione del contenuto a una data futura |
La seguente collezione abilita tutte e quattro le funzionalità:
{
slug: "posts",
label: "Blog Posts",
labelSingular: "Post",
supports: ["drafts", "revisions", "preview", "scheduling"]
}
Tipi di campo
EmDash supporta 16 tipi di campo che corrispondono ai tipi di colonna SQLite.
Campi di testo
string
Input di testo breve. Corrisponde alla colonna TEXT.
{ slug: "title", type: "string", label: "Title" } text
Area di testo multilinea. Corrisponde alla colonna TEXT.
{ slug: "excerpt", type: "text", label: "Excerpt" } slug
Campo slug sicuro per URL. Corrisponde alla colonna TEXT.
{ slug: "handle", type: "slug", label: "URL Handle" } Contenuto ricco
portableText
Editor di testo ricco (TipTap/ProseMirror). Salvato come JSON.
{ slug: "content", type: "portableText", label: "Content" }Portable Text è un formato basato su blocchi che preserva la struttura senza incorporare HTML.
json
Dati JSON arbitrari. Salvato come JSON.
{ slug: "metadata", type: "json", label: "Custom Metadata" } Numeri
number
Numeri decimali. Corrisponde alla colonna REAL.
{ slug: "price", type: "number", label: "Price" } integer
Numeri interi. Corrisponde alla colonna INTEGER.
{ slug: "quantity", type: "integer", label: "Stock Quantity" } Booleani e date
boolean
Interruttore vero/falso. Corrisponde a INTEGER (0/1).
{ slug: "featured", type: "boolean", label: "Featured Post" } datetime
Selettore di data e ora. Salvato come stringa ISO 8601.
{ slug: "eventDate", type: "datetime", label: "Event Date" } Selezione
select
Opzione singola da una lista. Corrisponde alla colonna TEXT.
{
slug: "status",
type: "select",
label: "Product Status",
validation: {
options: ["active", "discontinued", "coming_soon"]
}
} multiSelect
Opzioni multiple da una lista. Salvato come array JSON.
{
slug: "features",
type: "multiSelect",
label: "Product Features",
validation: {
options: ["wireless", "waterproof", "eco-friendly"]
}
} Media e riferimenti
image
Selettore di immagini dalla libreria multimediale. Salva l’ID del media come TEXT.
{ slug: "featuredImage", type: "image", label: "Featured Image" } file
Selettore di file dalla libreria multimediale. Salva l’ID del media come TEXT.
{ slug: "attachment", type: "file", label: "PDF Attachment" } reference
Riferimento alla voce di un’altra collezione. Salva l’ID della voce come TEXT.
{
slug: "author",
type: "reference",
label: "Author",
options: {
collection: "authors"
}
} Proprietà dei campi
Ogni campo supporta queste proprietà:
| Proprietà | Tipo | Descrizione |
|---|---|---|
slug | string | Nome della colonna nel database |
label | string | Etichetta visualizzata nell’interfaccia admin |
type | FieldType | Uno dei 16 tipi di campo |
required | boolean | Se il campo deve avere un valore |
unique | boolean | Se i valori devono essere unici tra le voci |
indexed | boolean | Consentire ordinamento e filtraggio efficienti per questo campo |
defaultValue | unknown | Valore predefinito per le nuove voci |
validation | object | Regole di validazione specifiche per tipo |
widget | string | Identificatore di widget personalizzato |
options | object | Configurazione specifica per il widget |
sortOrder | number | Ordine di visualizzazione nell’editor |
Imposta indexed: true quando una query di collezione deve utilizzare un campo personalizzato in orderBy o un filtro di campo. Gli indici sono supportati per i campi string, url, number, integer, boolean, datetime, select, reference e slug. EmDash rifiuta i campi JSON indicizzati, il contenuto ricco e altri tipi di campo non scalari.
Regole di validazione
L’oggetto validation varia in base al tipo di campo. La sua forma completa è:
interface FieldValidation {
required?: boolean; // Tutti i tipi
min?: number; // number, integer
max?: number; // number, integer
minLength?: number; // string, text
maxLength?: number; // string, text
pattern?: string; // string (regex)
options?: string[]; // select, multiSelect
}
Il seguente campo richiede un indirizzo email unico e validato tramite pattern:
{
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,}$"
}
}
Opzioni widget
L’oggetto options configura il comportamento UI specifico del campo. La sua forma completa è:
interface FieldWidgetOptions {
rows?: number; // text (righe dell'area di testo)
showPreview?: boolean; // image, file
collection?: string; // reference (collezione di destinazione)
allowMultiple?: boolean; // reference (ref multipli)
[key: string]: unknown; // Opzioni widget personalizzate
}
Il seguente campo di riferimento collega a più prodotti:
{
slug: "relatedProducts",
type: "reference",
label: "Related Products",
options: {
collection: "products",
allowMultiple: true
}
}
Interrogare le collezioni
Usa le funzioni di query fornite per recuperare il contenuto. Queste seguono il pattern delle collezioni live di Astro, restituendo risultati strutturati. L’esempio seguente mostra le opzioni di query comuni:
import { getEmDashCollection, getEmDashEntry } from "emdash";
// Ottenere tutte le voci - restituisce { entries, error }
const { entries: posts } = await getEmDashCollection("posts");
// Filtrare per stato
const { entries: drafts } = await getEmDashCollection("posts", {
status: "draft",
});
// Limitare i risultati
const { entries: recent } = await getEmDashCollection("posts", {
limit: 5,
});
// Filtrare per tassonomia
const { entries: newsPosts } = await getEmDashCollection("posts", {
where: { category: "news" },
});
// Ottenere una voce per slug - restituisce { entry, error, isPreview }
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");
// Gestione degli errori
const { entries, error } = await getEmDashCollection("posts");
if (error) {
console.error("Failed to load posts:", error);
}
Generazione dei tipi
Esegui npx emdash types per generare tipi TypeScript dal tuo schema. Il file generato contiene un’interfaccia per collezione:
export interface Post {
title: string;
content: PortableTextBlock[];
excerpt?: string;
featuredImage?: string;
author: string; // ID di riferimento
}
export interface Product {
title: string;
price: number;
description: PortableTextBlock[];
}
Mappatura del database
I tipi di campo corrispondono ai tipi di colonna SQLite come segue:
| Tipo di campo | Tipo SQLite | Note |
|---|---|---|
string | TEXT | |
text | TEXT | |
slug | TEXT | |
url | TEXT | |
number | REAL | Virgola mobile a 64 bit |
integer | INTEGER | Intero con segno a 64 bit |
boolean | INTEGER | 0 o 1 |
datetime | TEXT | Formato ISO 8601 |
select | TEXT | |
multiSelect | JSON | Array di stringhe |
portableText | JSON | Array di blocchi |
image | TEXT | ID del media |
file | TEXT | ID del media |
reference | TEXT | ID della voce |
json | JSON | JSON arbitrario |
repeater | JSON | Array di sotto-campi |
Prossimi passi
Modello di contenuto
Comprendi il modello di contenuto.
Tassonomie
Organizza i contenuti con categorie e tag.
Libreria multimediale
Gestisci immagini e file.