バージョン選択

フォーラム

メニュー

オンライン状況

81 人のユーザが現在オンラインです。 (59 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 81
もっと...

サイト内検索

 > フロント機能 > 商品一覧を dtb_product_category.rank で並び替えたい

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
raccoon
投稿日時: 2016/7/10 2:56
対応状況: −−−
新米
登録日: 2016/7/10
居住地:
投稿: 3
商品一覧を dtb_product_category.rank で並び替えたい
商品のおすすめ順並び替えは
こちらのプラグインを使っています:
https://github.com/EC-CUBE/ProductRank-plugin

マスターデータ管理から、mtb_product_list_order_by に 「3, おすすめ順」を登録し、
商品おすすめ順を上記プラグインで設定しました。

フロントの商品一覧のソート機能は提供されていないみたいなので、
とりあえず、
ProductRepository#getQueryBuilderBySearchData
を直接以下のように変更して試してみました。

変更前:


        // Order By
        // 価格順
        if (!empty($searchData['orderby']) && $searchData['orderby']->getId() == '1') {
            //@see http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html
            $qb->addSelect('MIN(pc.price02) as HIDDEN price02_min');
            $qb->innerJoin('p.ProductClasses', 'pc');
            $qb->groupBy('p');
            $qb->orderBy('price02_min', 'ASC');
            // 新着順
        } else if (!empty($searchData['orderby']) && $searchData['orderby']->getId() == '2') {
            $qb->orderBy('p.create_date', 'DESC');
        } else {
            if ($categoryJoin === false) {
                $qb
                    ->leftJoin('p.ProductCategories', 'pct')
                    ->leftJoin('pct.Category', 'c');
            }
            $qb
                ->addOrderBy('p.id', 'DESC');
        }
        return $qb;



変更後(おすすめ順追加):


        // Order By
        // 価格順
        if (!empty($searchData['orderby']) && $searchData['orderby']->getId() == '1') {
            //@see http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html
            $qb->addSelect('MIN(pc.price02) as HIDDEN price02_min');
            $qb->innerJoin('p.ProductClasses', 'pc');
            $qb->groupBy('p');
            $qb->orderBy('price02_min', 'ASC');
            // 新着順
        } else if (!empty($searchData['orderby']) && $searchData['orderby']->getId() == '2') {
            $qb->orderBy('p.create_date', 'DESC');
            // おすすめ順
        } else if (!empty($searchData['orderby']) && $searchData['orderby']->getId() == '3') {
            $qb->orderBy('pct.rank', 'DESC');
        } else {
            if ($categoryJoin === false) {
                $qb
                    ->leftJoin('p.ProductCategories', 'pct')
                    ->leftJoin('pct.Category', 'c');
            }
            $qb
                ->addOrderBy('p.id', 'DESC');
        }
        return $qb;


そうすると、子孫カテゴリーを持たないカテゴリーのおすすめ順の場合は、
うまくページャーが機能するのですが、
子孫カテゴリーを持つカテゴリーのおすすめ順の場合は
同じ商品が複数回表示されてしまいます。

xdebugで処理を追っていった所、
Doctrine\ORM\Tools\Pagination\Paginator.phpの151行目の


$ids = array_map('current', $subQuery->getScalarResult());


ここで、実際に表示する商品のid一覧を取得していることがわかりました。
取得のためのSQLは以下のような感じです:


SELECT DISTINCT d0_.product_id AS product_id0,
                d1_.rank AS rank1
FROM dtb_product d0_
INNER JOIN dtb_product_category d1_ ON d0_.product_id = d1_.product_id
INNER JOIN dtb_category d2_ ON d1_.category_id = d2_.category_id
AND (d2_.del_flg = 0)
WHERE (d0_.status = 1
       AND d1_.category_id IN (1, 20, 19, 18, 17, 16, 15, 14))
  AND (d0_.del_flg = 0)
ORDER BY d1_.rank DESC
LIMIT 15 OFFSET 15
;


上の SQLの select の d1_.rank AS rank1 があるために、重複が除去できていない状態だと思いました。なので


SELECT DISTINCT d0_.product_id AS product_id0,
                d1_.rank AS rank1





SELECT DISTINCT d0_.product_id AS product_id0


というふうに、 d1_.rank AS rank1 を追加しないようにしたいのですが、
これはできそうでしょうか。
あるいは、もっと他の方法はありませんでしょうか。
どなたかお知恵をお貸しいただければ幸いです。 m(_ _)m
DELIGHT
投稿日時: 2016/7/10 8:03
対応状況: −−−
仙人
登録日: 2010/2/3
居住地: 熊本県・九州・長野県・関東甲信越
投稿: 571
Re: 商品一覧を dtb_product_category.rank で並び替えたい
商品に対してカテゴリ商品が複数あることが原因だと思います。
商品IDでグループ化してMAX(rank)等で並び替える必要があるのではありませんか?

手元に環境がないためコードを見た所管です。
間違っていたら申し訳ありません。


----------------
+ DAISY inc. -------------------- +
EC-CUBE構築・カスタマイズサービス
EC・WEB構築などお気軽にご相談ください。

デイジー株式会社
http://daisy.link/

raccoon
投稿日時: 2016/7/14 6:17
対応状況: −−−
新米
登録日: 2016/7/10
居住地:
投稿: 3
Re: 商品一覧を dtb_product_category.rank で並び替えたい
DELIGHT様

ご提示いただいた方針で、
うまくいきました!
適切なアドバイス 本当にありがとうございます!
m( _ _ ) m
raccoon
投稿日時: 2016/7/14 6:18
対応状況: 解決済
新米
登録日: 2016/7/10
居住地:
投稿: 3
Re: 商品一覧を dtb_product_category.rank で並び替えたい
対応状況を解決済みにいたします。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は56,688名です
総投稿数は94,613件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
nanasess
2024
4
468
1951
5
yuh
1611
6
umebius
1490
7
red
1379
8
h_tanaka
943
9
fukap
907
10
tsuji
856
11
shutta
835
12 ramrun 789
13
tao_s
783
14 karin 656
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.