管理画面とAPI
編集モード・パーツ管理・画像管理などのUIガイドと、属性・イベント・メソッド・データ構造のAPIリファレンスです。
編集モード
ZeroCode.jsでは、4つの編集モードが利用できます。
edit(編集モード)
既存のコンポーネントを編集するモードです。
- コンポーネントのフィールドを編集
- 親要素への移動(「親要素を選択」ボタン)
- 同じパーツをクリックした場合はパネルを閉じる
add(追加モード)
新しいコンポーネントを追加するモードです。
- パーツ一覧から選ぶと、既定では対象要素の後ろにすぐ追加される(編集モードへは移動しない)
- 既定では追加パネルは開いたまま続けて選択でき、追加直後は追加したコンポーネントがアンカーになる
- カテゴリタブ行の右端の設定アイコンから、「選択した要素の前に追加する」「追加後に編集に移動」「プレビューに+ボタンを表示」を切り替えられる。追加後に編集に移動をオンにすると、追加直後に編集モードへ切り替わり追加したパーツを編集できる
- 「選択したパーツ」タブではカードをクリックすると、プレビューで選んだパーツを複製して追加できる
- 親要素への移動(「親要素を選択」ボタン)
delete(削除モード)
コンポーネントを削除するモードです。
- 削除確認
- 親要素への移動(「親要素を選択」ボタン)
reorder(並べ替えモード)
コンポーネントの順序を変更するモードです。
- 並べ替えパネル(構造リスト): パーツをクリックするとパネルが開き、行の D&D または行クリックで操作できます(page 直下・スロット内)
- プレビュー click-click: 移動元 → 移動先の順にクリック(D&D と同じ insert 移動)
- プレビュー上の直接 D&D は不可(パネル D&D または click-click を利用)
-
オプション「パーツにラベルを表示」(
showReorderStructureLabels)で同階層ラベルを表示 - 親要素への移動(「親要素を選択」ボタン)
- 他モードから切り替えた際、選択中パーツを移動元として引き継ぎ
親要素選択
各編集モードで使用可能な親要素選択機能です。
- 「親要素を選択」ボタンで親要素に移動
- 親要素がない場合はボタンが非表示になる
- 移動時に自動的にスクロールして移動先を表示
パーツ管理
パーツ管理は、zcode-editorでのみ利用可能な機能です。
タイプとパーツ
- タイプ(Type): パーツのグループ。複数のパーツを含む
- パーツ(Part): 実際のコンポーネントテンプレート
共通パーツ、個別パーツ、専用パーツ
- 共通パーツ: すべてのページで使用可能なパーツ
- 個別パーツ: 特定のページでのみ使用可能なパーツ
- 専用パーツ: 動的ページ(動的ルートやURLパラメータに応じて生成されるページ)で使用可能なパーツ
パーツ管理機能
- タイプの作成・編集・削除
- パーツの作成・編集・削除
- タイプ間の並べ替え
- パーツのプレビュー表示
- Monaco Editorによるコード編集
- テンプレート記法の予測変換(オプション)
パーツテンプレートの構造
{
"id": "part-id",
"title": "パーツタイトル",
"description": "パーツの説明",
"body": "<div>{$title:タイトル}</div>",
"slots": {
"slotName": {
"allowedParts": ["part-id-1", "part-id-2"]
}
},
"slotOnly": false
}
テンプレート記法の後から追加と自動初期化
パーツ管理で既存のパーツにテンプレート記法(フィールド)を後から追加した場合、既存のページデータ(page)にそのパーツを使用しているコンポーネントがあると、自動的に不足しているフィールドが初期化されます。
動作:
- データ読み込み時の自動初期化: ページデータが読み込まれる際に、すべてのコンポーネント(スロット内も含む)に対して自動的に初期化処理が実行されます
-
通常フィールドの初期化:
テンプレートに定義されている通常フィールド(
{$field:default})で、コンポーネントデータに存在しない(undefined)場合、デフォルト値で初期化されます -
オプショナルフィールドの扱い:
オプショナルフィールド(
{$field?:default})は初期化されず、undefinedのまま残ります - 再帰的な処理: スロット内の子コンポーネントも再帰的に処理され、すべての階層で初期化が行われます
初期化されるデフォルト値:
-
テキストフィールド(
{$field:default:text}): テンプレートで指定されたデフォルト値、または空文字列 -
テキストエリア(
{$field:default:textarea}): テンプレートで指定されたデフォルト値、または空文字列 -
リッチテキスト(
{$field:default:rich}): デフォルト値がある場合は<p>デフォルト値</p>、ない場合は<p></p> -
画像フィールド(
{$field:default:image}): テンプレートで指定されたデフォルト値、または空文字列 -
ラジオボタン(
($field:option1|option2)): 最初の選択肢 -
セレクトボックス(
($field@:option1|option2)): 最初の選択肢 -
チェックボックス(
($field:option1,option2)): 空配列[] -
複数選択セレクト(
($field@:option1,option2)): 空配列[] -
ブール値(
z-ifで使用される場合など):true
使用例:
// 既存のパーツテンプレート
{
"id": "hero-part",
"title": "ヒーローセクション",
"body": "<div>{$title:タイトル}</div>"
}
// 後からテンプレート記法を追加
{
"id": "hero-part",
"title": "ヒーローセクション",
"body": "<div>{$title:タイトル}</div><div>{$subtitle:サブタイトル}</div>"
}
// 既存のページデータ(初期化前)
{
"id": "hero-1",
"part_id": "hero-part",
"title": "既存のタイトル"
// subtitleフィールドが存在しない
}
// データ読み込み後の自動初期化(初期化後)
{
"id": "hero-1",
"part_id": "hero-part",
"title": "既存のタイトル",
"subtitle": "サブタイトル" // 自動的に追加・初期化される
}
オプショナルフィールドの例:
// パーツテンプレートにオプショナルフィールドを追加
{
"id": "hero-part",
"title": "ヒーローセクション",
"body": "<div>{$title:タイトル}</div><div>{$subtitle?:サブタイトル}</div>"
}
// 既存のページデータ(初期化後)
{
"id": "hero-1",
"part_id": "hero-part",
"title": "既存のタイトル"
// subtitleはundefinedのまま(初期化されない)
}
オプショナルフィールドで親要素を削除したい場合:
オプショナルフィールドが空の場合、基本動作では親要素(タグ)が残ります。親要素ごと削除したい場合は、z-empty属性を使用してください。
// パーツテンプレート(z-emptyを使用)
{
"id": "hero-part",
"title": "ヒーローセクション",
"body": "<div>{$title:タイトル}</div><div z-empty=\"$subtitle\"><p>{$subtitle?:サブタイトル}</p></div>"
}
// 既存のページデータ(subtitleがundefinedの場合)
{
"id": "hero-1",
"part_id": "hero-part",
"title": "既存のタイトル"
// subtitleはundefinedのまま
}
// レンダリング結果:subtitleがundefinedの場合、<div z-empty="$subtitle">要素ごと削除される
<div>既存のタイトル</div>
<!-- subtitleのdiv要素は表示されない -->
注意:
この初期化処理は、データ読み込み時(page属性が設定された時点)に自動的に実行されます。パーツテンプレートを編集した後、ページデータを再読み込みすると、新しいフィールドが自動的に初期化されます。
補足: テンプレート記法を削除した場合、ページデータにはフィールドが残りますが、パーツテンプレートには存在しないため、表示上は非表示になります。不要になったフィールドは、手動でページデータから削除するか、バックエンドで一括削除する処理を実装してください。
画像管理
画像の一覧管理(アップロード・ID 編集・削除)は zcode-editor /
zcode-studio
の画像管理タブで行います。ページ編集時の画像選択は
zcode-cms(および Editor のページ管理)の編集パネルから行います。
画像管理機能
- 画像のアップロード
- 画像の編集(ID、名前、URL)
- 画像の削除
- 共通・個別・専用カテゴリの管理(Editor / Studio)
- 専用画像の page-id スコープ(CMS 画像選択モーダル。詳細は下記)
画像データ構造
interface ImageData {
id: string;
name: string;
url: string;
mimeType?: string;
needsUpload?: boolean;
scope?: 'shared' | 'page'; // 専用画像(images-special)のみ
pageId?: string; // scope が 'page' のとき
}
専用画像のスコープ(page-id)
ブログの記事編集など、同一ユーザーが複数ページを編集する場合、page-id
属性で専用画像をページ単位に区別できます。内部キーは従来どおり
images-special です。
scope |
意味 | CMS 画像選択(page-id 指定時) |
|---|---|---|
未指定 / shared |
全ページで選択可能 | 表示される |
page + pageId |
当該 page-id の編集画面のみ | 一致する pageId のみ |
-
zcode-cms/zcode-editor/zcode-studioのpage-id属性に記事 ID 等を渡す - CMS 編集画面から追加した専用画像は
{ scope: 'page', pageId }になる -
Editor / Studio の画像管理タブから追加した専用画像は
scope: 'shared'(管理者向け) -
保存は従来どおり
images-specialターゲット(スコープ付き JSON をホストが永続化)
<zcode-cms
page-id="post-123"
page="..."
images-special="..."
></zcode-cms>
mimeType
画像のMIMEタイプ(例: image/jpeg,
image/png)。base64画像の場合に設定されます。
needsUpload
trueの場合、バックエンドで画像のアップロード処理が必要です。通常、base64画像はneedsUpload: trueとして保存されます。
画像選択モーダル
編集パネルから画像を選択する際に表示されるモーダルです(zcode-cms および
Editor のページ管理)。
- タブ: 全て / 共通 / 個別 / 専用
- 専用タブおよび「全て」タブで、専用画像の追加・並べ替え・削除が可能
- ツールバー右の「専用画像を追加」は常時表示(追加後は自動選択)
-
page-id指定時は、他 page の専用画像は一覧から除外(UI バッジは表示しない)
設定オプション
ZeroCode.jsでは、config属性で初期設定を指定できます。
設定の構造
設定はcms、dev、および共通設定の3つのカテゴリに分離されています。
{
"cms": {
"allowDynamicContentInteraction": false,
"devRightPadding": false,
"enableContextMenu": false
},
"dev": {
"showDataViewer": false,
"enableTemplateSuggestions": false
},
"categoryOrder": "common"
}
設定の優先順位
- localStorage: ユーザーが変更した設定(最優先)
- config属性: 初期設定として指定された値
- デフォルト値: 全て
false
CMS設定(cms)
zcode-cmsとzcode-editorの両方で共有される設定です。
allowDynamicContentInteraction
デフォルト: false
アコーディオン、タブ、モーダル、リンクなどの動的コンテンツの動作を有効/無効にします。
設定パネルでは「ページの動作を有効にする」として表示されます。
devRightPadding
デフォルト: false
編集パネル表示時にコンテンツの右余白を追加します。
設定パネルでは「編集パネル分の余白をつける」として表示されます。
enableContextMenu
デフォルト: false
右クリックメニューを有効にします。
設定パネルでは「右クリックメニューを有効にする」として表示されます。
Dev設定(dev)
zcode-editor専用の設定です。
showDataViewer
デフォルト: false
データビューアを表示します。
設定パネルでは「データビューアを表示」として表示されます。
enableTemplateSuggestions
デフォルト: false
テンプレート記法の予測変換を有効にします。
パーツ管理パネルのエディタで使用されます。
共通設定
zcode-cmsとzcode-editorの両方で使用される設定です。
categoryOrder
デフォルト: "common"
パーツ管理、画像管理、データビューア、追加パネルにおける「共通」「個別」「専用」タブの表示順序と初期選択を制御します。
設定可能な値:
-
"common": 共通タブを先に表示し、初期状態で共通タブを選択(デフォルト) "individual": 個別タブを先に表示し、初期状態で個別タブを選択-
"special": 専用タブを先に表示し、初期状態で専用タブを選択(専用データが存在する場合のみ表示)
この設定は以下の画面に適用されます:
- パーツ管理タブ(
zcode-editorのみ) - 画像管理タブ(
zcode-editorのみ) - データビューアタブ(
zcode-editorのみ、パーツ/画像表示時) - 追加パネル(
zcode-cmsとzcode-editorの両方)
設定の使用例
<zcode-cms
config='{"cms": {"allowDynamicContentInteraction": true, "devRightPadding": true, "enableContextMenu": true}, "categoryOrder": "individual"}'
></zcode-cms>
<zcode-editor
config='{"cms": {"allowDynamicContentInteraction": true}, "dev": {"showDataViewer": true}, "categoryOrder": "individual"}'
></zcode-editor>
または、JavaScript変数で指定することもできます:
const cmsConfig = {
cms: {
allowDynamicContentInteraction: true,
devRightPadding: true,
enableContextMenu: true
},
categoryOrder: 'individual'
};
const cmsElement = document.getElementById('cms');
cmsElement.setAttribute('config', JSON.stringify(cmsConfig));
APIリファレンス
zcode-cms
ユーザー向け管理画面のWebコンポーネント。
属性
| 属性名 | 型 | 説明 |
|---|---|---|
page |
string | ページデータ(JSON文字列) |
page-id |
string |
専用画像のページスコープ用 ID(記事 ID
など)。指定時、画像選択モーダルでは「全ページ」(shared) と当該 page-id
の「このページ」(scope: 'page') のみ表示。CMS から専用画像を追加すると
scope: 'page' が付与される
|
parts-common |
string | 共通パーツデータ(JSON文字列) |
parts-individual |
string | 個別パーツデータ(JSON文字列) |
parts-special |
string | 専用パーツデータ(JSON文字列) |
images-common |
string | 共通画像データ(JSON文字列) |
images-individual |
string | 個別画像データ(JSON文字列) |
images-special |
string | 専用画像データ(JSON文字列) |
config |
string | 初期設定データ(JSON文字列) |
use-shadow-dom |
string | Shadow DOMを使用するか('true' | 'false'、デフォルト: 'true') |
スロット
css: CSSファイルを指定script: JavaScriptファイルを指定
zcode-editor
エンジニア・デザイナー向け管理画面のWebコンポーネント。
ZeroCodeCMSの機能に加えて、パーツ管理・画像管理・データビューアが利用できます。
属性
zcode-cmsの属性(page-id
含む)に加えて、以下の属性が利用できます:
| 属性名 | 型 | 説明 |
|---|---|---|
enable-parts-manager |
string | パーツ管理を有効にするか(デフォルト: 'true') |
enable-images-manager |
string | 画像管理を有効にするか(デフォルト: 'true') |
renderToHtml()
ページコンポーネントからHTML文字列を生成します。CSSは含まれません。
Node や SSR では zerocodejs/ssr から import
することを推奨します(軽量エントリ。Vue / Web Components は含みません)。ブラウザ用の一括
import は zerocodejs のままでも問題ありません。
import { renderToHtml } from 'zerocodejs/ssr';
const html = renderToHtml(data, {
enableEditorAttributes: false
});
パラメータ
data: ZeroCodeData形式のデータ-
options.enableEditorAttributes: 編集用属性を有効にするか(デフォルト:false)
戻り値
生成されたHTML文字列
renderCssToHtml()
CSSデータから<style>タグのHTML文字列を生成します。common → individual →
special の順で出力されます。
import { renderToHtml, renderCssToHtml } from 'zerocodejs/ssr';
const content = renderToHtml(data, { enableEditorAttributes: false });
const styles = renderCssToHtml(data.css);
// content は <body> に、styles は <head> に配置
パラメータ
-
css:{ common?: string; individual?: string; special?: string }
戻り値
<style>タグを含むHTML文字列。空やundefinedのカテゴリはスキップされます。
イベント
save-request
保存ボタンクリック時に発火します。event.detail に
data は含まれません。保存対象のデータは
cms.getData() で取得してください。
cms.addEventListener('save-request', (event) => {
const { requestId, source, targets, timestamp } = event.detail;
const data = cms.getData();
for (const target of targets) {
// target ごとに data から必要な部分を切り出してサーバーへ送る
}
});
event.detail
requestId: リクエストID(save-resultで対応付けに使用)source: 送信元('cms'または'editor')-
targets: 保存対象の配列('page','parts-common','parts-individual','parts-special','images-common','images-individual','images-special','parts-common-css','parts-individual-css','parts-special-css'のいずれか) timestamp: タイムスタンプ
含まれないもの: target(単数)・data。データは
cms.getData() で取得する。
zcode-dom-updated
DOMが更新されたときに発火します。動的コンテンツの初期化などに使用できます。
window.addEventListener('zcode-dom-updated', () => {
// DOM更新後の処理
initializeAccordion();
});
メソッド
getData(path?: string)
データを取得します。
const cms = document.getElementById('cms');
// 全体のデータを取得
const allData = cms.getData();
// 特定のパスのデータを取得
const pageData = cms.getData('page');
const firstComponent = cms.getData('page.0');
const title = cms.getData('page.0.title');
パラメータ
-
path(オプション): データのパス(例:'page','page.0','page.0.title')
戻り値
指定したパスのデータ。パスが指定されていない場合は全体のデータを返します。
setData(path: string | object, value?: any)
データを設定します。
const cms = document.getElementById('cms');
// パスを指定して値を設定
cms.setData('page.0.title', '新しいタイトル');
// オブジェクト全体を設定
cms.setData({
page: [...],
parts: {
common: [...],
individual: [...]
}
});
セキュリティ注意: このメソッドはクライアント側から任意のデータを設定できます。開発者ツールからも呼び出し可能です。サーバー側での検証を必ず実装してください。
パラメータ
-
path: データのパス(文字列の場合)またはデータオブジェクト全体(オブジェクトの場合) value(オプション): 設定する値(pathが文字列の場合)
allowDynamicContentInteraction(プロパティ)
動的コンテンツの動作を有効/無効にします(getter/setter)。
const cms = document.getElementById('cms');
// 値を取得
const isEnabled = cms.allowDynamicContentInteraction;
// 値を設定
cms.allowDynamicContentInteraction = true;
データ構造
ZeroCode.jsで使用するデータ構造の説明です。
ZeroCodeData
interface ZeroCodeData {
page: ComponentData[];
parts: {
common: TypeData[];
individual: TypeData[];
special: TypeData[];
};
images: {
common: ImageData[];
individual: ImageData[];
special: ImageData[];
};
}
ComponentData
interface ComponentData {
id: string;
part_id: string;
[key: string]: any;
slots?: Record<string, ComponentData[] | SlotConfig>;
}
id: コンポーネントの一意のIDpart_id: パーツID(タイトル変更時も紐付けが維持される)-
[key: string]: any: フィールドの値(テンプレート記法で定義されたフィールド) slots: スロットの子コンポーネント
SlotConfig
interface SlotConfig {
allowedParts?: string[];
children?: ComponentData[];
}
allowedParts: 許可されるパーツIDの配列-
children: 子コンポーネントの配列(ComponentData[]としても使用可能)
TypeData
interface TypeData {
id: string;
type: string;
description: string;
parts: PartData[];
}
id: タイプID(タイプ変更時も紐付けが維持される)type: タイプ名description: タイプの説明parts: パーツの配列
PartData
interface PartData {
id: string;
title: string;
description: string;
body: string;
slots?: Record<string, { allowedParts?: string[] }>;
slotOnly?: boolean;
}
id: パーツID(タイトル変更時も紐付けが維持される)title: パーツタイトルdescription: パーツの説明body: パーツのテンプレート(HTML文字列)slots: スロットの設定slotOnly: スロット専用パーツかどうか
ImageData
interface ImageData {
id: string;
name: string;
url: string;
mimeType?: string;
needsUpload?: boolean;
}
id: 画像の一意のIDname: 画像名-
url: 画像のURL(base64データの場合はdata:image/...形式) -
mimeType: MIMEタイプ(例:image/jpeg,image/png) -
needsUpload: アップロードが必要かどうか(trueの場合、バックエンドでアップロード処理が必要)