要望や症状
EC-CUBE 4系 の管理画面において、商品一覧の検索機能で英字の大文字小文字が区別される仕様となっています。
フロント画面の商品検索では「Chicken」と「chicken」のどちらで検索しても同じ結果が返されるのに対し、管理画面の商品一覧検索では大文字小文字が区別されて異なる結果が返されます。このため、管理者が商品管理を行う際に、フロント画面とは異なる検索動作となり、統一された操作感を得ることができません。
管理画面でもフロント画面と同様の大文字小文字を区別しない検索動作を実現したい場合は、カスタマイズが必要となります。
理由や原因
フロント画面と管理画面で意図的に異なる検索クエリが使用されていることが要因です。
フロント画面のProductRepositoryでは、getQueryBuilderBySearchData()メソッド内で商品名をNORMALIZE()関数により正規化処理を行っているため、大文字小文字を区別しない検索が実現されています。
一方、管理画面用の商品検索メソッドでは意図的に正規化処理が実装されておらず、データベースの照合順序に基づいた厳密な検索仕様となっています。これは管理画面では正確な商品管理を重視した設計思想によるものですが、運用方針によってはフロント画面と統一した検索動作が求められる場合があります。
解決策
管理画面の商品検索でも同様の正規化処理を実装するため、ProductRepositoryを継承してカスタマイズを行います。
1. カスタムProductRepositoryの作成
管理画面用の検索メソッドをオーバーライドして、正規化処理を追加します。
// app/Customize/Repository/ProductRepository.php
<?php
namespace Customize\Repository;
use Eccube\Repository\ProductRepository as BaseProductRepository;
use Doctrine\ORM\QueryBuilder;
class ProductRepository extends BaseProductRepository
{
public function getQueryBuilderBySearchDataForAdmin($searchData)
{
$qb = parent::getQueryBuilderBySearchDataForAdmin($searchData);
// 商品名検索時に正規化処理を追加
if (!empty($searchData['id'])) {
$qb->andWhere('NORMALIZE(p.name) LIKE NORMALIZE(:name)')
->setParameter('name', '%' . $searchData['id'] . '%');
}
return $qb;
}
}
2. サービス定義の追加
カスタムRepositoryをDIコンテナに登録します。
# app/Customize/Resource/config/services.yaml
services:
Customize\Repository\ProductRepository:
parent: Eccube\Repository\ProductRepository
tags:
- { name: doctrine.repository_service }
3. キャッシュクリア
設定を反映させるためにキャッシュをクリアします。
bin/console cache:clear
これで管理画面の商品一覧検索でも、フロント画面と同様に英字の大文字小文字を区別しない検索が可能になります。
注意事項
データベースの照合順序やMySQLのバージョンによって動作が異なる場合があります。実装前に必ずステージング環境での動作確認を行ってください。また、大量の商品データがある場合、検索パフォーマンスに影響する可能性があるため、必要に応じてインデックスの追加を検討してください。