ブロックエディター

目次

ブロックエディターの基本


ブロックエディターでは、テキスト、画像、ファイルなどのコンテンツを「ブロック」単位で自由に組み立てることができ、みたままの視認性と柔軟性が大幅に向上します。

主な特徴・機能

  • HTMLのコピーアンドペーストに対応

  • スラッシュコマンド

    • マウスでブロックを選択しなくても、直感的にブロック挿入ができるようになります。

  • メディア機能に対応

    • メディアから画像やファイルを挿入することが可能

    • 大元のメディアで画像を差し替えても自動でブロックエディタ側も連動

  • インライン要素にカスタムクラス

    • 設定画面で設定した任意のクラスをインライン要素に設定可能

  • ブロック要素にカスタムクラス

    • 設定画面で設定した任意のクラスをブロック要素に設定可能

  • 2カラム・3カラムレイアウトに対応

    • みたままの状態でマルチカラムレイアウトに対応

  • マークダウンに対応

    • マークダウン記法で入力すると自動的にHTMLに変換します

使用方法

編集テンプレートのカスタムフィールド例

カスタムフィールドをブロックエディタにする場合は、以下のように記述します。

記述ルール

  • <acms-block-editor> タグを使う

  • <acms-block-editor> の子孫のうち最初に見つかった <input type="hidden"> が、編集後のHTMLの格納先として自動的に使われる

  • 必ず <input type="hidden" name="xxxxx:extension" value="block-editor" /> を指定する

  • root-class でブロックエディター要素に付与されるクラス属性を設定可能

<!-- 推奨(Web Component) -->
<acms-block-editor root-class="acms-admin-form-width-full" settings="{...}">
  <input type="hidden" name="hoge" value="{hoge}">
</acms-block-editor>
<input type="hidden" name="field[]" value="hoge">
<input type="hidden" name="hoge:extension" value="block-editor" />

<!-- 旧方式(今後も動作するが非推奨。自動的に <acms-block-editor> へ変換される) -->
<div class="js-block-editor" data-target=".js-target" data-html=".js-html">
  <div class="js-target acms-admin-form-width-full"></div>
  <input type="hidden" class="js-html" name="hoge" value="{hoge}">
  <input type="hidden" name="field[]" value="hoge">
 <input type="hidden" name="hoge:extension" value="block-editor" />
</div>

表示テンプレートの出力例

ブロックエディタで編集したHTMLを出力するには、以下のように記述します。

記述ルール

  • 必ず raw (標準テンプレート)or safe_html (twigテンプレート)校正オプションを指定

{hoge}[raw] <!-- 標準テンプレートの場合 -->
{{ hoge|safe_html }} <!-- Twigテンプレートの場合 -->

基本設定

初期設定が js/config.js で設定されています。

blockEditorConfig: {
  setMainImageMark: '.js-block-editor-set-main-image',
  tableScrollableWrapperClass: 'acms-table-scrollable',
  tableScrollableClass: 'js-table-unit-scroll-hint',
  /**
    * BlockEditorコンポーネントに渡されるprops
    */
  editorProps: {
    editorProps: {
      attributes: {
        class: 'acms-entry',
      },
    },
  },
},

またeditor-props 属性でフィールド毎に設定を上書き可能です。ブロックエディターの編集領域に付与されるクラスをこのブロックエディターフィールドのみ上書きしています

<acms-block-editor
  editor-props='\{"attributes":\{"class":"custom-body-class"\}\}'
>
 ...
</acms-block-editor>

上記の例では、テンプレートエンジンに変数として解決されないようにするため、波括弧をエスケープしています。@verbatimブロックを利用することでも同様の回避が可能です。

メイン画像設定機能

メディア画像のメニューにメイン画像に設定するボタンが用意されています。このボタンを押した時に blockEditorConfig.setMainImageMark に設定されているセレクタの要素(メディアのカスタムフィールド)に、選択している画像をセットします。

メイン画像に設定ボタンを押すことにより、メイン画像に設定できます。
メイン画像に設定する

カスタムフィールド例

<div class="js-media-field">
  <div class="js-droparea" data-thumbnail="{entry_main_image@thumbnail}" data-type="image" style="width:200px"></div>
  <p class="js-text acms-admin-text-danger" style="display:none">許可されていないファイルのため挿入できません。</p>
  <div class="acms-admin-margin-top-mini">
    <button type="button" class="js-insert acms-admin-btn" data-type="image">メディアを選択</button>
  </div>
  <input type="hidden" name="entry_main_image" value="{entry_main_image}" class="js-value js-block-editor-set-main-image" />
  <input type="hidden" name="field[]" value="entry_main_image" />
  <input type="hidden" name="entry_main_image:extension" value="media" />
</div>

従来は、メディア・画像ユニットのみメイン画像に設定することができましたが、Ver. 3.2 から メディアのカスタムフィールドを、Entry_Summaryなどのモジュールで、メイン画像として出力できるようになりました。


テーブルのクラス設定

テーブルのメニューにテーブルを横スクロールして表示するように設定するボタンが用意されています。このボタンを押した時、テーブルのHTMLに設定されるクラスを設定できるようになっています。

スクロールするテーブルにするボタンを押すことで、テーブルが横スクロースされて表示できるようになります。
スクロールするテーブルにする

設定

説明

初期値

blockEditorConfig.tableScrollableWrapperClass

table要素の親要素につけるクラス

‘acms-table-scrollable’

blockEditorConfig.tableScrollableClass

table要素につけるクラス

‘js-table-unit-scroll-hint’

スクロールするテーブルのHTML例

<div class="tableWrapper acms-table-scrollable">
  <table class="js-table-unit-scroll-hint" data-scrollable="true">
    <tbody>
      <tr>
        <td>...</td>
        <td>...</td>
        <td>...</td>
      </tr>
    </tbody>
  </table>
