isTKS™PHP,program ≫ EC-Cubeでカテゴリー一覧を任意のHTMLエリアに表示させる方法

EC-Cubeでカテゴリー一覧を任意のHTMLエリアに表示させる方法

2014.02.16

EC-Cubeで、ページのどこでも(左サイドバー以外でも)、
カテゴリー一覧(カテゴリーツリー)を表示させたい場合のカスタマイズメモ

■デフォルトの状態まとめ
version:EC-Cube2.13.1
デフォルトでは、カテゴリーエリアは左サイドバーのカテゴリーエリアでしか出力できない仕様になっている。

■その理由
デフォルトのデザインで表示されるカテゴリー一覧は、category_tree_fork.tpl内で出力されている

/data/Smarty/templates/default/frontparts/bloc/category_tree_fork.tpl

で、このファイル内でforeachで表示させている$childrenには、このファイル

/data/Smarty/templates/default/frontparts/bloc/category.tpl

でinclude時に$arrTreeという変数をアサインしている。

で、この$arrTreeという変数は、カテゴリーブロックのクラスファイル

/data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Category.php

でカテゴリー内容を配列で代入しているけど、この代入箇所は左サイドバー以外では使われない。

つまり、【別のHTMLエリアで$arrTreeを出力させようとしても、値が空なので何も出力されない】っていうのがデフォルトの状態。

■解決策
表示させたいHTMLエリアに対応するクラスファイル内で、$arrTreeにカテゴリー内容を代入する改修が必要。

例えば、LC_Page.phpの拡張クラスファイルである、

/data/class_extends/page_extends/LC_Page_Ex.php

に、LC_Page_FrontParts_Bloc_Category.phpでカテゴリー変数を生成している部分の処理をコピペする。

LC_Page_FrontParts_Bloc_Category.php内からLC_Page_Ex.phpに
lfGetMainCat()
lfGetCatTree()
lfGetSelectedCategoryId()
の関数定義をコピペしてあげて、
process()
でそれを使用する。

で、Smartyテンプレートファイル内で、
category_tree_fork.tplを呼ぶなり、
category_tree_fork.tplの中の記述なりをコピペしてあげれば、
ページにカテゴリーが出力される

■コード例

コードだとこんな感じで動いた。
/data/class_extends/page_extends/LC_Page_Ex.php

class LC_Page_Ex extends LC_Page
{

    public function process()
	{
        // モバイル判定
        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, true);
                break;
        }
    }

    /**
     * メインカテゴリの取得.
     *
     * @param  boolean $count_check 登録商品数をチェックする場合はtrue
     * @return array   $arrMainCat メインカテゴリの配列を返す
     */
    public function lfGetMainCat($count_check = false)
    {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $col = '*';
        $from = 'dtb_category left join dtb_category_total_count ON dtb_category.category_id = dtb_category_total_count.category_id';
        // メインカテゴリとその直下のカテゴリを取得する。
        $where = 'level <= 2 AND del_flg = 0';
        // 登録商品数のチェック
        if ($count_check) {
            $where .= ' AND product_count > 0';
        }
        $objQuery->setOption('ORDER BY rank DESC');
        $arrRet = $objQuery->select($col, $from, $where);
        // メインカテゴリを抽出する。
        $arrMainCat = array();
        foreach ($arrRet as $cat) {
            if ($cat['level'] != 1) {
                continue;
            }
            // 子カテゴリを持つかどうかを調べる。
            $arrChildrenID = SC_Utils_Ex::sfGetUnderChildrenArray(
                $arrRet,
                'parent_category_id',
                'category_id',
                $cat['category_id']
            );
            $cat['has_children'] = count($arrChildrenID) > 0;
            $arrMainCat[] = $cat;
        }

        return $arrMainCat;
    }
    /**
     * カテゴリツリーの取得.
     *
     * @param  array   $arrParentCategoryId 親カテゴリの配列
     * @param  boolean $count_check         登録商品数をチェックする場合はtrue
     * @return array   $arrRet カテゴリツリーの配列を返す
     */
    public function lfGetCatTree($arrParentCategoryId, $count_check = false)
    {
        $objCategory = new SC_Helper_Category_Ex($count_check);
        $arrTree = $objCategory->getTree();

        $this->arrParentID = array();
        foreach ($arrParentCategoryId as $category_id) {
            $arrParentID = $objCategory->getTreeTrail($category_id);
            $this->arrParentID = array_merge($this->arrParentID, $arrParentID);
            $this->root_parent_id[] = $arrParentID[0];
        }

        return $arrTree;
    }
    /**
     * 選択中のカテゴリIDを取得する.
     *
     * @param  array $arrRequest リクエスト配列
     * @return array $arrCategoryId 選択中のカテゴリID
     */
    public function lfGetSelectedCategoryId($arrRequest)
    {
            // 商品ID取得
        $product_id = '';
        if (isset($arrRequest['product_id']) && $arrRequest['product_id'] != '' && is_numeric($arrRequest['product_id'])) {
            $product_id = $arrRequest['product_id'];
        }
        // カテゴリID取得
        $category_id = '';
        if (isset($arrRequest['category_id']) && $arrRequest['category_id'] != '' && is_numeric($arrRequest['category_id'])) {
            $category_id = $arrRequest['category_id'];
        }
        // 選択中のカテゴリIDを判定する
        $objDb = new SC_Helper_DB_Ex();
        $arrCategoryId = $objDb->sfGetCategoryId($product_id, $category_id);
        if (empty($arrCategoryId)) {
            $arrCategoryId = array(0);
        }

        return $arrCategoryId;
    }
}

終わり。

  • このエントリーをはてなブックマークに追加