EC-CUBE でパンくず



EC-CUBEバージョン2.13.3。既定のスマートフォン用テンプレートに適用。

① パンくず用ブロックを作る

デザイン管理>スマートフォン>ブロック設定

<div class="topicPath">
    <a href="<!--{$smarty.const.TOP_URL}-->">TOP</a>
    <!--{if $arrTopicPath}-->
        <!--{foreach from=$arrTopicPath item=topic}-->
                &nbsp;&gt;&nbsp;
                <!--{if $topic.url}-->
                    <a href="<!--{$topic.url}-->"><!--{$topic.title|h}--></a>
                <!--{else}-->
                    <!--{$topic.title|h}-->
                <!--{/if}-->
        <!--{/foreach}-->
    <!--{elseif $tpl_title}-->
            &nbsp;&gt;&nbsp;<!--{$tpl_title|h}-->
    <!--{/if}-->
</div>

② ブロックを配置

デザイン管理>スマートフォン>レイアウト設定

③商品一覧画面のパンくず

data/class_extends/page_extends/products/LC_Page_Products_List_Ex.php

class LC_Page_Products_List_Ex extends LC_Page_Products_List
{
    /**
     * Page のアクション.
     *
     * @return void
     */
    function action()
    {
        parent::action();

        // パンくずリスト取得
        $this->arrTopicPath = $this->lfTopicPath(
                 $this->mode
                ,$this->arrSearchData['category_id']
                ,$this->arrSearchData['name']
        );
    }

    /**
     * パンくずリスト取得
     *
     * @return array
     */
    function lfTopicPath( $mode, $category_id, $category_name )
    {
        $arrRet = array();
        if( $mode == 'search' ){
            $arrRet[] = array('title' => $category_name . ' の検索結果');
        }
        elseif( empty($category_id) ){
            $arrRet[] = array('title' => '全商品');
        }
        else{
            $objDb = new SC_Helper_DB_Ex();
            $arrCatId = $objDb->sfGetParentCategories( $category_id );
            foreach( $arrCatId as $cat ){
                if( $cat['id'] == $category_id ){
                    $arrRet[] = array('title' => $cat['name']);
                }
                else{
                    $arrRet[] = array(
                         'url' => './list.php?category_id=' . $cat['id']
                        ,'title' => $cat['name']
                    );
                }
            }
        }
        return $arrRet;
    }
}

④ 商品詳細画面のパンくず

data/class_extends/page_extends/products/LC_Page_Products_Detail_Ex.php

class LC_Page_Products_Detail_Ex extends LC_Page_Products_Detail
{
    /**
     * Page のアクション.
     *
     * @return void
     */
    function action()
    {
        parent::action();

        // パンくずリスト取得
        $this->arrTopicPath = $this->lfTopicPath( $this->tpl_product_id );
    }

    /**
     * パンくずリスト取得
     *
     * @return array
     */
    function lfTopicPath( $product_id )
    {
        $arrRet = array();
        $objDb = new SC_Helper_DB_Ex();
        $arrCategory_id = $objDb->sfGetCategoryId( $product_id );
        $category_id = $arrCategory_id[0];
        $arrCatId = $objDb->sfGetParentCategories( $category_id );
        foreach( $arrCatId as $cat ){
            $arrRet[] = array(
                 'url' => './list.php?category_id=' . $cat['id']
                ,'title' => $cat['name']
            );
        }
        $arrRet[] = array('title' => $this->tpl_subtitle);
        return $arrRet;
    }
}

⑤ 共通関数

data/class_extends/helper_extends/SC_Helper_DB_Ex.php

class SC_Helper_DB_Ex extends SC_Helper_DB
{
    /**
     * 指定カテゴリIDの親カテゴリID・名称リスト(自身含む)を取得する.
     *
     * @param  integer $category_id カテゴリID
     * @return array  カテゴリID・名称の配列
     */
    public function sfGetParentCategories( $category_id )
    {
        $arrRet = array();
        // 商品が属するカテゴリIDを縦に取得
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $arrCatID = $this->sfGetParents(
                 'dtb_category'
                ,'parent_category_id'
                ,'category_id'
                ,$category_id
        );
        foreach( $arrCatID as $id ){
            // カテゴリ名称を取得
            $sql = 'SELECT category_name FROM dtb_category WHERE category_id = ?';
            $catName = $objQuery->getOne( $sql, array($id) );
            $arrRet[] = array(
                 'id' => $id
                ,'name' => $catName
            );
        }
        return $arrRet;
    }
}

その後PCテンプレートでもパンくず表示したくなったら、あとはブロックだけ作れば(手順①②をPCテンプレートでやれば)動く。

ちなみにググって見つかるコードで、sfGetCat関数を使っているものは v2.13.3 では動かなかった。v2.11.? の頃はあったけど、v2.13.3 には存在しない関数のようだ。EC-CUBE は後方互換を容赦なく切り捨ててバージョンアップしていくスタイルなのかなー。改造利用する側は戸惑うけど、無駄な関数が残らないから中の人たちにとってはよいかも。

あと確認してないけど、商品が複数のカテゴリに属していると、ユーザが画面でたどったカテゴリとパンくずで表示されるカテゴリ名が違う現象が起きると思う。解決するには、ユーザがクリックしたカテゴリの情報をなんとかして取得しなければならない。
http://pro-grammer.info/archives/1240
しかしよく考えたら、「パンくず」の意味は本来そういう(ユーザがたどった履歴を示す)ものか。その点では上の実装はコード的にも、パンくずというより、サイトの階層構造を表示するものなのか。