Colecciones y Campos

En esta página

Una colección (collection) es un tipo de contenido (publicaciones, páginas, productos). Sus definiciones de campo establecen la estructura de los datos de cada entrada.

Crear colecciones

Cree colecciones a través del panel de administración en Tipos de Contenido. Cada colección tiene las siguientes propiedades:

Tipos de contenido de EmDash mostrando Páginas, Publicaciones y colecciones personalizadas con sus características
PropiedadDescripción
slugIdentificador seguro para URL (ej., posts, products)
labelNombre para mostrar (ej., “Publicaciones del Blog”)
labelSingularForma singular (ej., “Publicación”)
descriptionDescripción opcional para editores
iconNombre del icono Lucide para la barra lateral de administración
supportsCaracterísticas como borradores, revisiones, vista previa, programación, búsqueda, SEO

Características de colección

Al crear una colección, habilite las características que necesite:

CaracterísticaDescripción
draftsHabilitar flujo de trabajo borrador/publicado
revisionsRastrear historial de contenido con instantáneas de versión
previewGenerar URLs de vista previa firmadas para contenido borrador
schedulingProgramar contenido para publicar en una fecha futura

La siguiente colección habilita las cuatro características:

{
  slug: "posts",
  label: "Blog Posts",
  labelSingular: "Post",
  supports: ["drafts", "revisions", "preview", "scheduling"]
}

Tipos de campo

EmDash admite 16 tipos de campo que se asignan a tipos de columna SQLite.

Campos de texto

string

Entrada de texto corto. Se asigna a columna TEXT.

{ slug: "title", type: "string", label: "Title" }

text

Área de texto multilínea. Se asigna a columna TEXT.

{ slug: "excerpt", type: "text", label: "Excerpt" }

slug

Campo slug seguro para URL. Se asigna a columna TEXT.

{ slug: "handle", type: "slug", label: "URL Handle" }

Contenido enriquecido

portableText

Editor de texto enriquecido (TipTap/ProseMirror). Almacenado como JSON.

{ slug: "content", type: "portableText", label: "Content" }

Portable Text es un formato basado en bloques que preserva la estructura sin incrustar HTML.

json

Datos JSON arbitrarios. Almacenado como JSON.

{ slug: "metadata", type: "json", label: "Custom Metadata" }

Números

number

Números decimales. Se asigna a columna REAL.

{ slug: "price", type: "number", label: "Price" }

integer

Números enteros. Se asigna a columna INTEGER.

{ slug: "quantity", type: "integer", label: "Stock Quantity" }

Booleanos y fechas

boolean

Interruptor verdadero/falso. Se asigna a INTEGER (0/1).

{ slug: "featured", type: "boolean", label: "Featured Post" }

datetime

Selector de fecha y hora. Almacenado como cadena ISO 8601.

{ slug: "eventDate", type: "datetime", label: "Event Date" }

Selección

select

Opción única de una lista. Se asigna a columna TEXT.

{
  slug: "status",
  type: "select",
  label: "Product Status",
  validation: {
    options: ["active", "discontinued", "coming_soon"]
  }
}

multiSelect

Múltiples opciones de una lista. Almacenado como array JSON.

{
  slug: "features",
  type: "multiSelect",
  label: "Product Features",
  validation: {
    options: ["wireless", "waterproof", "eco-friendly"]
  }
}

Medios y referencias

image

Selector de imagen de la biblioteca de medios. Almacena ID de medio como TEXT.

{ slug: "featuredImage", type: "image", label: "Featured Image" }

file

Selector de archivo de la biblioteca de medios. Almacena ID de medio como TEXT.

{ slug: "attachment", type: "file", label: "PDF Attachment" }

reference

Referencia a la entrada de otra colección. Almacena ID de entrada como TEXT.

{
  slug: "author",
  type: "reference",
  label: "Author",
  options: {
    collection: "authors"
  }
}

Propiedades de campo

Cada campo admite estas propiedades:

PropiedadTipoDescripción
slugstringNombre de columna en la base de datos
labelstringEtiqueta de visualización en la interfaz de administración
typeFieldTypeUno de los 16 tipos de campo
requiredbooleanSi el campo debe tener un valor
uniquebooleanSi los valores deben ser únicos entre entradas
defaultValueunknownValor predeterminado para nuevas entradas
validationobjectReglas de validación específicas del tipo
widgetstringIdentificador de widget personalizado
optionsobjectConfiguración específica del widget
sortOrdernumberOrden de visualización en el editor

Reglas de validación

El objeto validation varía según el tipo de campo. Su forma completa es:

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
}

El siguiente campo requiere una dirección de correo electrónico única que coincida con un patrón:

{
  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,}$"
  }
}

Opciones de widget

El objeto options configura el comportamiento de la interfaz específico del campo. Su forma completa es:

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
}

El siguiente campo de referencia vincula múltiples productos:

{
  slug: "relatedProducts",
  type: "reference",
  label: "Related Products",
  options: {
    collection: "products",
    allowMultiple: true
  }
}

Consultar colecciones

Use las funciones de consulta proporcionadas para obtener contenido. Estas siguen el patrón de colecciones en vivo de Astro, devolviendo resultados estructurados. El siguiente ejemplo muestra las opciones de consulta comunes:

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);
}

Generación de tipos

Ejecute npx emdash types para generar tipos TypeScript desde su esquema. El archivo generado contiene una interfaz por colección:

export interface Post {
	title: string;
	content: PortableTextBlock[];
	excerpt?: string;
	featuredImage?: string;
	author: string; // reference ID
}

export interface Product {
	title: string;
	price: number;
	description: PortableTextBlock[];
}

Mapeo de base de datos

Los tipos de campo se asignan a tipos de columna SQLite de la siguiente manera:

Tipo de CampoTipo SQLiteNotas
stringTEXT
textTEXT
slugTEXT
urlTEXT
numberREALPunto flotante de 64 bits
integerINTEGEREntero con signo de 64 bits
booleanINTEGER0 o 1
datetimeTEXTFormato ISO 8601
selectTEXT
multiSelectJSONArray de cadenas
portableTextJSONArray de bloques
imageTEXTID de medio
fileTEXTID de medio
referenceTEXTID de entrada
jsonJSONJSON arbitrario
repeaterJSONArray de subcampos

Próximos pasos