Repository Customizerを使用する
- app/Customize/Repository/ProductListCustomizer.php を新規作成
Repositoryディレクトリもなければ新規作成する必要あり
<?php
namespace Customize\Repository;
use Eccube\Doctrine\Query\JoinClause;
use Eccube\Doctrine\Query\WhereClause;
use Eccube\Doctrine\Query\JoinCustomizer;
use Eccube\Repository\QueryKey;
use Eccube\Entity\Master\Work;
class ProductListCustomizer extends JoinCustomizer
{
/**
* 検索条件を追加する
*
* @param array $params
* @param $queryKey
* @return JoinClause[]
*/
public function createStatements($params, $queryKey)
{
// ★ ここに追加条件を実装
}
/**
* @return string
* @see \Eccube\Repository\ProductRepository::getQueryBuilderBySearchDataForAdmin()
* @see QueryKey
*/
public function getQueryKey()
{
// ★ 商品一覧 (検索結果一覧) をカスタマイズする
return QueryKey::PRODUCT_SEARCH;
}
}
仕組みや詳細は公式ドキュメントを参照
商品一覧以外のページをカスタマイズする場合は、getQueryKey()
で返すキーを対象のものにしてあげる必要があり
(キーの一覧も上記ドキュメントに記載)
早速上記のcreateStatements()
の中身の実装例を記載していく
順番指定を追加してみる
/**
* 常に商品IDでソートする場合
*
* @param array $params
* @param $queryKey
* @return OrderByClause[]
*/
protected function createStatements($params, $queryKey)
{
return [new OrderByClause('p.id')];
}
/**
* 商品ID→商品名の順でソートする場合
*
* @param array $params
* @param $queryKey
* @return OrderByClause[]
*/
protected function createStatements($params, $queryKey)
{
return [new OrderByClause('p.id'), new OrderByClause('p.name')];
}
商品条件を追加してみる
/**
* 検索条件を追加する
*
* @param array $params
* @param $queryKey
* @return WhereClause[]
*/
public function createStatements($params, $queryKey)
{
return [WhereClause::eq('p.description_detail', ':description_detail', ['description_detail' => 'test'])];
}
上記だと、testという説明文の商品だけがヒットする
曖昧検索したい場合は下記にすればOK
/**
* 検索条件を追加する
*
* @param array $params
* @param $queryKey
* @return WhereClause[]
*/
public function createStatements($params, $queryKey)
{
return [WhereClause::like('p.description_detail', ':description_detail', ['description_detail' => '%test%'])];
}
その他 WhereClause
の使い方は実際のソースにわかりやすく書いてくれてる
→ src/Eccube/Doctrine/Query/WhereClause.php
またcreateStatements
が配列を返す仕様のところから察する通り、
各種条件は複数指定もできる
/**
* 検索条件を追加する
*
* @param array $params
* @param $queryKey
* @return WhereClause[]
*/
public function createStatements($params, $queryKey)
{
return [
WhereClause::like('p.description_detail', ':description_detail', ['description_detail' => '%test%']),
WhereClause::like('p.description_detail', ':description_detail', ['description_detail' => '%hoge%'])
];
}
Joinしてリレーションの検索条件を追加してみる
- 例えば商品に紐づくタグIDを指定したい場合
/**
* 検索条件を追加する
*
* @param array $params
* @param $queryKey
* @return JoinClause[]
*/
public function createStatements($params, $queryKey)
{
$join_clause = JoinClause::leftJoin('p.ProductTag', 'pt');
$join_clause->addWhere(WhereClause::eq('pt.id', ':tag_id', ['tag_id' => 1]));
return [$join_clause];
}
- 複数のタグIDを指定する場合
/**
* 検索条件を追加する
*
* @param array $params
* @param $queryKey
* @return JoinClause[]
*/
public function createStatements($params, $queryKey)
{
$join_clause = JoinClause::leftJoin('p.ProductTag', 'pt');
$join_clause->addWhere(WhereClause::eq('pt.id', ':tag_id', ['tag_id' => 1]));
$join_clause->addWhere(WhereClause::eq('pt.id', ':tag_id', ['tag_id' => 2]));
return [$join_clause];
}
このJoinClause
はleftJoinだけじゃなくてinnerJoinやオプション追加もできる
詳細→ src/Eccube/Doctrine/Query/JoinClause.php
ECCUBEでは、商品の一覧を表示したり名前/カテゴリで検索する機能がある
そこに独自の順番や検索条件を追加したい場合のメモ