Ir al contenido

Colecciones y Campos

Las colecciones son la base del modelo de contenido de EmDash. Cada colección representa un tipo de contenido (publicaciones, páginas, productos) y contiene definiciones de campos que determinan la estructura de tus datos.

Crea colecciones a través del panel de administración en Tipos de Contenido. Cada colección tiene:

EmDash content types showing Pages, Posts, and custom collections with their features
PropiedadDescripción
slugIdentificador seguro para URL (ej., posts, products)
labelNombre para mostrar (ej., “Entradas del Blog”)
labelSingularForma singular (ej., “Entrada”)
descriptionDescripción opcional para editores
iconNombre del icono de Lucide para la barra lateral del administrador
supportsFuncionalidades como borradores, revisiones, vista previa, programación, búsqueda, seo

Al crear una colección, activa las características que necesites:

CaracterísticaDescripción
draftsHabilita el flujo de trabajo de borrador/publicado
revisionsRastrea el historial de contenido con instantáneas de versiones
previewGenera URLs de vista previa firmadas para contenido en borrador
schedulingPrograma contenido para publicarse en una fecha futura
// Example collection with all features enabled
{
slug: "posts",
label: "Blog Posts",
labelSingular: "Post",
supports: ["drafts", "revisions", "preview", "scheduling"]
}

EmDash admite 15 tipos de campos que se asignan a tipos de columna SQLite:

Entrada de texto corto. Se asigna a columna TEXT.

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

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.

Números decimales. Se asigna a columna REAL.

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

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

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

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

{
slug: "status",
type: "select",
label: "Estado del Producto",
validation: {
options: ["active", "discontinued", "coming_soon"]
}
}

Selector de imagen desde la biblioteca multimedia. Almacena el ID del medio como TEXT.

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

Cada campo admite estas propiedades:

PropiedadTipoDescripción
slugstringNombre de la columna en la base de datos
labelstringEtiqueta de visualización en la UI de administración
typeFieldTypeUno de los 15 tipos de campo
requiredbooleanSi el campo debe tener un valor
uniquebooleanSi los valores deben ser únicos entre entradas
defaultValueunknownValor por defecto 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

El objeto validation varía según el tipo de campo:

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
}

Ejemplo con validació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,}$"
}
}

El objeto options configura el comportamiento de la UI específico del campo:

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
}

Ejemplo de campo de referencia:

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

Usa las funciones de consulta proporcionadas para obtener contenido. Estas siguen el patrón de colecciones dinámicas de Astro, devolviendo resultados estructurados:

import { getEmDashCollection, getEmDashEntry } from "emdash";
// Obtener todas las entradas - devuelve { entries, error }
const { entries: posts } = await getEmDashCollection("posts");
// Filtrar por estado
const { entries: drafts } = await getEmDashCollection("posts", {
status: "draft",
});
// Limitar resultados
const { entries: recent } = await getEmDashCollection("posts", {
limit: 5,
});
// Filtrar por taxonomía
const { entries: newsPosts } = await getEmDashCollection("posts", {
where: { category: "news" },
});
// Obtener una entrada única por slug - devuelve { entry, error, isPreview }
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");
// Manejar errores
const { entries, error } = await getEmDashCollection("posts");
if (error) {
console.error("Failed to load posts:", error);
}

Ejecuta npx emdash types para generar tipos de TypeScript desde tu esquema:

// .emdash/types.ts (generated)
export interface Post {
title: string;
content: PortableTextBlock[];
excerpt?: string;
featuredImage?: string;
author: string; // reference ID
}
export interface Product {
title: string;
price: number;
description: PortableTextBlock[];
}

Los tipos de campo se mapean a tipos de columna SQLite:

Tipo de CampoTipo SQLiteNotas
stringTEXT
textTEXT
slugTEXT
numberREALPunto flotante 64-bit
integerINTEGEREntero con signo 64-bit
booleanINTEGER0 o 1
datetimeTEXTFormato ISO 8601
selectTEXT
multiSelectJSONArreglo de cadenas
portableTextJSONArreglo de bloques
imageTEXTID de medio
fileTEXTID de medio
referenceTEXTID de entrada
jsonJSONJSON arbitrario