Labo

[EC-CUBE 2.11.4] 特定のカテゴリだけ表示する商品一覧ブロック

2011年12月04日 / 投稿者名:fukap


以前当サイトで紹介したブロック作成で、特定のカテゴリだけ表示させられないかというご質問が開発コミュニティであったので試しにやってみました。以前の記事はこちら。https://ec-cube.nakweb.com/blog/844.html
 
違うのは、3番目の手順のところだけです。
 
3.data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Product_List.php を新規作成

<?php

// {{{ requires
require_once CLASS_REALDIR . 'pages/frontparts/bloc/LC_Page_FrontParts_Bloc.php';

/**
 * Product_List のページクラス.
 *
 * @package Page
 */
class LC_Page_FrontParts_Bloc_Product_List extends LC_Page_FrontParts_Bloc {

    // }}}
    // {{{ functions

    /**
     * Page を初期化する.
     *
     * @return void
     */
    function init() {
        parent::init();
        $bloc_file = 'product_list.tpl';
        $this->setTplMainpage($bloc_file);
    }

    /**
     * Page のプロセス.
     *
     * @return void
     */
    function process() {
        if (defined("MOBILE_SITE") && MOBILE_SITE) {
            $objView = new SC_MobileView();
        } else {
            $objView = new SC_SiteView();
        }

        $objQuery = new SC_Query_Ex();

        // 商品一覧を取得
        $col = 'T1.product_id, T1.main_list_image, T1.name, T2.price02 AS price02_min';
        $from = 'dtb_products as T1 INNER JOIN dtb_products_class as T2 ON T1.product_id = T2.product_id';
        $from .= ' INNER JOIN dtb_product_categories as T3 ON T1.product_id = T3.product_id';
        $where = 'T2.del_flg = 0 and T3.category_id IN ( ? , ? )';  // $arrval で指定するカテゴリIDの数だけ ? を増やす
        $arrval = Array( 4 , 6 );   // 一番下層のカテゴリIDを指定する
        //$objQuery->setOrder("T1.update_date desc");
        $arrProducts = $objQuery->select($col, $from, $where, $arrval);

        // 重複データ削除
        $tmp = Array();
        $i = 0;
        $max_count = 10;    // 取得したい商品個数を指定する
        foreach($arrProducts as $arrProduct){
            if(!in_array($arrProduct['product_id'], $tmp)){
                $this->arrProducts[$i] = $arrProduct;
                $i++;
            }
            $tmp[] = $arrProduct['product_id'];
            if($i >= $max_count){
                break;
            }
        }

        $objView->assignobj($this);
        $objView->display($this->tpl_mainpage);
    }

    /**
     * デストラクタ.
     *
     * @return void
     */
    function destroy() {
        parent::destroy();
    }
}

?>

コード内にコメントとして記述しましたが、$where のところは、指定するカテゴリ数の分だけ ? を加えてください。
カテゴリ1つなら ( ? ) 、2つなら ( ? , ? )、3つなら ( ? , ? , ? ) って感じです。
$arrval のところは、指定するカテゴリIDをカンマで挟んで記述してください。
 
価格については端折った処理をしているので、規格分類ごとに価格が異なる場合は特定規格の価格しか表示されないと思いますので注意。
複数カテゴリを指定した場合は、重複して商品が表示されることがあるので、最後に重複データを落としました。
ちょっと冗長だと思いますが、他に良い方法が思いつかなかったのでご容赦。

