引き続きEC-CUBEネタです。
やったことはすぐに記録しないと忘れてしまうので、2、3日EC-CUBEネタが続くかもしれません。
カテゴリブロックに表示するカテゴリを取得する処理は/data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Category.php*1 のactionメソッドに書かれているので、このactionメソッドをclass_extends内の子クラスにコピーして、下記の部分を修正します。
カテゴリ取得部分の修正
$this->arrTree = $this->lfGetCatTree($this->tpl_category_id, true); // ↓ $this->arrTree = $this->lfGetCatTree($this->tpl_category_id, false);
LC_Page_FrontParts_Bloc_Category_Ex.phpのソースはこのようになります。*2
<?php require_once CLASS_REALDIR . 'pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Category.php'; class LC_Page_FrontParts_Bloc_Category_Ex extends LC_Page_FrontParts_Bloc_Category { // }}} // {{{ functions /** * Page を初期化する. * * @return void */ function init() { parent::init(); } /** * Page のプロセス. * * @return void */ function process() { parent::process(); } /** * Page のアクション. * * @return void */ function action() { // モバイル判定 switch ( SC_Display_Ex::detectDevice() ) { case DEVICE_TYPE_MOBILE: // メインカテゴリーの取得 $this->arrCat = $this->lfGetMainCat(true); break; default: // 選択中のカテゴリID $this->tpl_category_id = $this->lfGetSelectedCategoryId($_GET); // カテゴリツリーの取得 $this->arrTree = $this->lfGetCatTree($this->tpl_category_id, false); break; } } /** * デストラクタ. * * @return void */ function destroy() { parent::destroy(); } } ?>
変更したのはlfGetCatTreeメソッドの第2引数のみ。
lfGetCatTreeはカテゴリツリーの取得メソッドで、第2引数は商品数をチェックするかどうかのフラグです。
このフラグをtrueからfalseにしてやることで、商品数が0のカテゴリも取得することができます。
ビュー側の修正
カテゴリブロックのビューは/data/Smarty/templates/テンプレート名/frontparts/block/category.tplになります。
前回の記事のデバッグ方法で、取得したカテゴリを表示してみましょう。
/data/Smarty/templates/テンプレート名/frontparts/block/category.tpl
<!--{$arrTree|@debug_print_var:4:200}-->
すると、商品数0のカテゴリも取得できていますね?
ただしカテゴリブロックには表示されていないはずです。
またこれも厄介な話なのですが、先ほどのlfGetCatTreeメソッドでは通常表示するカテゴリにわざわざdisplayというフラグををもたせて、カテゴリブロックのビューでこのdeisplayを判定して表示しています。
そのため、商品数が0のカテゴリはif文の判定でこぼれてしまい表示されないのです。
取得してきた商品数0のカテゴリを表示するにはこのif文を回避する必要があります。
手っ取り早く表示させるならこんな感じです。
<!--{if $arrTree[cnt].display == 1}--> ↓ <!--{if $arrTree[cnt].display == 1 or true}-->
もちろんif文を閉じたタグも含めて削除してもOKです。
EC-CUBE厄介奥が深いです。。。σ(^_^; )*3