バージョン選択

フォーラム

メニュー

オンライン状況

52 人のユーザが現在オンラインです。 (36 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 52
もっと...

サイト内検索

質問 > フロント機能 > 商品検索で複数のカテゴリを選択したい

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
goichi
投稿日時: 2020/7/18 13:45
対応状況: −−−
新米
登録日: 2020/7/18
居住地:
投稿: 2
商品検索で複数のカテゴリを選択したい
お世話になります。EC-CUBE4で商品検索する際、複数のカテゴリを条件に設定できるようにしたいと思っています。

標準の状態ですと、特定カテゴリに含まれる商品を表示させる際、
http://xxxx/products/list?category_id=1
のようにパラメータがつきますので、これを
http://xxxx/products/list?category_id[]=1&category_id[]=5
のようにして機能するようにしたいと思っています。

ProductController::index をみていくと、途中で
$searchForm = $builder->getForm();
$searchForm->handleRequest($request);
$searchData = $searchForm->getData();

と出てきます。ここで検索条件の入った$searchDataを作ったあと、PrductRepository::getQueryBuilderBySearchData()に投げているようなので、
素人ながらに、この辺りから手をつけていけば良いのかな、と思っているのですが、Symfony自体初心者なのもあり、どこを触ればよいのか、上手くイメージできないでいます。

複数のカテゴリを条件にして、商品を検索できるようにする場合、どのような手順で作業すれば良いでしょうか?
アイディアがあればお聞かせ頂きたく思います。m(__)m


▼テンプレート
[EC-CUBE] 4.0.4 (新規インストール)
[レンタルサーバ] ローカル環境(MAMP)
[PHP] 7.2.10
[データベース] MySQL 5.7.23
[WEBサーバ] Apache/2.2.34
umebius
投稿日時: 2020/7/19 0:42
対応状況: −−−
登録日: 2016/7/22
居住地: 東京日本橋
投稿: 1649
Re: 商品検索で複数のカテゴリを選択したい
SearchProductType.php でcategory_idを 'multiple' => trueにするなど方法は色々あるのですが、いろんな箇所の修正が必要になるので難易度高めです。

http://xxxx/products/list?category_id=1&category_id2=5ならまだましなのですが。


----------------
EC-CUBE4系 カスタマイズ ECのプロがシステム特急案件承ります。
EC-CUBE開発 リモートで働くエンジニア募集中

goichi
投稿日時: 2020/7/20 12:00
対応状況: 解決済
新米
登録日: 2020/7/18
居住地:
投稿: 2
Re: 商品検索で複数のカテゴリを選択したい
お返事ありがとうございます。

引用:
SearchProductType.php でcategory_idを 'multiple' => trueにする

いただいたヒントを元に、以下のように処理を書き換えました。(一応、動いていますので、どなたかの参考になればと思い晒しておきます・・・)


1)SearchProductType.phpの54行目付近から始まる処理に'multiple' => trueを追記して以下のようにした。
$builder->add('category_id', EntityType::class, [
            'class' => 'Eccube\Entity\Category',
            'choice_label' => 'NameWithLevel',
            'choices' => $Categories,
            'placeholder' => 'common.select__all_products',
            'required' => false,
            'multiple' => true
]);



2)ProductRepositry.phpの140行目付近から始まる、カテゴリ情報を受け取る箇所を以下のように変更した。
if (!empty($searchData['category_id']) && $searchData['category_id']) {
            //配列で操作したいので、カテゴリIDの入ったオブジェクトを配列化する。
            $targetCategories = $searchData['category_id']->toArray();

            //配列化したカテゴリ情報を順番に再帰処理する。
            for ($i=0;$i<count($targetCategories);$i++){
              //親カテゴリが選択されたときなどに対応するため、子孫カテゴリを確認する処理が入っているらしい。
              //今回配列になっているので、ここで一つ一つのカテゴリ情報を処理しておく。
              $targetCategoryObject = $searchData['category_id']->get($i);
              $Categories[] = $targetCategoryObject->getSelfAndDescendants();
            }

            //検索対象になるカテゴリIDをクエリビルダーにセットするため、ここで配列にしたい。
            //再帰処理から返ってきたものには子孫IDを持っているものがあるので、ループして順番に $targetCategoriesId にIDを渡していく。
            foreach ($Categories as $data){
              for($i=0;$i<count($data);$i++){
                $targetCategoriesId[] = $data[$i]->getId();
              }
            }

            //同じカテゴリIDがGETパラメータに与えられた際、重複するものがあるので一応整理しておく。
            $targetCategoriesId = array_unique($targetCategoriesId);
            $targetCategoriesId = array_values($targetCategoriesId);

            //カテゴリ条件をクエリビルダーに追加して検索させる。
            if (count($targetCategoriesId) > 0) {
              $qb
                ->innerJoin('p.ProductCategories', 'pct')
                ->innerJoin('pct.Category', 'c')
                ->andWhere($qb->expr()->in('pct.Category', ':Categories'))
                ->setParameter('Categories', $targetCategoriesId);
                $categoryJoin = true;
            }
}



3)View側でカテゴリ情報をそのまま利用している箇所があるが、配列になっていることを想定していないので、それらを削除した。(list.twig)


もっと上手いやり方があるかも知れませんが、メモとして残しておきたいと思います。ご回答ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は64,370名です
総投稿数は97,211件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
468
2484
4
nanasess
2088
5
umebius
1649
6
yuh
1612
7
red
1410
8
h_tanaka
1029
9
fukap
907
10
tsuji
863
11
shutta
835
12
tao_s
792
13 ramrun 789
14 karin 657
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.