Collezioni e Campi

In questa pagina

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

Tipi di contenuto EmDash che mostrano Pagine, Articoli e collezioni personalizzate con le loro funzionalità
ProprietàDescrizione
slugIdentificatore sicuro per URL (es., posts, products)
labelNome visualizzato (es., “Articoli del Blog”)
labelSingularForma singolare (es., “Articolo”)
descriptionDescrizione opzionale per gli editor
iconNome dell’icona Lucide per la barra laterale amministrativa
supportsFunzionalità come bozze, revisioni, anteprima, pianificazione, ricerca, SEO

Funzionalità delle collezioni

Durante la creazione di una collezione, abilita le funzionalità necessarie:

FunzionalitàDescrizione
draftsAbilita il flusso di lavoro bozza/pubblicato
revisionsTraccia la cronologia dei contenuti con snapshot di versione
previewGenera URL di anteprima firmati per contenuti in bozza
schedulingPianifica 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àTipoDescrizione
slugstringNome della colonna nel database
labelstringEtichetta visualizzata nell’interfaccia amministrativa
typeFieldTypeUno dei 16 tipi di campo
requiredbooleanSe il campo deve avere un valore
uniquebooleanSe i valori devono essere unici tra le voci
defaultValueunknownValore predefinito per le nuove voci
validationobjectRegole di validazione specifiche per tipo
widgetstringIdentificatore widget personalizzato
optionsobjectConfigurazione specifica del widget
sortOrdernumberOrdine 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 CampoTipo SQLiteNote
stringTEXT
textTEXT
slugTEXT
urlTEXT
numberREALVirgola mobile 64 bit
integerINTEGERIntero con segno 64 bit
booleanINTEGER0 o 1
datetimeTEXTFormato ISO 8601
selectTEXT
multiSelectJSONArray di stringhe
portableTextJSONArray di blocchi
imageTEXTID media
fileTEXTID media
referenceTEXTID voce
jsonJSONJSON arbitrario
repeaterJSONArray di sottocampi

Prossimi passi