お返事ありがとうございます。
引用:
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)
もっと上手いやり方があるかも知れませんが、メモとして残しておきたいと思います。ご回答ありがとうございました。