Labo

[EC-CUBE 2.11.2] 商品一覧ページに、サブカテゴリを表示させたい

2011年10月30日 / 投稿者名:fukap


EC-CUBEにはデフォルトで商品カテゴリーブロックというものがあるので、あんまり需要がないかなーとは思いましたが、
商品一覧ページの見出し(「食品」や「なべ」などカテゴリ名が表示される場所)の下あたりにサブカテゴリを表示させてみました。

 

1.data/class/pages/products/LC_Page_Products_List.php の 130行目あたりに以下のコードを記述。

        // サブカテゴリリストを取得
        $this->arrSubCatList = $this->getSubCatList($this->arrSearchData['category_id']);

2.data/class/pages/products/LC_Page_Products_List.php の 末尾に以下の関数を記述。

    /*
     *  子カテゴリ一覧を取得
     *
     *  @param  int $category_id 該当カテゴリID
     *  @return Array $arrSubCatList 子カテゴリID
     */
    function getSubCatList($category_id){
        $arrRet = SC_Helper_DB_Ex::sfGetCatTree();
        $cnt = 0;
        foreach($arrRet as $key => $val){
            if($val['parent_category_id'] == $category_id){
                $arrSubCatList[$cnt]['category_id'] = $val['category_id'];
                $arrSubCatList[$cnt]['category_name'] = $val['category_name'];
                $cnt++;
            }
        }
        return $arrSubCatList;
    }

今回、SC_Helper_DB_Ex::sfGetCatTree() を引数なしでコールしてるんですが、
本来、この関数は第一引数として $parent_category_id を引き渡さないといけないはずです。
でもなぜか引数を与えても与えなくても同じ結果が返ってくる。。なんでだろう。
ちょっとここの疑問はまたの機会に調べたいと思います。

 

3.data/Smarty/templates/default/products/list.tpl の 88行目あたりに以下のコードを記述

    <!--{* 下位カテゴリ *}-->
    <!--{if $arrSubCatList|@count > 0}-->
        下位カテゴリ:
        <!--{foreach from=$arrSubCatList item=category}-->
            <a href="<!--{$smarty.const.ROOT_URLPATH}-->products/list.php?category_id=<!--{$category.category_id|h}-->"><!--{$category.category_name|h}--></a>&nbsp;
        <!--{/foreach}-->
    <!--{/if}-->

