Una collezione (collection) è un tipo di contenuto (articoli, pagine, prodotti). Le sue definizioni di campo stabiliscono la struttura dei dati di ogni voce.
Creare collezioni
Crea collezioni tramite il pannello di amministrazione in Tipi di Contenuto. Ogni collezione ha le seguenti proprietà:
| Proprietà | Descrizione |
|---|---|
slug | Identificatore sicuro per URL (es., posts, products) |
label | Nome visualizzato (es., “Articoli del Blog”) |
labelSingular | Forma singolare (es., “Articolo”) |
description | Descrizione opzionale per gli editor |
icon | Nome dell’icona Lucide per la barra laterale amministrativa |
supports | Funzionalità come bozze, revisioni, anteprima, pianificazione, ricerca, SEO |
Funzionalità delle collezioni
Durante la creazione di una collezione, abilita le funzionalità necessarie:
| Funzionalità | Descrizione |
|---|---|
drafts | Abilita il flusso di lavoro bozza/pubblicato |
revisions | Traccia la cronologia dei contenuti con snapshot di versione |
preview | Genera URL di anteprima firmati per contenuti in bozza |
scheduling | Pianifica la pubblicazione dei contenuti 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). Memorizzato 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. Memorizzati 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. Memorizzato 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. Memorizzate come array JSON.
{
slug: "features",
type: "multiSelect",
label: "Product Features",
validation: {
options: ["wireless", "waterproof", "eco-friendly"]
}
} Media e riferimenti
image
Selettore di immagine dalla libreria multimediale. Memorizza l’ID media come TEXT.
{ slug: "featuredImage", type: "image", label: "Featured Image" } file
Selettore di file dalla libreria multimediale. Memorizza l’ID media come TEXT.
{ slug: "attachment", type: "file", label: "PDF Attachment" } reference
Riferimento alla voce di un’altra collezione. Memorizza l’ID 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 amministrativa |
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 |
defaultValue | unknown | Valore predefinito per le nuove voci |
validation | object | Regole di validazione specifiche per tipo |
widget | string | Identificatore widget personalizzato |
options | object | Configurazione specifica del widget |
sortOrder | number | Ordine di visualizzazione nell’editor |
Regole di validazione
L’oggetto validation varia in base al tipo di campo. La sua forma completa è:
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
}
Il seguente campo richiede un indirizzo email unico che corrisponda a un 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 dell’interfaccia specifica del campo. La sua forma completa è:
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
}
Il seguente campo di riferimento collega 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 i contenuti. 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";
// 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);
}
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; // reference ID
}
export interface Product {
title: string;
price: number;
description: PortableTextBlock[];
}
Mappatura 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 64 bit |
integer | INTEGER | Intero con segno 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 media |
file | TEXT | ID media |
reference | TEXT | ID voce |
json | JSON | JSON arbitrario |
repeater | JSON | Array di sottocampi |
Prossimi passi
Modello di Contenuto
Comprendi il modello di contenuto.
Tassonomie
Organizza i contenuti con categorie e tag.
Libreria Multimediale
Gestisci immagini e file.