</div>

出力HTMLを囲う要素のクラス名設定

ブロックエディタで出力されるコンテンツ全体を囲む要素に、任意のクラス名を設定することができます。このクラスは管理画面のブロックエディタ編集画面に反映され、独自のスタイル調整に活用できます。

設定

説明

初期値

blockEditorConfig.editorProps.editorProps.attributes.class

コンテンツを囲う親divに設定されるクラス名

‘acms-entry’

編集画面のHTML例

<div class="js-block-editor" data-target=".js-target" data-html=".js-html">
  <div class="js-target acms-admin-form-width-full">
    <div class="acms-admin-block-editor-container">
      <div class="acms-admin-block-editor">
        <div class="acms-admin-block-editor-content" aria-expanded="false">
          <div contenteditable="true" translate="no" class="tiptap ProseMirror entry-style" tabindex="0" autocomplete="off" autocorrect="off" autocapitalize="off" aria-expanded="false">
            編集しているHTML...
          </div>
        </div>
      </div>
    </div>
  </div>
  <input type="hidden" class="js-html" name="xxxxxxxx" value="xxxxxxxxx">
</div>

設定を変更する場合

設定を変更する際は、js/config.js を直接編集しないでください。
将来的なアップデートやテーマの互換性維持のため、設定の上書きはテーマ内の HTML テンプレートなどで行ってください。

例:テンプレート内での上書き方法

<script>
ACMS.Ready(() => {
  ACMS.Config.blockEditorConfig.tableScrollableWrapperClass = 'c-table__wrapper';
  ACMS.Config.blockEditorConfig.tableScrollableClass = 'c-table__scrollable';
});
</script>

画像の拡大機能の設定

画像の拡大を行うための識別子として、画像リンクの class 属性に、設定する値を設定できます。デフォルト値は js-smartphoto で、標準ではSmartPhotoを使って画像を拡大させます。

また data-group 属性にエントリーID が自動で付与されます。

他設定と違い js/config.js ではなく private/config.system.yaml で行います。

block_editor_lightbox_class: js-smartphoto

メディア画像の出力例

<a href="/path/to/sample.png?v=20250710172457" class="js-smartphoto" data-group="169">
  <img src="/path/to/sample.png?v=20250710172457" class="unit-id-169 in-view" width="1200" height="675" loading="lazy" data-mid="50" alt="xxxxxx">
</a>

<acms-block-editor> のJavaScript API

<acms-block-editor> 要素は、編集中の内容を外部のJavaScriptから参照するための最小限のAPIを公開しています。テーマ独自のJS(文字数カウンター、保存ボタンの制御、プレビュー連携など)から利用できます。

editor プロパティ(読み取り専用)

ブロックエディターが内部で使用しているリッチテキストエディター(tiptap)の Editor インスタンスを返します。エディター本体はページ読み込み後に遅延して初期化されるため、マウントが完了していない間は null を返します。

const el = document.querySelector('acms-block-editor');
console.log(el.editor); // tiptap の Editor インスタンス、または null(未マウント時)

editor から呼べる主な機能(tiptapの標準API):

メソッド/プロパティ

内容

el.editor.getHTML()

現在の編集内容をHTML文字列で取得

el.editor.getText()

プレーンテキストとして取得

el.editor.isEmpty

本文が空かどうか

el.editor.state, el.editor.on(...)

より高度な状態取得・イベント監視(tiptap公式ドキュメント参照)

注意(マウントのタイミング): editor は要素がDOMに追加された直後は null になっている場合があります。確実に値を取得したい場合は、後述の change イベントを1回受け取った後にアクセスしてください。

value プロパティは提供していません。他のカスタム要素(<acms-tag-select> 等)と異なり、編集内容全体を1つの値としてまとめて読み書きするAPIはありません。内容を取得・変更したい場合は必ず editor 経由でtiptapのAPIを使用してください。

change イベント

編集内容が変更され、フォーム送信用の hidden input への反映が完了した直後に発火します。標準の CustomEvent で bubbles: true のため、祖先要素でも購読できます。

document.querySelector('acms-block-editor').addEventListener('change', (event) => {
  const el = event.currentTarget;
  console.log(el.editor?.getHTML());
});

注意(発火頻度): 文字入力・書式変更のたびに発火するため、1文字ごとに何度も呼ばれます。重い処理をハンドラ内に直接書くと画面の反応が悪くなるため、debounce(一定時間操作が止まってから実行)を挟むことを推奨します。

このイベントとフォーム送信の関係: change はあくまで「変更があった」ことの通知用です。フォーム送信時に実際に送られる値は、<acms-block-editor> 内の hidden input の値そのものであり、このイベント自体は送信処理に関与しません。

ブロックエディターのカスタマイズ


ブロックエディターのカスタマイズを管理画面から行えます管理画面 > 編集画面 > ブロックエディタ設定 から行えます。

管理ページのブロックエディター設定画面で、ブロックエディタのメニューや、追加できるブロックをカスタマイズできます。
ブロックエディター設定画面

画像設定

ブロックエディターで管理する画像についての設定です。

画像リサイズ

ブロックエディターで追加したメディア画像のリサイズサイズを指定します。ブロックエディターでは、全てのメディア画像がこのサイズにリサイズされます(指定サイズより小さい画像はリサイズされません)

画像リサイズの設定をピクセスで指定します。
画像リサイズ設定

拡大表示

ブロックエディターで追加したメディア画像の拡大表示設定のデフォルトを設定します。

ブロックメニュー

ブロックエディターで追加できるブロック項目を設定できます。

ブロックメニューを追加・削除できます。
ブロックメニュー設定画面
  • ブロック:ブロックの種類

  • ラベル:メニュー表示で表示されるテキスト

  • クラス:追加したブロック要素に付与されるクラス

  • グループ:メニュー表示するときのグループを指定します。空の場合、上で設定されているグループが設定されます。

