EC-CUBE3のブロックに動的要素を与える
EC-CUBEの強みの一つはパーツをブロック毎に作り、どのページにもはめ込む事が視覚的に出来る。
結構要望として貰う例として、ヘッダ部分に永続的に現在何個の商品が入っているか。と言う事を出したいと言う要望が多い。
特にデフォルトのEC-CUBEのパーツを一旦すべて抜いた上でヘッダを新しく作った際に既存のパーツを組み込む事を想定していないと言う事が多い。
デザイン会社さんにEC-CUBEのフレームワークに準じた形で。と言って納品してくれる所も少ないだろう。
ただ、Symfony2の仕様から「ページ全体」に変数を登録するのではなく、パーツ毎に変数を登録しなければならない。
ぶっちゃけるととか使えるようにしようよ。。と思う。
この辺をフレームワークに変更しているのは、魔改造が過ぎてロックオンさんにどないなっとんのじゃ!と言う質問が多かったからあまり触らせたくないのかな。と邪推したり。
今回はヘッダに動的要素を組み込む。
1. コントローラーとしてヘッダブロックを認識させる
/src/Eccube/ControllerProvider/FrontControllerProvider.php
## 73行目あたり // block $c->match('/block/category', '\Eccube\Controller\Block\CategoryController::index')->bind('block_category'); $c->match('/block/cart', '\Eccube\Controller\Block\CartController::index')->bind('block_cart'); $c->match('/block/search_product', '\Eccube\Controller\Block\SearchProductController::index')->bind('block_search_product'); $c->match('/block/news', '\Eccube\Controller\Block\NewsController::index')->bind('block_news'); $c->match('/block/login', '\Eccube\Controller\Block\LoginController::index')->bind('block_login'); ## ヘッダを追加する ## $c->match('/block/header', '\Eccube\Controller\Block\HeaderController::index')->bind('block_header');
これでコントローラを利用してヘッダブロックに動的変数を組み込む為の準備は出来た。
今度はコントローラを作成する。コントローラ自体は他のモノをコピれば良い。自分はCartController.phpをコピーした。
コントローラにCart変数をセットする。
2. header用コントローラの作成
/src/Eccube/Controller/Block/HeaderController.php
namespace Eccube\Controller\Block; use Eccube\Application; class HeaderController { public function index(Application $app) { /** @var $Cart \Eccube\Entity\Cart */ $Cart = $app['eccube.service.cart']->getCartObj(); return $app->render('Block/header.twig', array( 'Cart' => $Cart, )); } }
これでヘッダーへの変数を設定する事ができた。
あとは、renderで指定したテンプレートに現在のカートの商品数を表示させる。
/app/template/default/Block/header.twig
{% if Cart.total_quantity == 0 %} 現在カートに商品はありません {% else %} 現在カートには{{ Cart.total_quantity }}つの商品が入っています {% endif %}
いちいちコントローラを作ってそこ変数を登録してと言う事が必要なので非常に面倒くさい。
そして、PHPを齧った事さえあればちょちょいと修正出来ると言う敷居を大きく上げた。
言ってしまえば、かじった程度でお金が絡むシステムを気軽に修正するのは怖いよと言う意思表示に感じられる。