コンテンツモデル

このページ

コンテンツモデルは、サイトが保存するコレクションとフィールドのセットです。管理パネルまたはCLIで定義し、必要に応じて変更し、オプションでTypeScript型を生成できます。このページでは、その使い方を説明します。

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

コレクションはコンテンツの種類です(投稿、製品、著者)。各コレクションには、定義したフィールドがあります(タイトル、本文、価格)。すべてのエントリには、EmDashが管理するシステムフィールドもあります。

コレクションとフィールドは、管理パネルのContent Typesで視覚的に作成・編集するか、CLIで行います。変更は即座に反映され、開発者以外でも実行できます。

システムフィールド

定義したフィールドに加えて、すべてのエントリには次のフィールドが常に存在します:

フィールド目的
id安定した一意の識別子
slugURL安全な識別子、ロケールごとに一意
statusdraftpublished、またはscheduled
author_idエントリを作成したユーザー
created_at / updated_at / published_atタイムスタンプ
deleted_at論理削除時に設定され、行は保持される
version保存ごとに増分

エントリの削除は論理削除です:復元できます。

モデルをいつでも変更

ライブコレクションのフィールドは、管理パネルまたはCLIを通じて、いつでも追加、名前変更、削除、型変更できます。既存のコンテンツは保持されます。

TypeScript型

型生成はオプションですが推奨されます。現在のモデルから型を生成します:

npx emdash types

これにより、コレクションごとにインターフェースと型付きクエリオーバーロードを含む.emdash/types.tsが書き込まれ、getEmDashCollection("posts")は完全に型付けされたエントリを返します:

export interface Post {
	title: string;
	content: PortableTextBlock[];
	excerpt?: string;
}

declare module "emdash" {
	export function getEmDashCollection(
		type: "posts",
	): Promise<{ entries: ContentEntry<Post>[]; error?: Error }>;
}

モデル変更後にコマンドを再実行して、型を同期します。

ワークフロー

両方のワークフローは同じモデルを変更します。

開発者以外は管理パネルを使用します:

  1. 管理パネルでContent Typesを開きます。
  2. Add Collectionをクリックします。
  3. ビジュアルビルダーでフィールドを定義します。
  4. コンテンツの作成を開始します。

開発者はCLIを使用して型を生成し、環境間でモデルを移動できます:

npx emdash types                     # TypeScript型を生成
npx emdash export-seed > seed.json   # モデルをシードファイルとしてエクスポート

シードファイル

シードファイルは、コレクション、タクソノミー、メニューのJSON記述です。テンプレートには1つ付属しており、バージョン管理や別環境のセットアップのために独自のものをエクスポートできます。

{
	"version": "1",
	"collections": [
		{
			"slug": "posts",
			"label": "Blog Posts",
			"labelSingular": "Post",
			"supports": ["drafts", "revisions", "preview"],
			"fields": [
				{ "slug": "title", "type": "string", "required": true },
				{ "slug": "content", "type": "portableText" }
			]
		}
	],
	"taxonomies": [{ "name": "category", "label": "Categories", "hierarchical": true }],
	"menus": [{ "name": "primary", "label": "Primary Navigation" }]
}

シードの適用は冪等なので、再実行しても安全です:

import { applySeed, validateSeed } from "emdash/seed";
import seedData from "./.emdash/seed.json";

const { valid, errors } = validateSeed(seedData);
await applySeed(db, seedData, { includeContent: true, onConflict: "skip" });

完全なスキーマについてはシードファイル形式を参照してください。

次のステップ