EC-CUBE4の商品一覧を販売件数順で並べ替える方法

EC-CUBE4の商品一覧を販売件数順で並べ替える方法です。

最初に、管理画面>設定>システム設定>マスターデータ管理の「mtb_product_list_order_by」に販売件数順を追加してください。IDは4としてください。

次にCusotomizeディレクトリ内にRepositoryディレクトリを設置してください。

そして以下のようにProductOrderBySales.phpを作成してRepository内に設置してください。

<?php

namespace Customize\Repository;

use Eccube\Doctrine\Query\QueryCustomizer;
use Eccube\Repository\QueryKey;
use Doctrine\ORM\QueryBuilder;
use Eccube\Repository\OrderItemRepository;

/**
 * 販売件数順で並べ替えできるようにする
 * 
 * 管理画面>設定>システム設定>マスターデータ管理の「mtb_product_list_order_by」で販売件数順を追加する。
 * IDは4を設定
 *
 * @author Akira Kurozumi <info@a-zumi.net>
 */
class ProductOrderBySales implements QueryCustomizer {

    protected $orderItemRepository;


    public function __construct(OrderItemRepository $orderItemRepository)
    {
        $this->orderItemRepository = $orderItemRepository;
    }
    
    public function customize(QueryBuilder $builder, $params, $queryKey)
    {
        if(!empty($params["orderby"]) && $params["orderby"]->getId() == 4) {
            //dtb_order_itemテーブルで商品件数を集計するサブクエリ
            $qb = $this->orderItemRepository->createQueryBuilder("oi")
                    ->select("COUNT(oi.Product)")
                    ->where("oi.Product = p.id")
                    ->groupBy("oi.Product");
            
            // 上記のサブクエリをselectに追加
            $builder->addSelect(sprintf('(%s) AS HIDDEN total', $qb->getDql()))
                    ->orderBy("total", "DESC");
        }
    }

    public function getQueryKey(): string
    {
        return QueryKey::PRODUCT_SEARCH;
    }

}

以上で完成です。

お気軽にコメントをどうぞ

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください