custom/plugins/NrbnSenertec/src/Subscriber/SearchSubscriber.php line 45

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace NrbnSenertec\Subscriber;
  3. use Shopware\Core\Content\Product\Events\ProductSearchCriteriaEvent;
  4. use Shopware\Core\Content\Product\Events\ProductSuggestCriteriaEvent;
  5. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Query\ScoreQuery;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. class SearchSubscriber implements EventSubscriberInterface{
  11.     /**
  12.      * @var EntityRepository
  13.      */
  14.     protected EntityRepository              $nrbnSearchKeywordRepository;
  15.     public function __construct(
  16.         EntityRepository                     $nrbnSearchKeywordRepository
  17.     ){
  18.         $this->nrbnSearchKeywordRepository $nrbnSearchKeywordRepository;
  19.     }
  20.     public static function getSubscribedEvents(): array {
  21.         return [
  22.             ProductSearchCriteriaEvent::class => 'searchCriteria',
  23.             ProductSuggestCriteriaEvent::class => 'suggestCriteria'
  24.         ];
  25.     }
  26.     
  27.     public function searchCriteria(ProductSearchCriteriaEvent $event) {
  28.         if(!$event->getSalesChannelContext()->getCustomer()){
  29.             $event->getCriteria()->setLimit(0);
  30.             return;
  31.         }
  32.         if(!$event->getRequest()->query->get("advanced")){
  33.             return;
  34.         }
  35.         return $this->createAdvancedCriteria($event);
  36.     }
  37.     public function suggestCriteria(ProductSuggestCriteriaEvent $event) {
  38.         if(!$event->getSalesChannelContext()->getCustomer()){
  39.             $event->getCriteria()->setLimit(0);
  40.             return;
  41.         }
  42.         if(!$event->getRequest()->query->get("advanced")){
  43.             return;
  44.         }
  45.         return $this->createAdvancedCriteria($event);
  46.     }
  47.     /**
  48.      * @param $event
  49.      * @return mixed
  50.      */
  51.     private function createAdvancedCriteria($event)
  52.     {
  53.         $criteria $event->getCriteria();
  54.         $productFilters $criteria->getFilters()[0];
  55.         $searchKeywordFilters $criteria->getFilters()[1];
  56.         $queries $criteria->getQueries();
  57.         $criteria->resetFilters();
  58.         $criteria->addFilter($productFilters);
  59.         foreach ($searchKeywordFilters->getQueries() as $filter){
  60.             $values $filter->getValue();
  61.             $field str_replace("searchKeywords""nrbnSearchKeywords"$filter->getField());
  62.             $newFilter null;
  63.             if($filter instanceof EqualsAnyFilter){
  64.                 $newFilter = new EqualsAnyFilter($field$values);
  65.             } elseif ($filter instanceof EqualsFilter) {
  66.                 $newFilter = new EqualsFilter($field$values);
  67.             }
  68.             if($newFilter){
  69.                 $criteria->addFilter($newFilter);
  70.             }
  71.         }
  72.         $criteria->resetQueries();
  73.         foreach ($queries as $query){
  74.             $scoreField "product.nrbnSearchKeywords.ranking";
  75.             $value $query->getQuery()->getValue();
  76.             $field str_replace("searchKeywords""nrbnSearchKeywords"$query->getQuery()->getField());
  77.             $filter = new EqualsFilter($field$value);
  78.             $newScoreQuery = new ScoreQuery($filter$query->getScore(), $scoreField);
  79.             $criteria->addQuery($newScoreQuery);
  80.         }
  81.         return $event;
  82.     }
  83. }