【EC-CUBE3】検索フォームで商品コードやフリーエリアの内容を検索できるようにする方法

itworld 2,089 ビュー | 2019/09/09

ECCUBE3のデフォルトで用意されている検索フォームには、
カテゴリ検索とフリーワード検索が行える機能が用意されています。
フリーワード検索に入力して検索する場合、
検索対象になるのが、管理画面の商品登録画面から設定する「商品名」と「検索ワード」が対象となります。
「検索ワード」に設定すれば検索できるといっても入力するのが面倒なので、
その他の項目で入力した内容も検索対象としてみたいと思います。

商品コードやフリーエリアの内容を検索対象にする方法

修正するファイルは以下ファイルです。
/src/Eccube/Repository/ProductRepository.php

123行目付近に以下記述がありますので、以下のように修正してください。
※修正しているのは、以下の8行目だけです。

修正前

// name
       if (isset($searchData['name']) && Str::isNotBlank($searchData['name'])) {
           $keywords = preg_split('/[\s ]+/u', $searchData['name'], -1, PREG_SPLIT_NO_EMPTY);

           foreach ($keywords as $index => $keyword) {
               $key = sprintf('keyword%s', $index);
               $qb
                   ->andWhere(sprintf('NORMALIZE(p.name) LIKE NORMALIZE(:%s) OR NORMALIZE(p.search_word) LIKE NORMALIZE(:%s)', $key, $key))
                   ->setParameter($key, '%' . $keyword . '%');
           }
       }


 

修正後

// name
if (isset($searchData['name']) && Str::isNotBlank($searchData['name'])) {
    $keywords = preg_split('/[\s ]+/u', $searchData['name'], -1, PREG_SPLIT_NO_EMPTY);
 
    foreach ($keywords as $index => $keyword) {
        $key = sprintf('keyword%s', $index);
        $qb
            ->andWhere(sprintf('NORMALIZE(p.name) LIKE NORMALIZE(:%s) OR NORMALIZE(p.search_word) LIKE NORMALIZE(:%s) OR NORMALIZE(p.description_list) LIKE NORMALIZE(:%s) OR NORMALIZE(p.description_detail) LIKE NORMALIZE(:%s) OR NORMALIZE(p.free_area) LIKE NORMALIZE(:%s) OR NORMALIZE(pc.code) LIKE NORMALIZE(:%s)', $key, $key, $key, $key, $key, $key))
            ->setParameter($key, '%' . $keyword . '%');
    }
}

 

修正方法としては、ORで条件を繋げているだけなのでそれほど難しくないと思います。
1点注意としては、クエリに割り当てたい変数の記述漏れは注意しましょう。
今回であれば、「$key」です。
ORで繋げた分追加しましょう。

記事:https://itworld.jp/