追加ブロックのメニュー表示に反映されます。
追加ブロックのメニュー表示

メニュー設定

メニュー設定では、テキストを選択したときのメニュー項目の制御ができます。不要な要素があればチェックを外してください。

使いたいメニューにはチェックを入れ、不要なメニューはチェックをはずします。
テキストのメニュー設定画面
テキストを選択することで、メニューが表示されます。
テキストの装飾メニュー

カスタムクラス

カスタムクラスでは、選択したテキストを span で囲って任意のクラスを設定するときの、クラスを設定できます。

*「メニュー設定」で「カスタムクラス」にチェックが入っている必要があります。

ラベルとクラス名を好きな数だけ設定します。
カスタムクラス設定画面
選択したテキストに、カスタムクラスで「注意ラベル」を設定してる例です。
カスタムクラスのメニュー表示例

画像サイズ

メディア画像の表示サイズの選択肢を設定できます。値は % で設定します。

画像サイズの選択肢をラベルと値(%)で設定
画像サイズ設定画面
画像のポップアップメニューのサイズ選択肢に表示されます。
画像サイズのメニュー表示例

カラーパレット

ブロックエディター内で使用するカラパレットの選択肢を設定します。

16進数のカラコードで指定します。(例:#330000)
カラーパレット設定画面
色選択UIの下に、設定したカラーのリストが表示されます。
カラーパレットの表示例

文字サイズ

選択したテキストのフォントサイズを変更する時の、文字サイズの選択肢を設定します。

*「メニュー設定」で「文字サイズ」にチェックが入っている必要があります。

ラベルと値(px,em,rem)のセットで、選択肢を設定します。
文字サイズ設定画面
選択したテキストの文字サイズを、文字サイズ選択肢から選択したサイズに変更します。
文字サイズのメニュー表示例

フォント

選択したテキストのフォントを変更する時の、フォントの選択肢を設定します。

*「メニュー設定」で「フォント」にチェックが入っている必要があります。

ラベルとフォント名のセットで、選択肢を設定します。
フォント設定画面
選択したテキストのフォントを、フォント選択肢から選択したフォントに変更します。
フォントのメニュー表示例

ブロックエディターの基本ブロック


配置機能やカラム機能を閲覧画面で利用する場合は、テーマ側でユニット機能利用時に閲覧側で必要になるCSS の適用が必要です。


ブロックエディターでは、スラッシュコマンド(/)の入力やブロックメニューから、さまざまな種類のブロックを挿入できます。ここでは、基本とレイアウトのブロックについて説明します。

基本

段落

Ver. 3.2.0 以降で利用できます。

通常のテキストを記述するためのブロックです。デフォルトのブロックタイプであり、見出しやリスト以外のテキストは段落として扱われます。Enter を押すと次の段落になり、Shift + Enter で改行が挿入されます。

<p>...</p>

見出し

Ver. 3.2.0 以降で利用できます。

見出しレベル1〜6に対応するブロックです。文書の構造化やアウトラインの作成に使用します。

ブロック

ラベル

出力HTML

heading1

見出し1

<h1>...</h1>

heading2

見出し2

<h2>...</h2>

heading3

見出し3

<h3>...</h3>

heading4

見出し4

<h4>...</h4>

heading5

見出し5

<h5>...</h5>

heading6

見出し6

<h6>...</h6>

リスト

Ver. 3.2.0 以降で利用できます。

順序なしリスト(箇条書き)を挿入します。

<ul><li>...</li></ul>

番号付きリスト

Ver. 3.2.0 以降で利用できます。

順序付きリストを挿入します。

<ol><li>...</li></ol>

引用

Ver. 3.2.0 以降で利用できます。

引用文を記述するためのブロックです。

<blockquote>...</blockquote>

コード

Ver. 3.2.0 以降で利用できます。

コードブロックを挿入します。等幅フォントで表示され、改行やスペースがそのまま保持されます。

<pre><code>...</code></pre>

画像

Ver. 3.2.0 以降で利用できます。

メディアから画像を挿入するブロックです。メディアライブラリと連携し、大元のメディアで画像を差し替えると同一メディアIDを持つすべての画像ブロックが自動で更新されます。

編集メニューで設定できる項目:

  • 配置: 左・中央・右

  • 画像サイズ: 編集画面設定 > ブロックエディター設定で登録した選択肢(例: 100%, 75%, 66%)から選択。

  • キャプション・代替テキスト: アクセシビリティやSEOのためにも設定を推奨

  • リンク: 画像クリック時のリンク先、別タブで開くの有無

  • 拡大表示: デフォルトで有効。SmartPhoto によるライトボックス表示。

  • メイン画像に設定: 編集画面にメディアのカスタムフィールド(blockEditorConfig.setMainImageMark で指定)がある場合、そのフィールドに選択中の画像をセット可能

その他:

  • HTMLをコピー&ペーストしたとき、画像のURLが自サイト内の同一パスに存在するファイルを指している場合、相対パスに自動変換される

  • ペーストやURLで挿入した画像(メディア未登録)は、画像を選択した状態で表示されるアップロードボタンからメディアライブラリに登録できる

<div class="media-image-block align-{left|center|right}" data-type="imageBlock" data-align="..." data-width="..." data-mid="..." data-eid="..." data-no-lightbox="false">
  <figure style="max-width: ...;">
    <a href="..."><img src="..." alt="..." loading="lazy" data-mid="..." /></a>
    <figcaption class="caption">...</figcaption>
  </figure>
</div>

ファイル

Ver. 3.2.0 以降で利用できます。

メディアからファイル(PDF、Word、Excel など)を挿入するブロックです。画像以外のファイルをダウンロードリンクとして配置できます。

表示形式:

  • アイコン表示(デフォルト): ファイル種別のアイコンとキャプションを表示

  • ボタン表示: リンク風のボタンとして表示。キャプションの設定が必須

編集メニューで設定できる項目:

  • 配置: 左・中央・右(デフォルト: 左)

  • キャプション・代替テキスト: ボタン表示時はキャプションがリンクテキストになる

  • 別タブで開く: リンクを target="_blank" で開くかどうか

  • メディア選択・編集: メディアライブラリからファイルを選択・差し替え

<div class="media-file-block align-{left|center|right}" data-type="fileBlock" data-display-type="icon|button" data-icon="..." data-extension="..." data-file-size="...">
  <a href="...">
    <img src="..." alt="..." />
    <p class="caption">...</p>
  </a>
</div>

※ 別タブで開くが有効な場合は target="_blank" と rel="noopener noreferrer" が付与されます。

リンクボタン

Ver. 3.2.0 以降で利用できます。

ボタン風のリンクを挿入するブロックです。ブロック内でテキストを直接編集でき、そのテキストがボタンのラベルになります。CTA(Call to Action)やダウンロードリンクなどに適しています。

編集メニューで設定できる項目:

  • 配置: 左・中央・右(デフォルト: 中央)

  • リンクURL: クリック時の遷移先

  • 別タブで開く: target="_blank" の有無

操作:

  • ブロックを選択してテキストを入力すると、ボタンに表示される文言を編集できる

  • Enter で次のブロックへ、Backspace で空の場合はブロック削除

<div class="link-button-block align-{left|center|right}" data-type="linkButton" data-align="...">
  <a href="..." class="link-button-block-link" data-type="button">ボタンのテキスト</a>
</div>

テーブル

Ver. 3.2.0 以降で利用できます。

表を挿入するブロックです。デフォルトで3行×3列のテーブルが作成されます。行・列の追加・削除、セルの結合、ヘッダー行の設定、横スクロール表示の設定が可能です。

<div class="tableWrapper"><table>...</table></div>

区切り線

Ver. 3.2.0 以降で利用できます。

文章の途中に区切り線を挿入するブロックです。セクションの区切りなどに使用します。

<div data-type="horizontalRule"><hr></div>

レイアウト

1カラム

Ver. 3.2.20 以降で利用できます。

コンテンツを1カラムの枠で囲みます。枠の中では通常どおりブロックの追加・編集ができます。ブロックタイプの設定でクラスを指定すると、そのクラスを付けた枠として挿入できるため、背景色や余白を付けた囲みを作るときに使えます。

初期設定ではブロックメニューに表示されません。利用する場合は、編集画面設定 > ブロックエディター設定 のブロックタイプに「1カラム」を追加してください。

<div data-type="columns" data-layout="one-column">
  <div data-type="column">...</div>
</div>

2カラムに分割

Ver. 3.2.0 以降で利用できます。

コンテンツを2カラムのレイアウトに分割します。各カラム内で通常通りブロックの追加・編集が可能です。

<div data-type="columns" data-layout="two-column">
  <div data-type="column">...</div>
  <div data-type="column">...</div>
</div>

3カラムに分割

Ver. 3.2.0 以降で利用できます。

コンテンツを3カラムのレイアウトに分割します。

<div data-type="columns" data-layout="three-column">
  <div data-type="column">...</div>
  <div data-type="column">...</div>
  <div data-type="column">...</div>
</div>

グループ

Ver. 3.2.36 以降で利用できます。

複数のブロックを 1 つのグループにまとめられます。グループごとに HTML 要素とクラス名を指定でき、グループ内・外のブロック移動にも対応しています。セクションや装飾用コンテナとして、まとまりのあるコンテンツを作る場合に使用します。

選択できる要素は div、section、article、aside、header、footer、nav です。section、aside、nav には、内容を区別できるよう aria-label を設定できます。

出力HTML

section を選び、クラス名とラベルを設定した場合は次のように出力されます。

<section data-type="group" data-tag="section" class="section-intro" aria-label="サービス紹介">
  <h2>サービス紹介</h2>
  <p>...</p>
</section>

その他の基本ブロック

HTML

Ver. 3.2.36 以降で利用できます。

HTML を直接入力して、編集画面内でプレビューを確認できます。テキストブロックとは別に、HTML を明示的に編集したい場合に使用します。

保存するHTML

HTML ブロックは、編集用の機能タグとして保存されます。data-block-props には、入力したHTMLを含むJSONをBase64でエンコードした値を指定します。

<acms-block-editor-function-tag
  data-block-type="html"
  data-block-props="eyJodG1sIjoiPHA+5Lu75oSP44GuSFRNTDwvcD4ifQ==">
</acms-block-editor-function-tag>

公開時のHTML

公開時には機能タグが展開され、html に指定した内容がそのまま出力されます。

<p>任意のHTML</p>

CSV・APIから入稿する場合

CSVインポートなど編集画面を通さずに登録する場合は、data-block-props を作る代わりに、入稿用タグ <acms-block-editor-html-block> でHTMLを囲んで指定できます。取り込み時に上記の機能タグへ変換して保存されるため、編集画面ではHTMLブロックとして表示・編集できます。

<acms-block-editor-html-block>
  <div class="custom">任意のHTML</div>
</acms-block-editor-html-block>
  • タグの中身は加工せず、そのままHTMLブロックの内容になります(前後の空白は除きます)。閉じていないタグや <script> の中身も書いたとおりに保持されます。

  • 中身は最初の </acms-block-editor-html-block> までです。HTMLブロックを入れ子にすることはできません(入れ子にした場合は警告が出ます)。

  • 危険なタグの除去など公開時のサニタイズは、通常のHTMLブロックと同じです。

埋め込み(oEmbed)

Ver. 3.2.36 以降で利用できます。

ブロックメニューまたはスラッシュコマンドから「埋め込み」を選び、外部サービスの URL を貼り付けます。配置、表示サイズ、キャプションを設定できます。埋め込み先の許可は HTMLPurifier のホスト許可リストに従うため、表示されない場合はサイト管理者に設定を確認してください。

保存するHTML

埋め込みブロックも編集用の機能タグとして保存されます。data-block-props には URL、タイトル、提供元、埋め込みHTML、配置、表示サイズ、キャプションなどをJSONとして持ちます。手作業で作るより、ブロックエディターで作成した値やエクスポートした値を利用することを推奨します。

<acms-block-editor-function-tag
  data-block-type="embed"
  data-block-props="...">
</acms-block-editor-function-tag>

公開時のHTML

許可された埋め込みHTMLがある場合は、figure 内の data-embed-content に展開されます。埋め込みHTMLが取得できない、または許可されない場合は、URL・タイトル・説明などを使ったリンクカードとして出力されます。

<div class="embed-block align-left" data-type="embedBlock" data-url="..." data-provider="..." data-align="left" data-width="100%">
  <figure style="width: 100%; max-width: 100%;">
    <div data-embed-content="" style="width: 100%;">...</div>
    <figcaption class="caption">...</figcaption>
  </figure>
</div>

CSV・APIから入稿する場合

埋め込みは、URLを指定した入稿用タグ <acms-block-editor-embed-block> で指定できます。取り込み時に、編集画面でURLを貼り付けたときと同じ仕組みで埋め込み情報を取得し、埋め込みブロックとして保存します。

<acms-block-editor-embed-block url="https://www.youtube.com/watch?v=xxxxxxxxxxx"></acms-block-editor-embed-block>
  • url は必須です。id・class を指定するとブロックに引き継がれます。

  • 埋め込みHTMLが取得できず、OGPなどのページ情報だけ取得できた場合は、リンクカードとして保存されます。

  • URLが不正な場合や取得に失敗した場合は、インポートを止めずに通常のリンクの段落へ変換し、警告を残します(http・https 以外のURLはリンクにせず、文字列として残します)。

  • 埋め込み情報を取得するのは取り込み時の一度だけで、公開時に外部へ取りに行くことはありません。同じURLは一度の取り込みの中で繰り返し取得しません。

  • 閉じタグは省略できます。タグの中身を書いた場合、中身は埋め込みには使われず通常の本文として残ります。

ブロックエディターのHTMLをデータとして登録する

ブロックエディターは、入力したHTMLを編集用のデータとして保存し、公開時に画像・ファイル・埋め込みなどを必要なHTMLへ整形して出力します。CSVインポートや外部システムからの登録では、このページにある編集用HTMLをフィールド値として登録してください。閲覧ページに出力されたHTMLをコピーするのではなく、エディターで保存・エクスポートされたHTMLを使うと、再編集できる状態を保てます。

CSVインポートでは、カスタムフィールドは フィールド名@block-editor、本文ユニットは unit@block-editor[1] の列にHTMLを入れます。CSVではセル内のHTMLをCSVの規則に従って引用符で囲みます。

entry_title,my_block_field@block-editor,unit@block-editor[1]
サンプル,"<p>カスタムフィールドの本文</p>","<h2>本文の見出し</h2><p>本文</p>"

APIなどからブロックエディターフィールドへ登録する実装でも、同じ編集用HTMLを渡します。段落・見出し・リスト・グループなどはこのページのHTML例を組み合わせて生成できます。HTMLブロックと埋め込みブロックは、data-block-props を生成する代わりに、上記の入稿用タグ(<acms-block-editor-html-block> / <acms-block-editor-embed-block>)を使えます。(入稿用タグは Ver. 3.2.36 以降で利用できます)

CSVインポートで埋め込みの取得に失敗した行は、処理ログに警告が表示され、「失敗した行をダウンロード」の対象になります。インポート完了時には「メディア取込のみ失敗した件数」と「埋め込みの取得のみ失敗した件数」が別々に表示されます。ドライランでは埋め込みの取得は行わず、URLの形式だけを確認します。

画像・ファイルブロックでは data-mid などメディアに紐づく情報も保存されます。別環境へ移す場合は、メディアのインポートとIDの対応付けもあわせて行ってください。

プラグイン(拡張アプリ)から入稿用タグを追加する

Ver. 3.2.36 以降で利用できます。

独自ブロックを追加したプラグイン(拡張アプリ)では、block-editor.authoring-tags にハンドラ(Acms\Services\BlockEditor\Contracts\AuthoringTagHandler の実装)を登録すると、独自の入稿用タグをCSVインポートなどで使えるようになります。同じタグ名を登録するとコアの入稿用タグも差し替えられます。独自に本文を登録する処理を実装する場合は、Application::make('block-editor.authoring')->convert($html) を通すと、CSVインポートと同じ変換が行われます。

// 拡張アプリの ServiceProvider::init()
use Acms\Services\BlockEditor\Authoring\AuthoringContext;
use Acms\Services\BlockEditor\Authoring\AuthoringTag;
use Acms\Services\BlockEditor\Contracts\AuthoringTagHandler;
use Acms\Services\BlockEditor\FunctionTag;

Application::make('block-editor.authoring-tags')->register(new class implements AuthoringTagHandler {
    public function getTagName(): string
    {
        return 'my-plugin-callout'; // カスタム要素名(acms-block-editor- 以外の接頭辞)
    }

    public function convert(AuthoringTag $tag, AuthoringContext $context): string
    {
        return FunctionTag::render('my-plugin-callout', [
            'tone' => $tag->attribute('tone', 'info'),
            'body' => $context->convert(trim($tag->innerHtml)),
        ]);
    }
});

AuthoringTag からは属性(attribute())とタグの中身(innerHtml)を、AuthoringContext からは警告の記録(warn())や中身の入稿用タグの変換(convert())を利用できます。公開時の展開は block-editor.function-tags に登録したハンドラが、編集画面での表示は対応するTiptap拡張が担います。

ブロックエディターの編集画面に閲覧画面と同じスタイルを適用する


ブロックエディターは、見出し・段落・画像・テーブル・カラムなどを「ブロック」単位で組み立てる本文エディターです。標準では、管理画面の編集画面と閲覧画面で見た目が揃うように設計されています。このドキュメントでは、その結論(やること)を先に示し、続いてなぜそれで揃うのかを仕組みの流れに沿って解説します。

ブロックエディターそのものの基本的な使い方は、公式ドキュメント ブロックエディター を参照してください。

結論

編集画面のプレビューと閲覧側の表示を一致させるには、次の 3 点を押さえます。

  • ラッパークラスを揃える — 編集領域と閲覧画面の本文を同じクラスで囲む。標準は acms-entry。変えたい場合は include/edit/custom.js 等で上書きする。

  • そのクラスを起点に CSS を書く — .acms-entry { ... } のように、揃えたラッパークラスを起点にスタイルを定義する。

  • 同じ CSS を両画面で読み込む — 管理画面は admin.html の @section("editor-css")、閲覧画面はテーマのテンプレートで、同一の CSS を読み込む。

最短ルートは「ラッパークラスを標準の acms-entry のまま使い、.acms-entry を起点にした CSS を 両画面で読み込む」ことです。標準テーマはこの形になっています。以降で、なぜこれで揃うのかを順に説明します。

仕組みの流れ

1. 編集領域と閲覧画面上の本文が同じラッパークラスを共有する

すべての起点は、編集画面のプレビュー領域と閲覧画面の出力が、同じラッパークラスを共有していることです。

  • 編集画面:ブロックエディターの編集領域に、ACMS.Config.blockEditorConfig.editorProps.editorProps.attributes.class で指定したクラスが付与される。デフォルト値は acms-entry。

  • 閲覧画面:エントリー本文(ブロックエディターのユニット出力を含む)が、同じ acms-entry クラスでラップされる。

            .acms-entry を起点にした CSS(例: editor-style.css)
                          │
        ┌─────────────────┴──────────────────┐
        ▼                                     ▼
  管理画面の編集領域                      閲覧画面のエントリー本文
  (editorProps の class = acms-entry)   (テンプレートで .acms-entry でラップ)

両者が同じクラスを持つので、そのクラスを起点にした 1 つの CSS が両方に等しく効きます。これが「揃う」ことの本質です。

2. スタイルは acms-entry を起点に記述する

CSS 側は、この acms-entry を起点にしたセレクタで記述します。

.acms-entry {
  /* 本文領域用のスタイル */
  img,
  video {
    max-width: 100%;
    height: auto;
  }
  p {
    font-size: 16px;
  }
}

3. 管理画面でその CSS を読み込む

管理画面のレイアウトでは、テーマ側で admin.htmlをカスタマイズします。 editor-css セクションでエディター用 CSS を読み込んでいます。

<!-- themes/ご利用テーマ/admin.html -->
@extends("/_layouts/admin.html")
@section("editor-css")
<link rel="stylesheet" href="/path/to/editor-style.css">
@endsection

ブロックエディターの編集画面プレビュー領域を囲むHTMLのクラス属性に acms-entry が適用されて出力されるため、同じCSSを共有することができます。

.acms-admin-block-editor-container
  └─ .acms-admin-block-editor
       └─ .acms-admin-block-editor-content   ← ここに acms-entry が付く
            └─ .ProseMirror                   ← TipTap (ProseMirror) の編集領域

4. 閲覧画面でも同じ CSS を読み込む

閲覧画面では、ブロックエディターのHTMLをacms-entry クラス属性をつけたHTMLで囲みます。

<!-- 標準テンプレートの場合 -->
<div class="acms-entry">
<!-- BEGIN unit:veil -->
@include("/include/unit.html")
<!-- END unit:veil -->
</div>
<!-- Twigテンプレートの場合 -->
<div class="acms-entry">
{% if entry.body %}
  {{ entry.body|raw }}
{% endif %}
</div>

閲覧画面のテーマでも .acms-entry を起点にしたスタイルを読み込むことで、手順 1〜3 と合わさって、編集画面と同じ見た目が再現されます。

テーマ独自のスタイルを反映する

「閲覧画面でブロックエディターのコンテンツに独自スタイルを当てている。それを編集画面のプレビューにも反映したい」という場合も、流れは結論の 3 点と同じです。状況に応じて次のいずれかを選びます。

ラッパークラスを変えずに済む場合(推奨)

標準のラッパークラス acms-entry をそのまま使うなら、追加設定は不要です。.acms-entry を起点にしたCSSを用意してください。同じ CSS を閲覧画面のテンプレートでも読み込めば、両画面で一致します。

/* 例: css/editor-style.css */
.acms-entry {
  h2 {
    padding-block-end: 0.25em;
    border-block-end: 2px solid currentcolor;
  }
}

ラッパークラスをテーマ独自のものに変える場合

閲覧画面側で acms-entry 以外のクラス(例:custom-content-style)でスタイルを当てている場合は、編集画面のラッパークラスもそれに合わせます。テーマの include/edit/custom.js 等で editorProps のクラスを上書きしてください。

/* themes/ご利用テーマ/include/edit/custom.js */
ACMS.Ready(function () {
  ACMS.Config.blockEditorConfig.editorProps.editorProps.attributes.class = 'custom-content-style';
});

また、カスタムフィールドの場合は、data-editor-props 属性でフィールド毎に設定を上書き可能です。ブロックエディターの編集領域に付与されるクラスをこのブロックエディターフィールドのみ上書きしています

<acms-block-editor
  editor-props='\{"attributes":\{"class":"custom-content-style"\}\}'
>
 ...
</acms-block-editor>

上記の例では、テンプレートエンジンに変数として解決されないようにするため、波括弧をエスケープしています。@verbatimブロックを利用することでも同様の回避が可能です。

設定したクラスはエディターの編集領域に付与されます。

クラス名を変えたら、include/edit/custom.js 等のラッパークラスカスタマイズ処理を記述したJavaScriptと本文領域のCSS をテーマ直下 admin.html で読み込むようテーマ側をカスタマイズします。

/* 例: css/editor-style.css */
.custom-content-style {
  /* 本文領域のスタイル定義を書く */
}
<!-- /themes/ご利用テーマ/admin.html -->
@section("editor-css")
<link rel="stylesheet" href="/css/editor-style.css">
@endsection

@section("admin-js")
@parent
<!-- 編集画面用カスタムJSを読み込み -->
<script src="/include/edit/custom.js"></script>
@endsection

管理画面でのみ調整したい差分

レイアウト上、編集画面と閲覧画面で完全に同一にはできない部分(操作 UI のための余白など)は、管理画面のラッパー .acms-admin-block-editor を起点にしたセレクタで個別に上書きできます。標準テーマでも、カラムの間隔を管理画面だけ固定値にしている例があります。

/* 閲覧画面側 */
.acms-entry [data-type='columns'] {
  gap: var(--unit-gap-x);
}

/* 管理画面側(操作しやすいよう余白を固定) */
.acms-admin-block-editor [data-type='columns'] {
  gap: 1rem !important;
}

主なクラス名・設定キー

名前

種別

役割

acms-entry

CSS クラス

エントリー本文/編集領域の共通ラッパー(デフォルト値)。

acms-admin-block-editor

CSS クラス

編集画面のエディター領域(管理画面専用の上書き起点)

acms-admin-block-editor-content

CSS クラス

編集領域の本文部分。内側に acms-entry が入る

ACMS.Config.blockEditorConfig.editorProps.editorProps.attributes.class

JavaScript 設定

編集領域に付与するラッパークラス。テーマで上書き可能

@section("editor-css")

セクション

管理画面で読み込む本文用 CSS を上書きするための差し込み領域。テーマで上書き可能

@section("admin-js")

セクション

管理画面で読み込む JavaScript を上書きするための差し込み領域。テーマで上書き可能

カスタムフィールドのブロックエディター設定をフィールド毎に上書きする


ブロックエディターのHTML(<acms-block-editor>)の settings 属性に JSON 形式で個別で設定を上書きすることが可能です。

<acms-block-editor
  settings='\{"features":\{"textItalic":false,"customClass":true\}\}'
>
</div>
<!-- 旧方式(自動的に <acms-block-editor> へ変換される) -->
<div 
  class="js-block-editor"
  data-settings='\{"features":\{"textItalic":false,"customClass":true\}\}'
>
</div>

上記の例では、テンプレートエンジンに変数として解決されないようにするため、波括弧をエスケープしています。@verbatimブロックを利用することでも同様の回避が可能です。

ブロックエディターの基本的な使い方は、ブロックエディターの基本を参照してください。

設定可能なオプション

キー

型

マージ方式

概要

features

Partial<FeaturesSetting>

浅いマージ

テキスト装飾・カスタムクラスなど機能 ON/OFF

blockMenus

BlockMenuOverride

専用スキーマ

「ブロックを追加」メニューの allow / deny / 完全置換

fontSize

FontSizeItem[]

配列差し替え

フォントサイズ選択肢

fontFamily

FontFamilyItem[]

配列差し替え

フォントファミリー選択肢

customClass

CustomClassItem[]

配列差し替え

テキストに当てるカスタムクラス選択肢

imageSizes

ImageSizesItem[]

配列差し替え

画像サイズ選択肢

colorPalette

string[]

配列差し替え

カラーピッカーのパレット

マージ方式の意味:

  • 浅いマージ — 指定したキーだけベース値を上書き、未指定キーはベース値を維持

  • 配列差し替え — ベース値を破棄し、指定した配列で完全に置き換え

  • 専用スキーマ — キー固有の解釈ロジック

未指定のキーはベース値が維持されます。null を渡したキーは「指定なし」と同じ扱いです。


features

テキストメニューに表示する装飾機能や、カスタムクラス選択 UI の表示有無を切り替えます。

型: Partial<FeaturesSetting> マージ方式: 浅いマージ

キー

型

内容

textItalic

boolean

斜体

textUnderline

boolean

下線

textStrike

boolean

取り消し線

textCode

boolean

インラインコード

textMarker

boolean

マーカー(ハイライト)

textColor

boolean

文字色

fontSize

boolean

フォントサイズ選択 UI

fontFamily

boolean

フォントファミリー選択 UI

textSubscript

boolean

下付き文字

textSuperscript

boolean

上付き文字

customClass

boolean

カスタムクラス選択 UI

tableBgColor

boolean

テーブルセル背景色

imageDefaultLightbox

boolean

画像挿入時にデフォルトで拡大表示(Lightbox)を有効にするか

例:

{
  "features": {
    "textItalic": true,
    "textColor": true,
    "fontSize": false
  }
}

指定したキーだけベース値を上書きします。例の場合、textItalic textColor fontSize 以外は編集画面設定が利用されます。


blockMenus

「ブロックを追加」メニュー(スラッシュコマンドおよびブロックメニュー)を上書きします。

解釈順序:

blocks が配列 ?
  ├─ Yes → blocks の内容だけがメニューになる(base / allow / deny は無視)
  └─ No  → base メニューを取得
            └─ allow があれば identifier が含まれるものだけ残す
            └─ deny があれば identifier が含まれるものを除外

blockMenus.allow

型: string[](識別子の配列。識別子の形式は 識別子 を参照)

ベースメニューから「リストに含まれる識別子だけ」を残します。

{ "blockMenus": { "allow": ["paragraph", "heading2", "heading3", "bulletList"] } }

blockMenus.deny

型: string[](識別子の配列)

ベースメニューから「リストに含まれる識別子」を除外します。

{ "blockMenus": { "deny": ["heading1", "image", "linkButton"] } }

allow と deny を併用した場合は、まず allow でフィルタしてから deny で除外します。

blockMenus.blocks

型: BlockMenuEntry[]

指定した場合、ベース・allow・deny を完全に無視し、この配列だけがメニューになります(完全置換)。

キー

必須

内容

type

◯

ブロックタイプ名。存在しない type のエントリは無視される

label

メニューに表示するラベル。省略時は type のデフォルトラベル

icon

Material Symbols のアイコン名。省略時は type のデフォルトアイコン

class

このエントリを選んだとき、生成されるブロックに当てる class

group

メニューのグループ見出し

配列順序と group の挙動:

  • 配列順がそのままメニューの並び順になる

  • group を省略すると直前エントリの group を引き継ぐ。最初のエントリで省略すると その他 グループに入る

  • 同じ identifier(type + class)を複数書いた場合は後勝ち(最後のエントリの内容で上書きされ、配置順も最後の位置に揃う)

  • 同じ type を class 違いで複数並べることが可能。メニューには別エントリとして並ぶ

  • type が空文字または非文字列のエントリは無視される

例:

{
  "blockMenus": {
    "blocks": [
      { "type": "paragraph",  "label": "本文",      "group": "テキスト" },
      { "type": "heading2",   "label": "中見出し",  "group": "テキスト" },
      { "type": "heading3",   "label": "小見出し",  "group": "テキスト" },
      { "type": "paragraph",  "label": "リード文",  "class": "lead", "group": "テキスト" },
      { "type": "image",      "label": "画像",      "group": "メディア" },
      { "type": "linkButton", "label": "ボタン",    "group": "メディア" }
    ]
  }
}

fontSize

フォントサイズ選択 UI の選択肢を差し替えます。

型: FontSizeItem[] マージ方式: 配列差し替え

例:

{
  "fontSize": [
    { "label": "小",   "value": "0.875rem" },
    { "label": "標準", "value": "1rem" },
    { "label": "大",   "value": "1.25rem" }
  ]
}

機能の表示自体は features.fontSize で制御します。


fontFamily

フォントファミリー選択 UI の選択肢を差し替えます。

型: FontFamilyItem[] マージ方式: 配列差し替え

例:

{
  "fontFamily": [
    { "label": "ゴシック", "value": "sans-serif" },
    { "label": "明朝",     "value": "serif" }
  ]
}

機能の表示自体は features.fontFamily で制御します。


customClass

テキストに当てるカスタムクラス選択 UI の選択肢を差し替えます。

型: CustomClassItem[] マージ方式: 配列差し替え

例:

{
  "customClass": [
    { "label": "強調",       "value": "is-emphasis" },
    { "label": "注意書き",   "value": "is-caution" }
  ]
}

機能の表示自体は features.customClass で制御します。


imageSizes

画像ブロックのサイズ選択 UI の選択肢を差し替えます。

型: ImageSizesItem[] マージ方式: 配列差し替え

例:

{
  "imageSizes": [
    { "label": "幅いっぱい", "value": "100%" },
    { "label": "中",         "value": "50%" },
    { "label": "小",         "value": "25%" }
  ]
}

colorPalette

文字色/背景色などカラーピッカーで表示するパレットを差し替えます。

型: string[](CSS の色値) マージ方式: 配列差し替え

例:

{
  "colorPalette": ["#000000", "#ffffff", "#ef4444", "#3b82f6"]
}

識別子

blockMenus.allow および blockMenus.deny で指定する文字列は 識別子(identifier) です。識別子の形式は次のいずれか。

形式

マッチ対象

例

type

class なしの該当ブロック

paragraph、heading2

type.class

指定 class が当たっているブロック

paragraph.lead、heading2.section-title

識別子は厳密マッチです。heading2 は class なしの見出し2 にしかヒットしません。ベースに class="section-title" 付きで登録された見出し2 を制御したい場合は heading2.section-title のように完全な形で書きます。

ベースメニューに登録されているブロックの identifier は、管理画面の「ブロックエディター設定」で登録した内容と BLOCK_DEFINITIONS から決まります。

利用できる type 一覧

blockMenus.blocks[].type および識別子の type 部分で指定できる主なタイプの一覧は次の通りです。

type

内容

paragraph

段落

heading1〜heading6

見出し(レベル別)

bulletList

箇条書き

numberedList

順序付きリスト

blockquote

引用

codeBlock

コードブロック

image

画像

file

ファイル

linkButton

リンクボタン

table

テーブル

horizontalRule

水平線

columns1 / columns2 / columns3

カラム(1〜3 列)

存在しない type を指定した blocks エントリは無視されます。

注意事項

  • メニュー絞り込みは「入力候補」の制限であり、コンテンツ構造の保証ではありません。 メニューから除外したブロックタイプも、Markdown ショートカット(## で見出し、- で箇条書き、> で引用 など)や TipTap のキーボードショートカット(Cmd+Alt+1〜6 での見出し化など)からは作成できる場合があります。

  • data-settings 属性に渡す JSON が JSON.parse できないと、上書きは適用されずベース設定で動作します。属性値の引用符の入れ子に注意してください

  • 識別子の判定は厳密マッチです。type のみで書いた識別子は class 付きブロックには当たりません

  • blocks で指定したエントリの type が存在しない場合、そのブロックは無視されます。スペルミス・対応 type 一覧との不整合に注意してください