コンテンツにスキップ

コレクションとフィールド

コレクションはEmDashのコンテンツモデルの基盤です。各コレクションはコンテンツタイプ(投稿、ページ、商品)を表し、データの構造を決定するフィールド定義を含みます。

コンテンツタイプの下にある管理パネルからコレクションを作成します。各コレクションには以下が含まれます:

EmDash content types showing Pages, Posts, and custom collections with their features
プロパティ説明
slugURLセーフな識別子(例:posts、products)
label表示名(例:“ブログ投稿”)
labelSingular単数形(例:“投稿”)
description編集者向けのオプションの説明
icon管理サイドバー用のLucideアイコン名
supports下書き、リビジョン、プレビュー、スケジューリング、検索、SEOなどの機能

コレクション作成時に必要な機能を有効にします:

機能説明
drafts下書き/公開ワークフローを有効化
revisionsバージョンスナップショットでコンテンツ履歴を追跡
preview下書きコンテンツ用の署名付きプレビューURLを生成
scheduling将来の日時にコンテンツを公開するようにスケジュール
// Example collection with all features enabled
{
slug: "posts",
label: "Blog Posts",
labelSingular: "Post",
supports: ["drafts", "revisions", "preview", "scheduling"]
}

EmDashはSQLiteのカラムタイプにマッピングする15のフィールドタイプをサポートしています:

短いテキスト入力。TEXTカラムにマッピングされます。

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

リッチテキストエディター(TipTap/ProseMirror)。JSONとして保存されます。

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

Portable Textは、HTMLを埋め込まずに構造を保持するブロックベースのフォーマットです。

10進数。REALカラムにマッピングされます。

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

真/偽のトグル。INTEGER(0/1)にマッピングされます。

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

リストからの単一オプション。TEXTカラムにマッピングされます。

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

メディアライブラリからの画像ピッカー。メディアIDをTEXTとして保存します。

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

すべてのフィールドは以下のプロパティをサポートしています:

プロパティタイプ説明
slugstringデータベース内のカラム名
labelstring管理UIでの表示ラベル
typeFieldType15のフィールドタイプのいずれか
requiredbooleanフィールドに値が必要かどうか
uniquebooleanエントリー間で値が一意である必要があるかどうか
defaultValueunknown新規エントリーのデフォルト値
validationobjectタイプ固有の検証ルール
widgetstringカスタムウィジェット識別子
optionsobjectウィジェット固有の設定
sortOrdernumberエディターでの表示順序

validationオブジェクトはフィールドタイプによって異なります:

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
}

検証の例:

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

optionsオブジェクトはフィールド固有のUI動作を設定します:

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
}

参照フィールドの例:

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

提供されたクエリ関数を使用してコンテンツを取得します。これらはAstroのライブコレクションパターンに従い、構造化された結果を返します:

import { getEmDashCollection, getEmDashEntry } from "emdash";
// すべてのエントリーを取得 - { entries, error }を返します
const { entries: posts } = await getEmDashCollection("posts");
// ステータスでフィルタリング
const { entries: drafts } = await getEmDashCollection("posts", {
status: "draft",
});
// 結果を制限する
const { entries: recent } = await getEmDashCollection("posts", {
limit: 5,
});
// タクソノミーでフィルタリングする
const { entries: newsPosts } = await getEmDashCollection("posts", {
where: { category: "news" },
});
// スラッグで単一エントリーを取得する - { entry, error, isPreview } を返す
const { entry: post } = await getEmDashEntry("posts", "my-post-slug");
// エラーを処理する
const { entries, error } = await getEmDashCollection("posts");
if (error) {
console.error("Failed to load posts:", error);
}

スキーマからTypeScript型を生成するには npx emdash types を実行します:

// .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[];
}

フィールドタイプはSQLiteカラムタイプにマッピングされます:

フィールドタイプSQLiteタイプ備考
stringTEXT
textTEXT
slugTEXT
numberREAL64ビット浮動小数点数
integerINTEGER64ビット符号付き整数
booleanINTEGER0 または 1
datetimeTEXTISO 8601形式
selectTEXT
multiSelectJSON文字列の配列
portableTextJSONブロック配列
imageTEXTメディアID
fileTEXTメディアID
referenceTEXTエントリーID
jsonJSON任意のJSON