Labo

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

2012年12月01日 / 投稿者名:fukap


1年以上前に同タイトルの記事を書いたのですが、
よく質問をいただきますので、現在の最新バージョンの 2.12.2 でできるかなと試してみました。
気まぐれでコードを書き直しましたが、一応以下のような感じでできました。

 

EC-CUBE サブカテゴリ 表示

 

 

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

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

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

    /**
     * カテゴリツリーの取得.
     *
     * @param array $parent_category_id 親カテゴリID
     * @param boolean $count_check 登録商品数をチェックする場合はtrue
     * @return array $arrRet カテゴリツリーの配列を返す
     */
    function lfGetCatTree($parent_category_id, $count_check = false) {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $objDb = new SC_Helper_DB_Ex();
        $col = '*';
        $from = 'dtb_category left join dtb_category_total_count ON dtb_category.category_id = dtb_category_total_count.category_id';
        // 登録商品数のチェック
        if ($count_check) {
            $where = 'del_flg = 0 AND product_count > 0 AND parent_category_id = ?';
        } else {
            $where = 'del_flg = 0 AND parent_category_id = ?';
        }
        $arrval = array($parent_category_id);
        $objQuery->setOption('ORDER BY rank DESC');
        return $objQuery->select($col, $from, $where, $arrval);
    }

 前回は、SC_Helper_DB_Ex::sfGetCatTree を使ってカテゴリ情報を取得していたのですが、
 sfGetCatTree の仕様がいまいちよくわからなかったので、カテゴリブロックでやっているようにローカル関数として書き直してみました。
 DBからselectする段階で、parent_catetgory_id を条件として与えるようにしました。

 

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

