- まず最初に、並び順テーブル(mtb_product_list_order_by)に新しく「お気に入り数順」を追加
(一例)
・id:4
・name:お気に入り数順(任意)
・rank:3
※optionの順番を前に持ってきたければrankの番号を減らす
- /src/Eccube/Resource/config/constant.yml.dist に追加したorderbyパラメタの番号(4)に名前を定義する
|
: ++ product_order_favorite_higher: 4 : |
参考)
https://github.com/EC-CUBE/ec-cube/issues/2703
- /src/Eccube/Repository/ProductRepository.php に、SQLを定義する
|
// 新着順のセクションの後に以下を追加 // お気に入り数順 else if (!empty($searchData['orderby']) && $searchData['orderby']->getId() == $config['product_order_favorite_higher']) { $qb->addSelect('COUNT(cfp.id) as HIDDEN favorite_count'); $qb->leftJoin('p.CustomerFavoriteProducts', 'cfp'); $qb->groupBy('p'); $qb->orderBy('favorite_count', 'DESC'); $qb->addOrderBy('p.id', 'DESC'); } |
※クエリビルダーを使用する際、JOINするテーブル名やカラム名はdoctrineの定義に基づくので、 /src/Eccube/Resource/doctrine/Eccube.Entity.CustomerFavoriteProduct.dcm.ymlなどの中を確認して、同じ名前にする。
ちなみに、上記は、生のSQLとしては下記のような感じとなる。多分。
|
SELECT * , Count(cfp.product_id) AS favorite_count FROM dtb_product AS p LEFT JOIN dtb_customer_favorite_product AS cfp ON p.product_id = cfp.product_id GROUP BY p.product_id ORDER BY favorite_count DESC, p.product_id DESC |
参考)
https://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=17472&forum=10
https://ameblo.jp/withathena/entry-12173872626.html
https://umebius.com/eccube/sort_admin_product_master/
http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/query-builder.html
https://teratail.com/questions/30434
https://teratail.com/questions/43888
http://www.aiship.jp/knowhow/archives/25107
http://d.hatena.ne.jp/Fivestar/20100423/1272013815
以上で、商品一覧ページのドロップダウンに「お気に入り数順」が追加され、選択するとお気に入りに追加された数の多い商品順にソートされる。