【ECCUBE4】商品検索結果・一覧に順番やwhere条件を追加する

あおいくら

ECCUBEでは、商品の一覧を表示したり名前/カテゴリで検索する機能がある
そこに独自の順番や検索条件を追加したい場合のメモ

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];
}

このJoinClauseleftJoinだけじゃなくてinnerJoinやオプション追加もできる

詳細→ src/Eccube/Doctrine/Query/JoinClause.php

\ 案件のご依頼・ご相談はこちらから /