Collezioni e campi

In questa pagina

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

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., “Blog Posts”)
labelSingularForma singolare (es., “Post”)
descriptionDescrizione opzionale per gli editor
iconNome icona Lucide per la barra laterale admin
supportsFunzionalità come bozze, revisioni, anteprima, pianificazione, ricerca, seo

Funzionalità delle collezioni

Quando crei una collezione, abilita le funzionalità di cui hai bisogno:

FunzionalitàDescrizione
draftsAbilitare il flusso di lavoro bozza/pubblicato
revisionsTracciare la cronologia del contenuto con istantanee delle versioni
previewGenerare URL di anteprima firmati per il contenuto in bozza
schedulingPianificare 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àTipoDescrizione
slugstringNome della colonna nel database
labelstringEtichetta visualizzata nell’interfaccia admin
typeFieldTypeUno dei 16 tipi di campo
requiredbooleanSe il campo deve avere un valore
uniquebooleanSe i valori devono essere unici tra le voci
indexedbooleanConsentire ordinamento e filtraggio efficienti per questo campo
defaultValueunknownValore predefinito per le nuove voci
validationobjectRegole di validazione specifiche per tipo
widgetstringIdentificatore di widget personalizzato
optionsobjectConfigurazione specifica per il widget
sortOrdernumberOrdine 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 campoTipo SQLiteNote
stringTEXT
textTEXT
slugTEXT
urlTEXT
numberREALVirgola mobile a 64 bit
integerINTEGERIntero con segno a 64 bit
booleanINTEGER0 o 1
datetimeTEXTFormato ISO 8601
selectTEXT
multiSelectJSONArray di stringhe
portableTextJSONArray di blocchi
imageTEXTID del media
fileTEXTID del media
referenceTEXTID della voce
jsonJSONJSON arbitrario
repeaterJSONArray di sotto-campi

Prossimi passi