custom/static-plugins/AbasConnector/src/Subscribers/Search/AbasSearchSubscriber.php line 87

Open in your IDE?
  1. <?php
  2. namespace Abas\AbasConnector\Subscribers\Search;
  3. use Abas\AbasConnector\Service\Customer\AbasCustomerItemNumberService;
  4. use RuntimeException;
  5. use Shopware\Core\Content\Product\Events\ProductSearchCriteriaEvent;
  6. use Shopware\Core\Content\Product\Events\ProductSuggestCriteriaEvent;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Query\ScoreQuery;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. class AbasSearchSubscriber implements EventSubscriberInterface
  13. {
  14.     /**
  15.      * @var AbasCustomerItemNumberService
  16.      */
  17.     private AbasCustomerItemNumberService $abasCustomerItemNumberService;
  18.     /**
  19.      *
  20.      * @param AbasCustomerItemNumberService $abasCustomerItemNumberService
  21.      */
  22.     public function __construct(AbasCustomerItemNumberService $abasCustomerItemNumberService)
  23.     {
  24.         $this->abasCustomerItemNumberService $abasCustomerItemNumberService;
  25.     }
  26.     /**
  27.      * @return string[]
  28.      */
  29.     public static function getSubscribedEvents(): array
  30.     {
  31.         return [
  32.             ProductSearchCriteriaEvent::class => 'addSearchCriteria',
  33.             ProductSuggestCriteriaEvent::class => 'addSearchSuggestCriteria'
  34.         ];
  35.     }
  36.     /**
  37.      * @param ProductSearchCriteriaEvent|ProductSuggestCriteriaEvent $event
  38.      * @return void
  39.      */
  40.     private function handleSearchCriteriaUpdate($event): void
  41.     {
  42.         $criteria $event->getCriteria();
  43.         $customer $event->getSalesChannelContext()->getCustomer();
  44.         $request $event->getRequest();
  45.         $searchTerm $request->get('search');
  46.         if ($customer === null) {
  47.             $this->updateFilters($criteria$searchTerm);
  48.             $this->updateQueries($request->getQueryString(), $criteria$searchTerm);
  49.         } else {
  50.             $customerProductList $this->abasCustomerItemNumberService->loadCustomerItemsByOwnNumber(
  51.                 $searchTerm,
  52.                 $customer->getCustomerNumber(),
  53.                 10
  54.             );
  55.             if (empty($customerProductList) && !empty($searchTerm)) {
  56.                 $this->updateFilters($criteria$searchTerm);
  57.                 $this->updateQueries($request->getQueryString(), $criteria$searchTerm);
  58.             }
  59.         }
  60.     }
  61.     /**
  62.      * @param ProductSearchCriteriaEvent $event
  63.      *
  64.      * @return void
  65.      * @throws RuntimeException
  66.      */
  67.     public function addSearchCriteria(ProductSearchCriteriaEvent $event): void
  68.     {
  69.         $this->handleSearchCriteriaUpdate($event);
  70.     }
  71.     /**
  72.      * @param ProductSuggestCriteriaEvent $event
  73.      *
  74.      * @return void
  75.      * @throws RuntimeException
  76.      */
  77.     public function addSearchSuggestCriteria(ProductSuggestCriteriaEvent $event): void
  78.     {
  79.         $this->handleSearchCriteriaUpdate($event);
  80.     }
  81.     /**
  82.      * @param Criteria $criteria
  83.      * @param string $searchTerm
  84.      * @return void
  85.      */
  86.     protected function updateFilters(Criteria $criteriastring $searchTerm): void
  87.     {
  88.         $newFilters null;
  89.         $filters $criteria->getFilters();
  90.         foreach ($filters as $filter) {
  91.             if ($filter instanceof EqualsAnyFilter && $filter->getField() === "product.searchKeywords.keyword") {
  92.                 $values $filter->getValue();
  93.                 $values[] = $searchTerm;
  94.                 $newFilters[] = new EqualsAnyFilter("product.searchKeywords.keyword"$values);
  95.             } else {
  96.                 $newFilters[] = $filter;
  97.             }
  98.         }
  99.         if ($newFilters) {
  100.             $criteria->resetFilters();
  101.             foreach ($newFilters as $filter) {
  102.                 $criteria->addFilter($filter);
  103.             }
  104.         }
  105.     }
  106.     /**
  107.      * @param string $origQuery
  108.      * @param Criteria $criteria
  109.      * @param string $searchTerm
  110.      * @return void
  111.      */
  112.     protected function updateQueries(string $origQueryCriteria $criteriastring $searchTerm)
  113.     {
  114.         $newQueries null;
  115.         $origQuery explode("="$origQuery)[1];
  116.         $queries $criteria->getQueries();
  117.         foreach ($queries as $query) {
  118.             if ($query instanceof ScoreQuery && $query->getQuery()->getField() === "product.searchKeywords.keyword") {
  119.                 $values[] = $origQuery;
  120.                 $score $query->getScore();
  121.                 $scoreField $query->getScoreField();
  122.                 $newQueries[] = new ScoreQuery(
  123.                     new ContainsFilter(
  124.                         "product.searchKeywords.keyword",
  125.                         $searchTerm
  126.                     ),
  127.                     $score,
  128.                     $scoreField
  129.                 );
  130.             } else {
  131.                 $newQueries[] = $query;
  132.             }
  133.         }
  134.         if ($newQueries) {
  135.             $criteria->resetQueries();
  136.             foreach ($newQueries as $query) {
  137.                 $criteria->addQuery($query);
  138.             }
  139.         }
  140.     }
  141. }