Pular para o conteúdo

Coleções e Campos

As coleções são a base do modelo de conteúdo do EmDash. Cada coleção representa um tipo de conteúdo (posts, páginas, produtos) e contém definições de campos que determinam a estrutura dos seus dados.

Crie coleções através do painel administrativo em Tipos de Conteúdo. Cada coleção possui:

EmDash content types showing Pages, Posts, and custom collections with their features
PropriedadeDescrição
slugIdentificador seguro para URL (ex.: posts, products)
labelNome de exibição (ex.: “Blog Posts”)
labelSingularForma singular (ex.: “Post”)
descriptionDescrição opcional para editores
iconNome do ícone Lucide para a barra lateral administrativa
supportsRecursos como rascunhos, revisões, pré-visualização, agendamento, busca, seo

Ao criar uma coleção, habilite os recursos que você precisa:

RecursoDescrição
draftsHabilita o fluxo de trabalho rascunho/publicado
revisionsRastreia o histórico de conteúdo com snapshots de versão
previewGera URLs de pré-visualização assinadas para conteúdo em rascunho
schedulingAgenda conteúdo para publicação em uma data futura
// Example collection with all features enabled
{
slug: "posts",
label: "Blog Posts",
labelSingular: "Post",
supports: ["drafts", "revisions", "preview", "scheduling"]
}

O EmDash suporta 15 tipos de campo que mapeiam para tipos de coluna SQLite:

Entrada de texto curto. Mapeia para coluna TEXT.

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

Editor de texto rico (TipTap/ProseMirror). Armazenado como JSON.

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

Portable Text é um formato baseado em blocos que preserva a estrutura sem incorporar HTML.

Números decimais. Mapeia para coluna REAL.

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

Alternador verdadeiro/falso. Mapeia para INTEGER (0/1).

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

Opção única de uma lista. Mapeia para coluna TEXT.

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

Seletor de imagem da biblioteca de mídia. Armazena ID da mídia como TEXT.

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

Cada campo suporta estas propriedades:

PropriedadeTipoDescrição
slugstringNome da coluna no banco de dados
labelstringRótulo de exibição na interface administrativa
typeFieldTypeUm dos 15 tipos de campo
requiredbooleanSe o campo deve ter um valor
uniquebooleanSe os valores devem ser únicos entre as entradas
defaultValueunknownValor padrão para novas entradas
validationobjectRegras de validação específicas do tipo
widgetstringIdentificador de widget personalizado
optionsobjectConfiguração específica do widget
sortOrdernumberOrdem de exibição no editor

O objeto validation varia de acordo com o 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
}

Exemplo com validação:

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

O objeto options configura o comportamento específico da interface do 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
}

Exemplo de campo de referência:

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

Use as funções de consulta fornecidas para buscar conteúdo. Elas seguem o padrão de coleções ao vivo do Astro, retornando resultados estruturados:

import { getEmDashCollection, getEmDashEntry } from "emdash";
// Obtém todas as entradas - retorna { entries, error }
const { entries: posts } = await getEmDashCollection("posts");
// Filtra por status
const { entries: drafts } = await getEmDashCollection("posts", {
status: "draft",
});
// Limitar resultados
const { entries: recent } = await getEmDashCollection("posts", {
limit: 5,
});
// Filtrar por taxonomia
const { entries: newsPosts } = await getEmDashCollection("posts", {
where: { category: "news" },
});
// Obter uma entrada única por slug - retorna { entry, error, isPreview }
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");
// Lidar com erros
const { entries, error } = await getEmDashCollection("posts");
if (error) {
console.error("Failed to load posts:", error);
}

Execute npx emdash types para gerar tipos TypeScript a partir do seu 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[];
}

Os tipos de campo mapeiam para tipos de coluna SQLite:

Tipo de CampoTipo SQLiteNotas
stringTEXT
textTEXT
slugTEXT
numberREALPonto flutuante 64-bit
integerINTEGERInteiro com sinal 64-bit
booleanINTEGER0 ou 1
datetimeTEXTFormato ISO 8601
selectTEXT
multiSelectJSONArray de strings
portableTextJSONArray de blocos
imageTEXTID da mídia
fileTEXTID da mídia
referenceTEXTID da entrada
jsonJSONJSON arbitrário