このサイトは非公式の日本語訳です。Cloudflare・EmDashプロジェクトが運営するサイトではありません。

このページで分かること

  • Field Kitの役割(json フィールドに4つの入力ウィジェットを追加する公式のネイティブ型プラグイン)とインストール方法
  • 4つのウィジェット(object-formlistgridtags)の用途・保存される値・設定項目と、サブフィールド、要約のテンプレート
  • プラグインを外しても保存したデータが残ること
難易度
実践
読む時間
5分
このページの目次

EmDashの json フィールド型は、任意の構造化データを保存します。標準の編集欄は、生のJSONを入力する1行の入力欄です。Field Kitは、公式のネイティブ型プラグインで、シードファイルのフィールドの options で設定する4つのウィジェットを追加します。

インストール

npmからパッケージをインストールします。

npm i @emdash-cms/plugin-field-kit

fieldKitPlugin をインポートして呼び出し、その結果を plugins: [] に追加します。

astro.config.mjs
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
import { fieldKitPlugin } from "@emdash-cms/plugin-field-kit";

export default defineConfig({
	integrations: [
		emdash({
			plugins: [fieldKitPlugin()],
		}),
	],
});

widgetfield-kit:<name> に設定すると、どの json フィールドにもウィジェットを付けられます。次のフィールド定義は list ウィジェットを使います。

{
	"slug": "ingredients",
	"type": "json",
	"widget": "field-kit:list",
	"options": {
		"fields": [{ "key": "name", "label": "Name", "type": "text", "required": true }]
	}
}
本サイトの補足 やさしい解説

WordPressでいえば、カスタムフィールドの入力欄を、ただのテキスト欄から専用のフォームに変えるような役割です。EmDashの json フィールドは、何も設定しないとJSONをそのまま打ち込む1行の欄になります。Field Kitを入れて、シードファイルのフィールド定義に widgetoptions を書くと、項目ごとの入力欄や、行を追加できる一覧などで入力できるようになります。保存されるのはふつうのJSONなので、あとでプラグインを外してもデータは残ります。

ウィジェット

ウィジェット 用途 保存される値
object-form フラットなJSONオブジェクト用のインラインのフォーム { key: value, ... }
list 追加・削除・並べ替えができる、順序付きの配列の編集欄 [{ ... }, ...]
grid 行×列のマトリクス { rowKey: { colKey: value } }
tags 自由に入力できるチップ/タグの入力欄 ["tag1", "tag2"]

ウィジェットに必須の options(例:object-formlistfieldsgridrowscolumns)が欠けている場合、編集画面には壊れた入力欄ではなく、インラインで「Widget misconfigured」という警告が表示されます。シードのスキーマを試行錯誤している間に役立ちます。

object-form

型を持つサブフィールドのまとまりを表示し、1つのJSONオブジェクトとして保存します。栄養成分表示や連絡先のように、形の決まった構造化データに向いています。次のフィールド定義は、栄養成分のオブジェクトを設定します。

{
	"slug": "nutrition",
	"type": "json",
	"widget": "field-kit:object-form",
	"options": {
		"collapsed": false,
		"fields": [
			{ "key": "calories", "label": "Calories", "type": "number", "suffix": "kcal" },
			{ "key": "protein", "label": "Protein", "type": "number", "suffix": "g" },
			{ "key": "fat", "label": "Fat", "type": "number", "suffix": "g" },
			{ "key": "carbs", "label": "Carbs", "type": "number", "suffix": "g" }
		]
	}
}

保存される値:{ "calories": 250, "protein": 12.5, "fat": 8, "carbs": 30 }

オプション 初期値 説明
fields SubFieldDef[] (必須) サブフィールドの定義。サブフィールドを参照。
collapsed boolean false まとまりを最初から折りたたんだ状態で表示します。
helpText string ウィジェットの下に表示するヘルプテキスト。

list

追加・削除・並べ替えの操作ができる、順序付きの配列の編集欄です。各行はJSONオブジェクトで、その形は fields で定義します。行の見出しには、Mustache形式のテンプレートから作った要約が表示されます。次のフィールド定義は、材料の一覧を設定します。

{
	"slug": "ingredients",
	"type": "json",
	"widget": "field-kit:list",
	"options": {
		"itemLabel": "Ingredient",
		"min": 1,
		"max": 50,
		"sortable": true,
		"summary": "{{name}} — {{amount}}",
		"fields": [
			{ "key": "name", "label": "Name", "type": "text", "required": true },
			{ "key": "amount", "label": "Amount", "type": "text" },
			{ "key": "optional", "label": "Optional", "type": "boolean" }
		]
	}
}

保存される値は、行のオブジェクトの配列です。

[
	{ "name": "Flour", "amount": "500g", "optional": false },
	{ "name": "Butter", "amount": "200g", "optional": false }
]
オプション 初期値 説明
fields SubFieldDef[] (必須) 各行のサブフィールドの定義。
itemLabel string "Item" 1行を表す単数形のラベル(「Add」ボタンと、代わりに使う行のタイトルで使われます)。
min number 項目の最小数。この数を下回ると、削除ボタンが非表示になります。
max number 項目の最大数。この数に達すると、追加ボタンが非表示になります。
sortable boolean true 上下に並べ替えるボタンを表示します。
summary string 折りたたんだ行のタイトルとして描画するMustacheのテンプレート。要約のテンプレートを参照。
helpText string ウィジェットの下に表示するヘルプテキスト。

