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

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

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で繋げた分追加しましょう。