<!--{* 下位カテゴリ *}-->
<!--{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.12.2] 商品一覧ページに、サブカテゴリを表示させたい への14件のコメント

  1. waDAD より:

    いつもありがとうございます。
    さっそくありがとうございました。
    できました!感謝です。
    今後も参考にさせていただきます。
    ありがとうございました。

  2. Anpan より:

    初めまして。
    こちらと同じことをまさにやってみたい!
    と思い、やってみてはいるのですが
    できません・・・バージョンは2.12.4です。

    どこか入れ方がおかしいのでしょうか?
    よろしければご教授くださいませ。

  3. fukap より:

    Anpan様

    とりあえず手元の2.12.5環境では、正常に動作しました。
    うまくいかない、というのは具体的にどういう状態ですか?

    エラー文が出力されているなら、その文を教えてください。
    また、エラーは出ないけど、結果的にページに表示されないということでしょうか?

  4. Anpan より:

    ちゃんとご質問できておらず、申し訳ありません・・・・!
    ちょうど、このご質問を書いている途中に突然できました・・・!

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

    こちらについては、
    data/class/pages/products/LC_Page_Products_List.php の

    //表示条件の取得
    $this->arrSearchData = array(
    ‘category_id’ => $this->lfGetCategoryId(intval($this->arrForm[‘category_id’])),
    ‘maker_id’ => intval($this->arrForm[‘maker_id’]),
    ‘name’ => $this->arrForm[‘name’]
    );

    ★ここに挿入しました(110行目あたり)

    $this->orderby = $this->arrForm[‘orderby’];

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

    こちらについては、
    data/class/pages/products/LC_Page_Products_List.php の

    一番最後の

    }

    の直前に入れました。

    2、3日前からしてみて、ずっと「システムエラーとなりました」と真っ白になっていたのですが、
    https://ec-cube.nakweb.com/blog/827.html
    こちらのページのコメント欄も見ながら上のように入れ直してみましたところ、
    正常に表示されました・・・!

    自己解決となってしまい、申し訳ありません・・・!
    今後も勉強しますので、また質問発生しましたらよろしくおねがいします・・・!

  5. fukap より:

    コードを挿入した場所が悪かったのかもしれませんね。
    無事解決できたようで良かったです。
    ご報告ありがとうございます。

  6. chiharu より:

    孫階層のカテゴリ表示に関してご質問頂きました。
    当記事の以下の項目に関して変更頂くと孫階層まで取得できるかと思います。

    1.data/class/pages/products/LC_Page_Products_List.php

    // サブカテゴリリストを取得
    $this->arrSubCatList = $this->lfGetCatTree($this->arrSearchData['category_id']);
    foreach ($this->arrSubCatList as $subCatKey => $subCatVal) {
        $this->arrLowSubCatList[ $subCatVal['category_id'] ] = $this->lfGetCatTree( $subCatVal['category_id'] );
    }
    

     ※ 子カテゴリを取得後に孫カテゴリの情報を取得しています。

    2.data/class/pages/products/LC_Page_Products_List.php
     ※ 変更なし。

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

    <!--{* 下位カテゴリ *}-->
    <!--{if $arrSubCatList|@count > 0}-->
        下位カテゴリ:<br>
        <!--{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> 
            <!--{* 孫カテゴリ *}-->
            <!--{foreach from=$arrLowSubCatList[$category.category_id] item=lowCategory}-->
            <a href="<!--{$smarty.const.ROOT_URLPATH}-->products/list.php?category_id=<!--{$lowCategory.category_id|h}-->"><!--{$lowCategory.category_name|h}--></a> 
            <!--{/foreach}-->
            <br>
        <!--{/foreach}-->
    <!--{/if}-->
    

     ※ 子カテゴリの表示後に孫カテゴリの表示を行っています。

    大体はこんな感じかと思います。
    再帰的に処理をして頂ければデータの持ち方次第で、
    子・孫だけではなく複数階層も可能かと思います。

    一度お試し下さい。

  7. 西岡 より:

    chiharu様

    早速のご対応感謝いたします!!!!
    記載頂いた内容にてコードを入れてみたのですが、、子カテゴリは出るものの問題の「孫カテゴリ」が出てきません。。。

    得にエラーも見受けられない状況なのでどうしたらよいか、、、

  8. 西岡 より:

    私の環境は
    var.2.12.3
    PHP 5.3.29
    MySQL 5.5.46

    となります。。。

  9. chiharu より:

    ご連絡有難う御座います。

    前回のテスト環境に関して 2.13.5 を使用しておりましたので、
    念のため var.2.12.3 にて再テストを行いました。

    結果としては特に問題がなさそうでした。
    テスト結果
     ※「なべ」「お菓子」が子カテゴリとなり、「アイス」が「お菓子」の子カテゴリ(孫カテゴリ)となります。

    孫階層のカテゴリ内に商品が登録されていないなどは有りませんでしょうか。

    編集内容に関して、当記事の「2.」の項目も記載頂いていますでしょうか。
    また、旧バージョンのページとは情報の取得方法が異なっております。
    そちらも合わせてご確認頂ければ思います。

  10. 西岡 より:

    本当に色々とありがとうございます!
    孫カテゴリの商品はまだ未登録の状態です@

    できれば未登録の状態のものも表示できるとありがたいのですがどこを変更すればよろしいでしょうか?

  11. chiharu より:

    先ほどの質問にて「カテゴリに対する商品」の未登録を確認させて頂きましたが、
    本来であれば今回記載させて頂いた内容にて商品未登録のカテゴリも表示されるはずです。
     # MySQL 特有の癖で、リンク先が正常でないかとは思いますが・・・

    何れにせよ以下の部分を変更するととりあえずご要望の形にはなりますが、
    リンク先には何も表示されないためあまり意味はないかと思います。

    2.data/class/pages/products/LC_Page_Products_List.php

    /**
     * カテゴリツリーの取得.
     *
     * @param array $parent_category_id 親カテゴリID
     * @param boolean $count_check 登録商品数をチェックする場合はtrue
     * @return array $arrRet カテゴリツリーの配列を返す
     */
    function lfGetCatTree($parent_category_id, $count_check = false) {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $objDb = new SC_Helper_DB_Ex();
        $col = '*';
        $from = 'dtb_category ';
        $where = 'del_flg = 0 AND parent_category_id = ?';
        $arrval = array($parent_category_id);
        $objQuery->setOption('ORDER BY rank DESC');
        return $objQuery->select($col, $from, $where, $arrval);
    }
    

    一度お試し下さい。

  12. 西岡 より:

    本当に本当にありがとうございます!!!!

    とても助かりました。。
    感謝しても仕切れない程に感謝です!

    リンク先も問題なく表示出来るようですのでとりあえず一安心です!

    早期対応等、本当にありがとうございました。

  13. 西岡 より:

    chiharu様
    度々本当に申し訳ございません。
    孫カテゴリの登録商品数を右側に「孫カテゴリ(4)」のように表記したいと思います。登録数がなしの時には(0)のように出るとよいな、、、と、、、

    カンでちょっとやってみたのですがやはり私では無理でした、、、
    再度ご教授頂けますと助かります。
    よろしくお願いいたします。

  14. chiharu より:

    孫カテゴリの登録数表示となると、当記事の内容とはかなり
    離れていますのでこの記事でのご返答は控えさせて頂きます。

    そのため今回は、ザットした流れのみを記載させて頂きます。

    出力項目としては以下の内容に対して登録数を表示する形となります。
    「3.data/Smarty/templates/default/products/list.tpl」

    問題としては表示するための変数を何処で取得するのかで
    苦労されているのかと思います。

    前回のご質問にて当記事の以下の部分を変更して頂きました。
    「2.data/class/pages/products/LC_Page_Products_List.php」

    ですが、この変更は安全に情報を取得するために敢えて取得内容を
    制限したものです。

    本来の当記事「2.data/class/pages/products/LC_Page_Products_List.php 」
    を使用して頂くと「product_count」と云う項目にて登録数を
    取得できるかと思います。

     ※ この記事が postgres を想定して記載されているため、
       商品の登録されていないカテゴリに関しては、
       多分不具合が出るとは思います。
     ※ 今回の返信内容は実際に作成していないため誤りがあるかもしれません。

    なお、弊社にて各種カスタマイズも対応しております。
    必要であれば、株式会社ナックウェブまでご連絡下さい。

コメントを残す

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

* Copy This Password *

* Type Or Paste Password Here *

*

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