[EC-CUBE 2.11.2] 商品一覧ページに、サブカテゴリを表示させたい への23件のコメント

  1. MAC より:

    大変有益な技術公開、ありがとうございます。
    私のやりたいことそのものでしたので、とても感激いたしました。ECCUBEは2.4系から2.11系に変わった途端、今までのカスタマイズ方法が通用せず、とても苦しんでいます苦笑。
    さて、こちらのカスタマイズにつきまして、実践しようと思ったのですが、該当箇所に
    $this->arrSubCatList = $this->getSubCatList($this->arrSearchData[‘category_id’]);
    を入れたところ、
    「システムエラーが発生しました。大変お手数ですが、サイト管理者までご連絡ください。」
    の表示になってしまいます。

    site.logを見たところ
    MDB2 Error: not found
    [Error message: Unable to bind to missing placeholder: 0]

    /ドメイン/html/products/list.php 34:LC_Page_Products_List_Ex->process
    /ドメイン/data/class_extends/page_extends/products/LC_Page_Products_List_Ex.php 56:LC_Page_Products_List->proces
    /ドメイン/data/class/pages/products/LC_Page_Products_List.php 87:LC_Page_Products_List->action
    /ドメイン/data/class/pages/products/LC_Page_Products_List.php 130:LC_Page_Products_List_Ex->getSubCatList
    /ドメイン/data/class_extends/page_extends/products/LC_Page_Products_List_Ex.php 108:SC_Helper_DB->sfGetCatTree
    /ドメイン/data/class/helper/SC_Helper_DB.php 249:SC_Helper_DB->sfGetParents
    /ドメイン/data/class/helper/SC_Helper_DB.php 852:SC_Helper_DB->sfGetParentsArray
    /ドメイン/data/class/helper/SC_Helper_DB.php 871:SC_Helper_DB->sfGetParentsArraySub
    /ドメイン/data/class/helper/SC_Helper_DB.php 882:SC_Query->get
    /ドメイン/data/class/SC_Query.php 580:SC_Query->getOne
    /ドメイン/data/class/SC_Query.php 600:SC_Query->execute
    /ドメイン/data/class/SC_Query.php 888:MDB2_Statement_Common->execute
    /ドメイン/data/module/MDB2.php 4152:MDB2_Statement_mysql->_execute
    /ドメイン/data/module/MDB2/Driver/mysql.php 1618:MDB2_Driver_Common->raiseError
    /ドメイン/data/module/MDB2.php 1497:PEAR->raiseError
    /ドメイン/data/module/PEAR.php 557:MDB2_Error->MDB2_Error
    /ドメイン/data/module/MDB2.php 1009:PEAR_Error->PEAR_Error

    というようなエラーが出ています。
    上記につきまして、もしお分かりになりましたら、ご教授いただければ幸いです。
    何卒よろしくお願いいたします。

  2. MAC より:

    度々恐れ入ります。
    すいません、自己解決いたしました。
    当方のECCUBEのverが2.11.1だったものを2.11.2に上げることで解決しました。

    お騒がせして申し訳ございません。
    ありがとうございました。

  3. fukap より:

    コメントありがとうございます。
    SC_Helper_DB_Ex::sfGetCatTree() の仕様をあまり確認せずに書いちゃったので、
    疑問解決のきっかけになるかなと思ったのですが、自己解決されたようですね。

    ご報告ありがとうございます。

  4. ima より:

    大変有益な情報を有難うございます。
    質問ですが、
    1.data/class/pages/products/LC_Page_Products_List.php の 130行目あたりに以下のコードを記述。
    とのことですが、具体的に前後のコードを教えていただけませんでしょうか?
    現在ECCUBE2.11.4を使用していますが変更があったらしく130行目に入れるとエラーが表示されてしまいました。
    何卒宜しくお願いします。

  5. fukap より:

    EC-CUBE 2.11.4のソースを見てみました。
    少なくとも $this->arrSearchData を定義した後でないといけませんので、
    110行目以降に入れてみてください。
    たぶん他も修正しないと動かない気がします。

  6. ima より:

    早速ご連絡くださいましてありがとうございます。
    110行目に挿入したところ無事に表示できました!
    とても便利な機能をご紹介くださいまして有難うございました。
    今後とも記事を楽しみにしております。
    —–
    //表示条件の取得
    $this->arrSearchData = array(
    ‘category_id’ => $this->lfGetCategoryId(intval($this->arrForm[‘category_id’])),
    ‘maker_id’ => intval($this->arrForm[‘maker_id’]),
    ‘name’ => $this->arrForm[‘name’]
    );
    ★ここに挿入★
    $this->orderby = $this->arrForm[‘orderby’];

    ————-

  7. as より:

    大変有益な情報を有難うございます。
    質問です。
    2.11.1でも動作しますか?
    Fatal error: Call to undefined method LC_Page_Products_List_Ex::getSubCatList() in /ドメイン/data/class/pages/products/LC_Page_Products_List.php on line 120
    とエラー画面が表示されてしまいます。
    もしカスタマイズが必要なのであればご教授お願いいたします。

  8. fukap より:

    2.11.2では動作すると思いますが、他のバージョンでの動作を保障したものではありません。
    その旨、ご了解ください。

    エラー内容は、getSubCatListというメソッドが見つかりませんといった意味合いですので、
    getSubCatListメソッドがちゃんと定義されているか確認してみると良いかと思います。

  9. rabupon より:

    まさに、実装したい機能でした。
    参考にさせていただきます。
    子カテゴリの登録数も取得できますか?

  10. fukap より:

    getSubCatList メソッドで取得している $arrRet の中に含まれているようですので、
    ちょっとコードを書き換えると取得できそうです。
    以下のような感じでどうでしょうか?(未確認)

     

    data/class/pages/products/LC_Page_Products_List.php

    function getSubCatList($category_id){
        $arrRet = SC_Helper_DB_Ex::sfGetCatTree();
        $cnt = 0;
        foreach($arrRet as $key => $val){
            if($val['parent_category_id'] == $category_id){
                $arrSubCatList[$cnt]['category_id'] = $val['category_id'];
                $arrSubCatList[$cnt]['category_name'] = $val['category_name'];
                $arrSubCatList[$cnt]['product_count'] = $val['product_count'];
                $cnt++;
            }
        }
        return $arrSubCatList;
    }

     

    data/Smarty/templates/default/products/list.tpl

    <!--{* 下位カテゴリ *}-->
    <!--{if $arrSubCatList|@count > 0}-->
        下位カテゴリ:
        <!--{foreach from=$arrSubCatList item=category}-->
            <a href="<!--{$smarty.const.ROOT_URLPATH}-->products/list.php?category_id=<!--{$category.category_id|h}-->"><!--{$category.category_name|h}-->(<!--{$category.product_count|h}-->)</a> 
        <!--{/foreach}-->
    <!--{/if}-->
  11. rabupon より:

    ご回答ありがとうございます。
    できました。感謝です!!

  12. yassy より:

    こちらの機能はどうしても実現したい機能でしたので、非常に参考になりました。お陰様で、2.11.5で実現できました。

    親カテゴリの商品一覧に入った時にサブカテゴリが表示されるようになったのですが、サブカテゴリに入ったときにも、そのまま表示されるようにはできませんでしょうか。

    現在、親カテゴリとサブカテゴリの2階層あり、親カテゴリに入ったときも、その下のサブカテゴリに入ったときも、同様にその親カテゴリのサブカテゴリが表示されるようにしたいと思っております。

    ご教示をいただけるととても助かります。

  13. fukap より:

    この方法では、該当カテゴリのサブカテゴリを取得し、表示させています。
    ですので、このままでは、サブカテゴリの一覧を表示させたページで、
    親カテゴリを表示させることはできません。

    サブカテゴリ表示時には、親カテゴリを取得するようなカスタマイズを
    すれば可能だとは思います。

  14. yassy より:

    ご回答どうもありがとうございました。
    難しそうですね。とりあえずはあきらめます。
    ありがとうございました。

  15. hal より:

    いつも大変有益な情報を有難うございます。
    質問させてください。
    2.12.1で実装させたいのですが、上記のようにカスタマイズしたところ、

    「ページの自動転送設定が正しくありません」
    「このアドレスへのリクエストに対するサーバの自動転送設定がループしています。」

    と表示されてしまいます。
    ご教示をいただけるととても助かります。

  16. fukap より:

    そうですね、2.12.1 では前提が異なりますので、何とも言えないですね。
    2.12.1 用に書き換えればいけると思います。

  17. 肉うどん より:

    お世話になっております。
    この機能を2.11.1で実装させたいのですが、
    どのようにすればよろしいでしょうか?

  18. waDAD より:

    いつも参考にさせていただいており
    大変助かっております、有難うございます。
    こちらのブログ[1708.html]を参考に色々試行錯誤し、この機能を2.12.2に実装しようとしたのですが、うまくいきません。
    恐れ入りますが、この機能の2.12.2用のカスタマイズ方法をお教えいただければと思います。
    宜しくお願い致します。

  19. fukap より:

    2.12.2 だと、ちょうど良いプラグインとか出てませんか?
    週末に時間があれば考えてみたいと思います。

  20. waDAD より:

    有難うございます。
    お時間取らせてしまい申し訳ございません。
    プラグインも色々試してみたのですが、ちょうど良いのがなかったんです。
    すいません、宜しくお願い致します。
    またひとつ、記述方法の勉強になると思います。
    有難うございます、大変助かります!

  21. ピンバック: [EC-CUBE 2.12.2] 商品一覧ページに、サブカテゴリを表示させたい | NAKWEB × EC-CUBE

  22. 西岡 より:

    子カテゴリー下の孫カテゴリーまで出したいと思っているのですが何処をどうすれば良いのか、、、、

    ご教授頂けますと幸いです。

  23. chiharu より:

    お問合せ有難うざいます。
    上記ご質問に関して、こちらはバージョンが古いため、新しく記載した記事があります。
    [EC-CUBE 2.12.2] 商品一覧ページに、サブカテゴリを表示させたい

    そちらに今回のご質問内容に関する返答を記載させて頂きました。
     ※ コメントナンバー 6 の内容となります。

    よろしければ、そちらをご確認下さい。

waDAD へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

* Copy This Password *

* Type Or Paste Password Here *

*

コメント欄にコードを挿入したい場合は、[php][/php] を使ってください。