grid

行×列の2次元のマトリクスです。各セルは、トグル、テキストの入力欄、数値の入力欄、選択欄のいずれかにできます。季節ごとの入手可否、価格表、機能の比較のようなマトリクスに役立ちます。次のフィールド定義は、季節ごとの入手可否のグリッドを設定します。

{
	"slug": "availability",
	"type": "json",
	"widget": "field-kit:grid",
	"options": {
		"cell": "toggle",
		"rows": [
			{ "key": "berries", "label": "Berries" },
			{ "key": "stoneFruit", "label": "Stone fruit" },
			{ "key": "citrus", "label": "Citrus" }
		],
		"columns": [
			{ "key": "spring", "label": "Spring" },
			{ "key": "summer", "label": "Summer" },
			{ "key": "autumn", "label": "Autumn" },
			{ "key": "winter", "label": "Winter" }
		]
	}
}

保存される値は、行、次に列をキーにしたオブジェクトです。

{
	"berries": { "spring": false, "summer": true, "autumn": false, "winter": false },
	"stoneFruit": { "spring": false, "summer": true, "autumn": true, "winter": false },
	"citrus": { "spring": false, "summer": false, "autumn": true, "winter": true }
}
オプション 初期値 説明
rows GridAxisDef[] (必須) 行の定義:{ key, label, image? }
columns GridAxisDef[] (必須) 列の定義:{ key, label, image? }
cell "toggle" | "text" | "number" | "select" "toggle" セルの入力の種類。すべてのセルに同じ種類が適用されます。
cellOptions string[] | Array<{ label, value }> [] cell"select" の場合は必須です。
helpText string ウィジェットの下に表示するヘルプテキスト。

tags

文字列の配列を入力する、チップ形式の入力欄です。決まった suggestions の一覧、自由に入力する独自の値(有効・無効を切り替えられます)、大文字・小文字の変換、任意の max に対応しています。次のフィールド定義は、キーワードのタグの入力欄を設定します。

{
	"slug": "keywords",
	"type": "json",
	"widget": "field-kit:tags",
	"options": {
		"placeholder": "Add a keyword…",
		"max": 10,
		"transform": "lowercase",
		"allowCustom": true,
		"suggestions": ["vegan", "vegetarian", "gluten-free", "dairy-free", "nut-free"]
	}
}

保存される値:["vegan", "gluten-free"]

<kbd>Enter</kbd>または , を押すと、タグが確定します。入力欄が空のときに<kbd>Backspace</kbd>を押すと、最後のタグが削除されます。重複するタグは、何も表示せずに無視されます。

オプション 初期値 説明
placeholder string "Add..." タグがないときに表示する入力欄のプレースホルダー。
max number タグの最大数。上限に達すると入力欄が非表示になります。
suggestions string[] [] <datalist> で表示する入力補完の候補。
allowCustom boolean true false の場合、suggestions にある値だけを追加できます。
transform "none" | "lowercase" | "uppercase" | "trim" "none" 追加するときにタグを正規化します。
helpText string ウィジェットの下に表示するヘルプテキスト。

サブフィールド

object-formlist は、型を持つサブフィールドの定義の配列を options.fields で受け付けます。各項目は、key(書き込み先のJSONオブジェクトのキー)、labeltype と、型ごとの追加の項目を持ちます。

サブフィールドの型 表示される形 主な追加の項目
text 1行の入力欄 placeholder
textarea 複数行の入力欄 rows(初期値 3)、placeholder
number 数値の入力欄 minmaxstepprefixsuffixplaceholder
boolean トグルスイッチ
select ドロップダウン options: string[] | Array<{ label, value }>placeholder
date 日付の入力欄
color ブラウザー標準のカラーピッカーと、16進数のテキストの入力欄の組み合わせ
url URLの入力欄(HTML5の type="url" placeholder

すべてのサブフィールドに共通のプロパティ:requiredhelpTextdefaultValue

要約のテンプレート

list ウィジェットは、折りたたんだ各行を、options.summary のMustache形式のテンプレートで描画します。{{key}} は、そのキーに対応する行の値(文字列に変換したもの)に置き換えられます。値が偽とみなされる場合は "{itemLabel} {n}" が代わりに使われます。次のテンプレートは、2つのキーを組み合わせます。

"summary": "{{name}} — {{amount}}"

行は Flour — 500g のように描画されます。テンプレートは単純な文字列の置き換えで、HTMLや入れ子の式は使えません。

データの持続性

Field Kitのウィジェットは、フィールドの既存のカラムだけを使い、そこにプレーンなJSONを保存します。設定から @emdash-cms/plugin-field-kit を削除しても、データは有効なままです。フィールドは標準の json のテキスト入力欄に戻ります。

これは、ウィジェットの形を変えた場合にも当てはまります。保存済みのオブジェクトにある未知のキーは次の書き込みでも保持されるため、古いフィールドの構成で保存したデータを失わずにスキーマを変えていけます。

関連項目