要望や症状
管理画面の受注編集画面で、商品情報セクションの「商品を追加」を行ったときに、商品の検索結果には廃止ステータスの商品も表示されます。
理由や原因
この現象は EC-CUBE 4系の標準仕様によるものです。
技術的な背景
商品検索の処理を担当する ProductRepository の getQueryBuilderBySearchDataForAdmin メソッドでは、公開ステータスによる絞り込み条件が設定されていない場合があります。このため、データベース上に存在する「公開」「非公開」「廃止」すべてのステータスの商品が検索結果に含まれることになります。
解決策
ProductRepository をカスタマイズすることで、廃止ステータスの商品を検索対象から除外できます。以下の手順で実装を行ってください。
1. カスタマイズ用の ProductRepository を作成
app/Customize/Repository ディレクトリに新しい ProductRepository クラスを作成します。
<?php
// app/Customize/Repository/ProductRepository.php
namespace Customize\Repository;
use Eccube\Entity\Master\ProductStatus;
use Eccube\Repository\ProductRepository as BaseProductRepository;
use Doctrine\ORM\QueryBuilder;
class ProductRepository extends BaseProductRepository
{
public function getQueryBuilderBySearchDataForAdmin($searchData)
{
$qb = parent::getQueryBuilderBySearchDataForAdmin($searchData);
// 廃止商品を検索対象から除外
$qb->andWhere('p.Status != :exclude_status')
->setParameter('exclude_status', ProductStatus::ABOLISHED);
return $qb;
}
}
ベースクラスの処理を継承しつつ、廃止ステータスの商品を除外する条件を追加しています。
2. サービス定義で Repository を置き換え
app/Customize/Resource/config/services.yaml ファイルでサービス定義を追加し、標準の ProductRepository を置き換えます。
# app/Customize/Resource/config/services.yaml
services:
Eccube\Repository\ProductRepository:
class: Customize\Repository\ProductRepository
parent: 'eccube.repository.product'
3. キャッシュをクリア
変更を反映するため、以下のコマンドでキャッシュをクリアします。
bin/console cache:clear