app/Plugin/PiaZProduct/Event/ProductSearchEventSubscriber.php line 40

Open in your IDE?
  1. <?php
  2. namespace Plugin\PiaZProduct\Event;
  3. use Eccube\Event\EccubeEvents;
  4. use Eccube\Event\EventArgs;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\RequestStack;
  7. /**
  8.  * 商品一覧検索イベントのサブスクライバー
  9.  */
  10. class ProductSearchEventSubscriber implements EventSubscriberInterface
  11. {
  12.     /**
  13.      * @var RequestStack
  14.      */
  15.     private $requestStack;
  16.     public function __construct(RequestStack $requestStack)
  17.     {
  18.         $this->requestStack $requestStack;
  19.     }
  20.     /**
  21.      * @return array
  22.      */
  23.     public static function getSubscribedEvents()
  24.     {
  25.         return [
  26.             EccubeEvents::FRONT_PRODUCT_INDEX_SEARCH => 'onProductIndexSearch',
  27.         ];
  28.     }
  29.     /**
  30.      * 商品一覧検索イベントの処理
  31.      *
  32.      * @param EventArgs $event
  33.      */
  34.     public function onProductIndexSearch(EventArgs $event)
  35.     {
  36.         $request $this->requestStack->getCurrentRequest();
  37.         $searchData $event->getArgument('searchData');
  38.         $qb $event->getArgument('qb');
  39.         // セッションから検索条件を取得
  40.         $session $request->getSession();
  41.         $sessionSearchData $session->get('pia_z_product_search_data', []);
  42.         // セッションの検索条件を反映
  43.         if (!empty($sessionSearchData)) {
  44.             $this->applySessionSearchData($searchData$qb$sessionSearchData);
  45.         }
  46.         // 更新された検索データをイベントに設定
  47.         $event->setArgument('searchData'$searchData);
  48.         $event->setArgument('qb'$qb);
  49.     }
  50.     /**
  51.      * セッションの検索条件を適用
  52.      *
  53.      * @param array $searchData
  54.      * @param \Doctrine\ORM\QueryBuilder $qb
  55.      * @param array $sessionSearchData
  56.      */
  57.     private function applySessionSearchData($searchData$qb$sessionSearchData)
  58.     {
  59.         // 商品名での検索
  60.         if (!empty($sessionSearchData['name'])) {
  61.             $qb->andWhere('p.name LIKE :session_name')
  62.                ->setParameter('session_name''%' $sessionSearchData['name'] . '%');
  63.         }
  64.         // 商品コードでの検索
  65.         if (!empty($sessionSearchData['code'])) {
  66.             $qb->andWhere('pc.code LIKE :session_code')
  67.                ->setParameter('session_code''%' $sessionSearchData['code'] . '%');
  68.         }
  69.         // カテゴリでの検索
  70.         if (!empty($sessionSearchData['category_id'])) {
  71.             $qb->andWhere('pc.category_id = :session_category_id')
  72.                ->setParameter('session_category_id'$sessionSearchData['category_id']);
  73.         }
  74.         // 価格範囲での検索
  75.         if (!empty($sessionSearchData['price_min'])) {
  76.             $qb->andWhere('pc.price02 >= :session_price_min')
  77.                ->setParameter('session_price_min'$sessionSearchData['price_min']);
  78.         }
  79.         if (!empty($sessionSearchData['price_max'])) {
  80.             $qb->andWhere('pc.price02 <= :session_price_max')
  81.                ->setParameter('session_price_max'$sessionSearchData['price_max']);
  82.         }
  83.         // 在庫状況での検索
  84.         if (isset($sessionSearchData['stock_status'])) {
  85.             if ($sessionSearchData['stock_status'] === 'in_stock') {
  86.                 $qb->andWhere('pc.stock > 0');
  87.             } elseif ($sessionSearchData['stock_status'] === 'out_of_stock') {
  88.                 $qb->andWhere('pc.stock <= 0');
  89.             }
  90.         }
  91.         // 販売状況での検索
  92.         if (!empty($sessionSearchData['status'])) {
  93.             $qb->andWhere('p.Status = :session_status')
  94.                ->setParameter('session_status'$sessionSearchData['status']);
  95.         }
  96.         // タグでの検索
  97.         if (!empty($sessionSearchData['tag'])) {
  98.             $qb->andWhere('pt.name LIKE :session_tag')
  99.                ->setParameter('session_tag''%' $sessionSearchData['tag'] . '%');
  100.         }
  101.         // カスタム検索条件の追加
  102.         $this->applyCustomSearchConditions($searchData$qb$sessionSearchData);
  103.     }
  104.     /**
  105.      * カスタム検索条件の適用
  106.      *
  107.      * @param array $searchData
  108.      * @param \Doctrine\ORM\QueryBuilder $qb
  109.      * @param array $sessionSearchData
  110.      */
  111.     private function applyCustomSearchConditions($searchData$qb$sessionSearchData)
  112.     {
  113.         // カスタムフィールドでの検索例
  114.         if (!empty($sessionSearchData['custom_field1'])) {
  115.             $qb->andWhere('p.custom_field1 LIKE :session_custom_field1')
  116.                ->setParameter('session_custom_field1''%' $sessionSearchData['custom_field1'] . '%');
  117.         }
  118.         // 複数条件の組み合わせ例
  119.         if (!empty($sessionSearchData['complex_condition'])) {
  120.             $conditions $sessionSearchData['complex_condition'];
  121.             
  122.             if (isset($conditions['brand']) && !empty($conditions['brand'])) {
  123.                 $qb->andWhere('p.brand = :session_brand')
  124.                    ->setParameter('session_brand'$conditions['brand']);
  125.             }
  126.             if (isset($conditions['material']) && !empty($conditions['material'])) {
  127.                 $qb->andWhere('p.material LIKE :session_material')
  128.                    ->setParameter('session_material''%' $conditions['material'] . '%');
  129.             }
  130.         }
  131.         // 日付範囲での検索
  132.         if (!empty($sessionSearchData['date_from'])) {
  133.             $qb->andWhere('p.create_date >= :session_date_from')
  134.                ->setParameter('session_date_from'$sessionSearchData['date_from']);
  135.         }
  136.         if (!empty($sessionSearchData['date_to'])) {
  137.             $qb->andWhere('p.create_date <= :session_date_to')
  138.                ->setParameter('session_date_to'$sessionSearchData['date_to']);
  139.         }
  140.     }
  141. }