[EC-CUBE 2.11.4] 特定のカテゴリだけ表示する商品一覧ブロック への28件のコメント

  1. fukap より:

    コードを一部修正しました。

  2. tanaka より:

    いつも参考にさせて頂いております。

    新着商品ブロックの記事にもありましたが
    非公開の商品も表示されてしまう様です。

  3. fukap より:

    確かに status がありませんね^^;
    ありがとうございます。

    $where = 'T2.del_flg = 0 and T2.status = 1 and T3.category_id IN ( ? , ? )';

    で良いと思いますが、念のためテストしてみてから、コードを直したいと思います。

  4. sody より:

    大変参考になりました。
    ありがとうございます。

  5. shin より:

    いつもホームページを拝見させていただいていおります。

    特定のカテゴリでの表示に関しましては、問題なく実装できたのですが、
    商品詳細ページを開いた際にその商品の所属している商品を一覧表示することは可能でしょうか。

    もし可能でしたらご教示頂けないでしょうか。
    何卒よろしくお願いいたします。

  6. shin より:

    その商品の所属しているカテゴリに含まれる商品の一覧です。
    どうぞよろしくお願いいたします。

  7. fukap より:

    「商品詳細ページを開いた際にその商品の所属している商品を一覧表示することは可能でしょうか。」とのことですが、
    該当商品と所属カテゴリを同じくする商品一覧を出力したいということでしょうか?

    商品詳細ページでは、もともと所属カテゴリの情報は持っておりますので、
    カテゴリに属する商品情報を引っ張れば可能だと思います。

  8. fukap より:

    2012年8月30日 4:01 PM のコメントは、後から確認しました。
    先にコメントした通り充分可能ですが、本ブロックをカスタマイズするより、
    イチから考えた方がやりやすそうな気がしますね。

  9. shin より:

    早速のご返信ありがとうございます。

    イチから考えてみようと思います。
    ありがとうございました。

  10. designstyle より:

    私も「商品詳細ページを開いた際にその商品の所属している商品を一覧表示」がほしかったので、手探りに色々やってみたらうまくいきました。

    選択中の商品カテゴリIDの配列を取得してwhere条件に最初のカテゴリIDのみで取得しています。
    テンプレート側の修正はなしです。
    もう少しきれいにかけそうですが、取り急ぎだったのでご了承ください。

    http://www.tr-designstyle.com/blog/ec-cube/ec-cube-bloc-products-list/

    P.S
    サイト汚いです(笑)
    完全個人用の備忘録として活用してます。
    時間ができたら修正していく予定ですが・・・

  11. たかはし より:

    こちらを参考に特定カテゴリの商品表示ブロックをさせて頂きました。
    大変参考になりました。
    ありがとうございます。

    これで表示される商品の並び順は、商品idの若い順になると思うのですが、これをカテゴリid順に並ばせる方法があれば教えて頂けませんでしょうか?

  12. chiharu より:

    ご質問有難うございます。

    カテゴリID順に並べる方法ですが、当ページのカスタム内容の
    47行目の内容を書き換えてみてください。

    内容としては以下のとおりです。
    1.ソート順の指定部分がコメントアウトされている為、コメントアウトを外す。
    2.ソートしたい項目のフィールドを設定する。
    3.ソートの昇順,降順を設定する。

            //$objQuery->setOrder("T1.update_date desc");
    

     ↓

            $objQuery->setOrder("T3.category_id");
    

    これでカテゴリID順に並ぶかと思うのですがいかがでしょうか。

  13. たかはし より:

    chiharu様
    お世話になっております。

    早急にお返事頂いたのに、こちらのお礼が大変遅くなってしまいまして失礼いたしました。

    EC-CUBEはこういったカスタマイズのやり方の情報が少ないので、とても勉強になり助かりました。
    ありがとうございました。

  14. たかはし より:

    これでランダムにしてみました。
    ありがとうございました。

    $objQuery->setOrder(‘RAND()’);

  15. usausa より:

    無事表示されますが、値段が税抜き価格になってしまいます。税込み価格で表示するにはどうしたらよいでしょうか。

    また、非公開商品も表示されてしまいます。
    どのように対処すればよいでしょうか。

    よろしくお願いいたします。

  16. usausa より:

    ちなみに、非公開商品について
    where = ‘T2.del_flg = 0 and T2.status = 1 and T3.category_id IN ( ? , ? )’;
    にしてみたら、エラーになってしました。

    また、消費税込値段表示についても
    引き続きどうぞよろしくお願いいたします。

  17. usausa より:

    すみません。自己解決してしました。

    まず非公開商品を出さないようにするのは
    where = ‘T2.del_flg = 0 and T2.status = 1 and T3.category_id IN ( ? , ? )’;
    ではなく、
    where = ‘T2.del_flg = 0 and T1.status = 1 and T3.category_id IN ( ? , ? )’;
    でいけました。

    消費税込価格表示は、応急処置として、
    $col = ‘T1.product_id, T1.main_list_image, T1.name, T2.price02*1.08 AS price02_min’;
    というように単純に1.08をかけて計算するようにしました。
    ただこれだと、今後消費税が変わった時に都度修正しなければなりませんね。^^;

  18. トラコ より:

    はじめまして。
    掲載されておられる内容を参考にカテゴリー毎のブロック製作までできたのですが、掲載順をEC-CUBEの商品管理>商品並べ替えで指定した順に掲載したいのですが、方法をアドバイス頂けませんでしょうか。
    宜しくお願い致します。

  19. fukap より:

    トラコ様

    商品並べ替えに関しては、本コードでは考慮していません。
    商品並べ替えのロジックは、data/class/pages/products/LC_Page_Products_List.php にある、
    lfGetProductsListメソッドが参考になると思います。
    $objQuery->select()を使う前に、$objQuery->setOrder()をする必要があると思います。

  20. トラコ より:

    fukap様

    ご返答ありがとうございました。
    PHPには明るくないので、エラー連発させて
    しまいましたが、アドバイス頂いたエリアを
    見比べてなんとか商品並べ替え順での表示ができました。

    ただ、usausa様の投稿されおられた非公開商品が表示される状態でしたので、アップして頂いた方法で解決できました。

    ありがとうございました。

  21. トラコ より:

    価格に関してですが、以下の様な記述で現在商品一覧ページには
    規格2で価格に差異が生じる場合は最低価格と最高価格を表示する
    様にしているのですが
    (すみません、記述的に正しいのかは??です。)





    上の説明分にもございますように、規格2を使っている場合は特定
    金額のみ表示との事ですが、上の様な(通常の商品一覧ページと同様な)
    価格表記にするにはLC_Page_FrontParts_Bloc_Product_List.php に
    対してどの様な記述を追加すればよろしいでしょうか。

    アドバイス頂ければ幸いです。
    どうぞ宜しくお願い致します。

  22. トラコ より:

    すみません。
    価格部分のタグが消えてしまっているので再度上げさせて頂きます。

    <!ーー{if $arrProduct.price02_min == $arrProduct.price02_max}ーー>
    <!ーー{$arrProduct.price02_min|number_format}ーー>
    <!ーー{else}ーー>
    <!ーー{$arrProduct.price02_min|number_format}ーー>~<!ーー{$arrProduct.price02_max|number_format}ーー>
    <!ーー{/if}ーー>

  23. トラコ より:

    連続での投稿となり申し訳ありません。

    過去の記事にありました、

    https://ec-cube.nakweb.com/blog/1235.html

    <!–{assign var=price01 value=`$arrNewProducts[cnt].price01_min`}–>
    <!–{assign var=price02 value=`$arrNewProducts[cnt].price02_min`}–>
    <!–{assign var=price02_max value=`$arrNewProducts[cnt].price02_max`}–>
    (税込):

    <!–{if price02 != price02_max}–>
    <!–{$price02_max|sfCalcIncTax:$arrInfo.tax:$arrInfo.tax_rule|number_format}–>~
    <!–{/if}–>
    <!–{$price02|sfCalcIncTax:$arrInfo.tax:$arrInfo.tax_rule|number_format}–> 円

    を試してみましたが、依然として規格2を使用しており商品毎に価格差があるものは
    最低価格~最高価格の表示ができません。

    どなたかアドバイス頂けませんでしょうか。
    どうぞよろしくお願い致します。

  24. demi より:

    はじめまして。
    商品一覧の表示項目に、在庫の有無を追加するにはどうすれば宜しいでしょうか。

    ・LC_Page_FrontPart_Bloc_Product_List.php

    $col = 'T1.product_id, T1.main_list_image, T1.name, T2.price02 AS price02_min,T2.stock AS stock';
    

    この様に追記し、

    <!--{if $arrProduct.stock}-->
        在庫有り
    <!--{else}-->
        <div class="cartbtn attention">只今品切れ中です。</div>
    <!--{/if}--> 
    

    としてみましたが、思うように表示されません。。
    何卒、アドバイス頂けますでしょうか。

  25. 88mz51 より:

    トラコ様

    コメントの返信が大幅に遅れてしまい、大変申し訳ありません。

    さて、規格2が使用されている商品の価格差が反映されないといった件についてのご相談ですが、
    商品を全て取得し、10件になるまで絞込みを行う部分(51行目~63行目)辺りにて、重複する商品
    IDは表示させる商品リストから除外されるようになっております。
    その部分にて、商品の値段のみを残しておき、重複する商品IDの値段の部分を修正させるようにすれば
    実装することが出来るようになると思われます。

  26. 88mz51 より:

    demi様
    実際に商品在庫を設定していない商品(在庫無制限な商品)は、stockの項目にNULLが入力されています。
    これにより、在庫無制限な商品の場合、if文の判定が”false”となり、”else”移行の処理が行われてしまいます。
    よって、if文の条件に、stock_unlimitedの条件も追加することによってif文の処理がうまくいくと思いますよ。

  27. eccube.org より:

    ありがとうございました!無事に解決いたしました!

    ずっと悩んでいたところなので大変助かりました。

  28. 88mz51 より:

    eccube.org様
    無事解決されたようでよかったです。

コメントを残す

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

* Copy This Password *

* Type Or Paste Password Here *

*

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