SPOTブログ

2016/09/20

EC-CUBE3でブロックを追加する方法

EC-CUBE3をカスタマイズする中で、ブロックを自分で追加したい、というケースが出てくると思います。

フリーエリアのような、入力した内容をそのまま表示させるだけのブロックであれば、なにも考えずに管理画面からブロックを作成すればOKです。

ただ、「カテゴリの一覧を表示する」などのロジックが絡むブロックの場合、管理画面からそのままブロックを作るだけでは動作しません。私も、カテゴリブロックをコピーして、「メインメニュー」ブロックを作成しようと思ったのですが、コピーしただけでは動きませんでした。

そこで、今回は、ロジックの絡んだブロックの作りかたについて、詳しく紹介します。

今回のゴール

  • デフォルトで存在する「カテゴリ」ブロックと同様の機能の「メインメニュー」ブロックを作成する

手順1 まずは管理画面からブロックを追加

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-20-13-07-43

「コンテンツ管理」→「ブロック管理」の下にある「新規入力」ボタンをクリックして、新しくブロックを作ります。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-20-13-11-05

次に、ブロックの詳細入力画面になるので、以下の通り設定します。

  • ブロック名を「メインメニュー」
  • ファイル名 main_menu.twig
  • ブロックデータは「カテゴリ」のものをコピーして入れておきます。

手順2 データベースを直接いじって、logic_flgを1にする

このままでは、ロジック無しのブロックとして扱われますので、ブロックを配置しても、なにも表示されません。

そこで、データベースのdtb_blockを直接変更して、logic_flgが0になっているので、これを1に変更します。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-20-13-15-43

phpMyAdminやAdminerなど、データベースをいじれるツールを使って、dtb_blockを見ると各ブロックのテーブルが出てきます。

この中で、今回追加した「メインメニュー」ブロックのlogic_flgを見ると0になっています。
ここを1に変更することで、frontControllerProviderにコントローラーを探しに行く処理が追加されるようです。

手順3 コントローラーを追加する

次に、今回追加した「メインメニュー」ブロック用のコントローラーをFrontControllerProviderに登録します。

/src/Eccube/ControllerProvider/FrontControllerProvider.php

73-78行目あたりにブロックを定義している箇所がありますので、ここに以下の記述を追加します。

次に、コントローラーを作成します。

今回はカテゴリブロックと同様の機能を作ることがゴールなので

/src/Eccube/Controller/Block/CategoryController.php

をコピーして

/src/Eccube/Controller/Block/MainMenuController.php

として保存すればOKです。

これで、メインメニューブロックが追加できました。

あとは管理画面でブロックを配置すれば、カテゴリブロックと同じ機能を「メインメニューブロック」で実現することが出来ていることが確認できると思います。

この先は、実際に必要な機能に合わせて、コントローラーやtwigのテンプレートを修正すればOKです。