ブロックエディター

目次

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


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

主な特徴・機能

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

  • スラッシュコマンド

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

  • メディア機能に対応

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

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

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

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

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

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

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

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

  • マークダウンに対応

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

使用方法

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

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

記述ルール

  • js-block-editor クラスを付与した要素が、ブロックエディタとして初期化

  • data-target 属性で、エディタ本体を表示する要素を指定

  • data-html 属性で、編集後のHTMLが格納される input 要素を指定

  • 必ず <input type="hidden" name="xxxxx:extension" value="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] <!-- ACMSテンプレートの場合 -->
{{ hoge|safe_html }} <!-- Twigテンプレートの場合 -->

基本設定

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

blockEditorMark: '.js-block-editor',
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',
      },
    },
  },
},

メイン画像設定機能

メディア画像のメニューにメイン画像に設定するボタンが用意されています。このボタンを押した時に 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>

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


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

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

画像リサイズ

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

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

ブロックメニュー

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

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

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

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

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

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

メニュー設定

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

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

カスタムクラス

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

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

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

画像サイズ

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

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

カラーパレット

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

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

文字サイズ

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

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

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

フォント

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

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

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

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


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


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

基本

段落

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

<p>...</p>

見出し

見出しレベル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>

リスト

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

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

番号付きリスト

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

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

引用

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

<blockquote>...</blockquote>

コード

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

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

画像

メディアから画像を挿入するブロックです。メディアライブラリと連携し、大元のメディアで画像を差し替えると同一メディア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>

ファイル

メディアからファイル(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" が付与されます。

リンクボタン

ボタン風のリンクを挿入するブロックです。ブロック内でテキストを直接編集でき、そのテキストがボタンのラベルになります。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>

テーブル

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

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

区切り線

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

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

レイアウト

2カラムに分割

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

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

3カラムに分割

コンテンツを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>

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


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

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

結論

編集画面のプレビューと閲覧側の表示を一致させるには、次の 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';
});

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

クラス名を変えたら、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 を上書きするための差し込み領域。テーマで上書き可能