動的ブロックとは何か?
動的ブロックとはユーザー、時間帯、表示するページなどによって内容を変えることができるブロックです。EC-CUBE3の場合は独立したURIを持った1つの「ページ」だと考えれば本質に近いと思います。
Twigには別のページをテンプレート内に読み込む仕組みがあり、それを応用したものが動的ブロックです。EC-CUBE3の内部では次のようなコードでブロックの表示が実現されています。
{% if Block.logic_flg %} {% if app.config.http_cache.enabled %} {{ render_esi(path('block_' ~ Block.file_name)) }} {% else %} {{ render(path('block_' ~ Block.file_name)) }} {% endif %} {% else %} {{ include('Block/' ~ Block.file_name~ '.twig', ignore_missing = true) }} {% endif %}
(Twig参考) http://symfony.com/doc/current/templating/embedding_controllers.html
それでは実際に動的ブロックの作成手順を「新着商品ブロック」を作成しながら見ていくことにします。
手順1.コントローラを作成
ファイル:(新規作成)src/Eccube/Controller/Block/NewItemController
新規登録した商品を5つ抽出しテンプレートファイルに渡すロジックをコントローラに書いてやります。
namespace Eccube\Controller\Block; use Eccube\Application; use Symfony\Component\HttpFoundation\Request; class NewItemController { public function index(Application $app, Request $request) { $Products = $app['eccube.repository.product'] ->createQueryBuilder('p') ->orderBy('p.create_date', 'DESC') ->setMaxResults(5) ->getQuery() ->getResult(); return $app->render('Block/new_item.twig', array( 'Products' => $Products, )); } }
手順2.テンプレートを作成
app/template/default/Block/new_item.twig
コントローラから呼び出されるテンプレートファイルです。今回は単に商品名を列挙するコードを書いておきます。
<ul> {% for Product in Products %} <li>{{ Product.name }}</li> {% endfor %} </ul>
手順3.DBへブロックの情報を登録
SQL実行してブロックの情報をDBに登録します。phpMyAdminなどで行挿入してもかまいません。ここでlogic_flgを1にすることでコントローラが呼ばれるようになります。
管理画面から作成したブロックはlogic_flgが0になっていますので、もしコントローラで動作させたければ、このlogic_flgを1に変更すれば良いということになります。
INSERT INTO `dtb_block` (`device_type_id`, `block_name`, `file_name`, `create_date`, `update_date`, `logic_flg`, `deletable_flg`) VALUES (10, "新商品", "new_item", NOW(), NOW(),1,0);
手順4.コントローラとDBの紐付け
FrontControllerProvider.php
最後に正しいコントローラが呼ばれるようにコントローラとブロックをひも付けてやります。この設定がないと動作しません。
$c->match('/block/new_item', '\Eccube\Controller\Block\NewItemController::index')->bind('block_new_item');
手順5.レイアウト編集よりブロックの配置
管理画面の「コンテンツ管理」「ページ管理」と進み、右端のメニューボタンから好きなページのレイアウト編集を選択してください。ブロックの配置画面になりますので、好きな場所に今作成した「新商品」というブロックを配置して完了です。
いかがでしょうか、以上で動的ブロックが動作するようになったと思います。
なお手順2と3は管理画面からブロック作成を行うことで省力化することが可能です。その場合logic_flgを1に変更することを忘れないようにしてください。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。