管理画面と同じ見た目で画面を作る
プラグインの設定画面や独自の管理ツールを、a-blog cms の管理画面と同じデザインで作ります。方法は2つあり、必要に応じて使い分けます。
対応バージョン: CSS クラスを使う方法は制限なし。React コンポーネントを管理画面と共有する方法は Ver. 3.2.38 以降
実験的機能
この機能は Ver. 3.2 の間は実験的機能として提供し、Ver. 3.3 で正式に提供する予定です。
- 変わりうる範囲: React コンポーネントの名前・props と、
ACMS.Libraryで共有するもの(React・コンポーネント)は、マイナーバージョンアップで変更される可能性があります。 - 変わらない範囲: CSS クラスを使う方法と、PHP 側のテンプレート挿入・アセット API は、実験的機能の対象ではありません。
- 公開 API の線引き: npm パッケージ のページに掲載しているものを公開 API として扱います。掲載外のコンポーネントも利用できますが、告知なく変更されることがあります。
- サポート対象外: 管理画面に追加した独自の JavaScript・CSS は、バージョンアップ後の動作を保証しません。これらを原因とする不具合は、サポートの対象外です。
| 方法 | 必要な環境 | 向いているケース |
|---|---|---|
| CSS クラスを使う | なし | フォーム・テーブル・ボタン中心の設定画面 |
| React コンポーネントを使う | ビルド環境 | 検索・並び替え・モーダルなど動きのある UI |
CSS クラスを使う
管理画面のスタイルは CSS フレームワークとして提供しています。テンプレートに管理画面と同じクラス名を書くだけで、同じ見た目になります。フォームのクラスは、acms-admin-form を付けた要素の内側で有効になります。
<div class="acms-admin-form">
<label for="api-key" class="acms-admin-form-label">API キー</label>
<input type="text" id="api-key" name="api_key" class="acms-admin-form-width-full">
<button type="submit" class="acms-admin-btn acms-admin-btn-primary">保存</button>
</div>管理画面の中に差し込む場合、CSS は管理画面側で読み込まれているため、追加の読み込みは不要です。
管理画面の外で使う
独自のツール画面など、管理画面のテンプレートの外で使う場合は、CSS を npm から取得できます。
npm install @ablogcms/acms.css@3.2.37import '@ablogcms/acms.css';バージョンは、利用している a-blog cms と同じものを指定してください(3.2.37 は例です)。
React コンポーネントを使う
管理画面で使っている React コンポーネントを npm パッケージとして公開しています。
npm install @ablogcms/components@3.2.37バージョンは、利用している a-blog cms と同じものを指定してください(3.2.37 は例です)。
次の例は、管理画面に差し込んだテンプレートの <div id="acme-settings"></div> の中に、設定フォームを描画します。
import { createRoot } from 'react-dom/client';
import { Button } from '@ablogcms/components/button';
import { Field, FieldControl, FieldLabel } from '@ablogcms/components/field';
import { Input } from '@ablogcms/components/input';
function SettingsForm() {
return (
<form className="acms-admin-form">
<Field>
<FieldLabel>API キー</FieldLabel>
<FieldControl>
<Input name="api_key" width="full" />
</FieldControl>
</Field>
<Button type="submit" variant="primary">保存</Button>
</form>
);
}
ACMS.adminReady(() => {
const container = document.getElementById('acme-settings');
if (container !== null) {
createRoot(container).render(<SettingsForm />);
}
});コンポーネントのスタイルは、acms-admin-form を付けた要素の内側で有効になります。上の例のように、フォームを acms-admin-form で囲んでください。
実際の表示と指定できる値を確認する
コンポーネントの一覧・実際の表示・指定できる props は Storybook で確認できます。
- Storybook(コンポーネント一覧)
- よく使うもの: Button / Field / Input / Table
Storybook に載っているコンポーネントの扱い
Storybook には管理画面で使っているコンポーネントを掲載しています。利用は自由ですが、npm パッケージ のページで説明しているもの以外は、告知なく変更されることがあります。バージョンを固定して利用してください。
React と管理画面のコンポーネントを同梱しないでください
管理画面の中で動かす場合、React と react-dom はプラグイン側でバンドルしないでください。管理画面が読み込んでいる React を使います。ACMS.Library.React と ACMS.Library.ReactDomClient から取得できます。
ACMS.adminReady(() => {
const { createElement, useState } = ACMS.Library.React;
const { createRoot } = ACMS.Library.ReactDomClient;
function Counter() {
const [count, setCount] = useState(0);
return createElement(
'button',
{ type: 'button', className: 'acms-admin-btn', onClick: () => setCount(count + 1) },
`クリック数: ${count}`
);
}
const container = document.getElementById('acme-counter');
if (container !== null) {
createRoot(container).render(createElement(Counter));
}
});@ablogcms/components のコンポーネントも、同梱せずに管理画面のものを共有できます(ACMS.Library.components.button のような形で参照できます)。共有されていないコンポーネント(dataview / date-picker / time-picker / syntax-highlight / rich-select / select / device-mode / icon-picker)は、プラグイン側に同梱されます。ビルド設定で React とコンポーネントを外部依存にする方法は 開発環境と型定義 を参照してください。
設定値を JavaScript に渡す
PHP 側の設定値は ctx.config から読み取れます。PHP で jsModule() に、プラグイン名をキャメルケースにしたキーで渡します(acme-tools のプラグインなら acmeTools)。
jsModule('acmeTools', ['apiEndpoint' => '/api/acme/']);ACMS.adminReady(() => {
ACMS.plugins.register('acme-tools', {
setup(ctx) {
console.log(ctx.config.apiEndpoint);
},
});
});値は配列(連想配列)で渡します。数値や真偽値も、JavaScript 側では文字列として届きます。
API キーなどの秘密の情報は渡さないでください(ブラウザから閲覧できます)。制約の詳細は プラグイン API を参照してください。
関連ページ
変更履歴
| バージョン | 変更内容 |
|---|---|
| Ver. 3.2 | 新規追加(実験的機能) |