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;
}
}
以上で完成です。
