バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
goichi
投稿日時: 2020/7/18 13:45
対応状況: −−−
新米
登録日: 2020/7/18
居住地:
投稿: 6
商品検索で複数のカテゴリを選択したい
お世話になります。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
居住地:
投稿: 2085
Re: 商品検索で複数のカテゴリを選択したい
SearchProductType.php でcategory_idを 'multiple' => trueにするなど方法は色々あるのですが、いろんな箇所の修正が必要になるので難易度高めです。

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


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

goichi
投稿日時: 2020/7/20 12:00
対応状況: 解決済
新米
登録日: 2020/7/18
居住地:
投稿: 6
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公式 Amazon Payプラグイン

統計情報

総メンバー数は88,698名です
総投稿数は109,943件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1638
8
red
1570
9
mcontact
1283
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

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

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