UI の差し込み(Slot / Fill)
管理画面のあらかじめ決められた位置に、独自のボタンやパネルを追加できます。
実験的機能
この機能は Ver. 3.2 の間は実験的機能として提供し、Ver. 3.3 で正式に提供する予定です。
- 変わりうる範囲: 差し込み位置の名前(Slot 名)と、そこで受け取れる値は、マイナーバージョンアップで変更される可能性があります。
- 変わらない範囲: PHP 側のフック処理・テンプレート挿入・アセット API は、この実験的機能の対象外です。従来どおりの仕様として提供しています。
- 公開 API の線引き: このページの一覧に掲載している Slot 名を公開 API として扱います。掲載外のものも利用できますが、告知なく変更されることがあります。
- サポート対象外: 管理画面に追加した独自の JavaScript・CSS は、バージョンアップ後の動作を保証しません。これらを原因とする不具合は、サポートの対象外です。
差し込み位置(Slot)とは
管理画面の特定の場所に用意された、名前付きの差し込み口です。追加のみができます。 既存のボタンを消したり、置き換えたりはできません。
差し込みは ctx.ui.fill(差し込み位置の名前, 内容) で行います。
DOM で差し込む
React を使わない場合はこちらです。渡された要素に自由に DOM を追加できます。
ACMS.plugins.register('my-plugin', {
setup(ctx) {
ctx.ui.fill('media.edit-modal.footer', (el) => {
const button = document.createElement('button');
button.type = 'button';
button.className = 'acms-admin-btn';
button.textContent = '外部システムに送信';
button.addEventListener('click', () => sendToExternal());
el.append(button);
// 画面が閉じられたときに呼ばれる(省略可)
return () => button.remove();
});
},
});- 引数
elは、差し込み位置に用意された空の要素です。 - この要素の中身は管理画面側から書き換えられません。 自分で追加した DOM がいつのまにか消えることはありません。
- 戻り値の関数は、その画面が閉じられたときに呼ばれます。イベントリスナーの解除などに使ってください。
差し込み位置が渡す値(下の一覧の「受け取れる値」)を DOM 版で使うことはできません。値が必要な場合は次の React 版を使ってください。
React で差し込む
管理画面と同じ React を使えます。値を受け取らない場合は、引数のないコンポーネントをそのまま渡します。
ACMS.plugins.register('my-plugin', {
setup(ctx) {
ctx.ui.fill('preview.actions', function MyButton() {
return ACMS.Library.React.createElement('button', { type: 'button', className: 'acms-admin-btn' }, '送信');
});
},
});差し込み位置の値を受け取る
編集中のメディアやエディターの情報を受け取りたい場合は、ACMS.plugins.withFillProps() でラップします。
ACMS.plugins.register('my-plugin', {
setup(ctx) {
const { withFillProps } = ACMS.plugins;
ctx.ui.fill(
'media.edit-modal.field.alt',
withFillProps(({ item, previewSrc, setAlt }) =>
ACMS.Library.React.createElement(
'button',
{
type: 'button',
className: 'acms-admin-btn',
onClick: async () => {
const alt = await generateAlt(previewSrc);
setAlt(alt);
},
},
'alt を自動入力'
)
)
);
},
});withFillProps を忘れると値が渡りません
値を受け取るコンポーネントをそのまま渡すと、DOM 版の書き方(要素を受け取る関数)と区別できないため、正しく動きません。値を受け取る場合は必ず withFillProps() でラップしてください。
JSX で書きたい場合は 開発環境と型定義 を参照してください。
差し込み位置の一覧
| 差し込み位置 | 場所 | 受け取れる値 | 効く画面 |
|---|---|---|---|
unit-editor.unit-toolbar | ユニット共通のツールバー(各ユニットの操作ボタンが並ぶ場所) | editor, unit | エントリー編集・インライン編集・編集設定のユニット編集 |
unit-editor.top | ユニットエディターの上部(本文編集領域の直前) | editor | 同上 |
unit-editor.bottom | ユニットエディターの下部(本文編集領域の直後) | editor | 同上 |
block-editor.menus | ブロックエディターのメニュー群の直後 | editor, appendTo | ブロックエディターを使うすべての画面 |
block-editor.block-menu | ブロックのツールバー(ブロックを選択したときに表示されるツールバー)の共通区画の直後。ブロックの種類を問わず表示 | editor, variant | ブロックエディターを使うすべての画面 |
block-editor.block-menu.text | ツールバーのテキスト系ブロック(段落・見出し・引用など)の区画の末尾 | editor, variant(常に 'text') | 同上 |
block-editor.block-menu.image | ツールバーの画像ブロックの区画の末尾 | editor, variant(常に 'image') | 同上 |
block-editor.block-menu.file | ツールバーのファイルブロックの区画の末尾 | editor, variant(常に 'file') | 同上 |
block-editor.block-menu.linkButton | ツールバーのリンクボタンブロックの区画の末尾 | editor, variant(常に 'linkButton') | 同上 |
block-editor.block-menu.table | ツールバーのテーブル(セル選択時)の区画の末尾 | editor, variant(常に 'table') | 同上 |
media.edit-modal.field.alt | メディア詳細の alt 入力欄の直後 | item, previewSrc, getAlt(), setAlt(値) | メディア詳細モーダル(メディア管理・カスタムフィールド・ブロックエディター・リッチエディター・ユニットなどから開く画面すべて) |
media.edit-modal.fields | メディア詳細の編集タブ、項目テーブルの直後 | item | 同上 |
media.edit-modal.footer | メディア詳細の保存ボタンの直後 | item, getFormData() | 同上 |
media.list.bulk-actions | メディア一覧の一括操作エリア | selectedItems(選択中のメディア) | メディア管理の一覧 |
preview.actions | プレビューの操作ボタン群の直後 | なし | プレビューモーダル・インラインプレビュー |
補足:
media.edit-modal.field.altは、管理画面の設定で alt 入力欄を非表示にしている場合、この差し込み位置も一緒に非表示になります。setAlt(値)を使うと、入力欄の表示・内部の値・高さの自動調整がまとめて更新されます。getAlt()は現在の値を返します。getFormData()は、その時点で保存されようとしている内容をFormDataとして返します。preview.actionsは、プレビューのキャプチャまたは共有が有効なときだけ表示されます。
同じ位置に複数のプラグインが差し込んだとき
JS が読み込まれた順に並びます。 優先度の指定はありません。順序を制御したい場合は、アセット API の登録順で調整してください。
差し込む UI の見た目を合わせる
管理画面と同じ見た目にするには、管理画面の CSS クラスをそのまま使えます。
button.className = 'acms-admin-btn acms-admin-btn-primary';- クラス名の一覧 → スタイルガイド
- 実際の表示とバリエーション → Storybook の Button
- React コンポーネントとして使う → npm パッケージ
変更履歴
| バージョン | 変更内容 |
|---|---|
| Ver. 3.2.29 | 新規追加(実験的機能) |