custom/plugins/EsmComputer/src/Storefront/Subscriber/OtherProductVotesSubscriber.php line 38

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace EsmComputer\Storefront\Subscriber;
  4. use Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity;
  5. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  8. use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
  9. use Shopware\Storefront\Page\Product\Review\ProductReviewsLoadedEvent;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use function array_key_exists;
  12. class OtherProductVotesSubscriber implements EventSubscriberInterface
  13. {
  14.     protected EntityRepository $productReviewRepository;
  15.     protected SalesChannelRepositoryInterface $salesChannelProductRepository;
  16.     public function __construct(
  17.         EntityRepository $productReviewRepository,
  18.         SalesChannelRepositoryInterface $salesChannelProductRepository
  19.     )
  20.     {
  21.         $this->productReviewRepository $productReviewRepository;
  22.         $this->salesChannelProductRepository $salesChannelProductRepository;
  23.     }
  24.     public static function getSubscribedEvents()
  25.     {
  26.         return [
  27.             ProductReviewsLoadedEvent::class => [[
  28.                 'onProductReviewsLoaded'150
  29.             ]]
  30.         ];
  31.     }
  32.     public function onProductReviewsLoaded(ProductReviewsLoadedEvent $event): void
  33.     {
  34.         $request $event->getRequest();
  35.         $productId $request->get('parentId') ?? $request->get('productId');
  36.         $criteria = new Criteria([$productId]);
  37.         /** @var SalesChannelProductEntity $product */
  38.         $product $this->salesChannelProductRepository->search($criteria$event->getSalesChannelContext())->getEntities()->first();
  39.         if(!array_key_exists('custom_product_model'$product->getCustomFields())) {
  40.             return;
  41.         }
  42.         $model $product->getCustomFields()['custom_product_model'];
  43.         if(!$model) {
  44.             return;
  45.         }
  46.         $criteria $event->getSearchResult()->getCriteria();
  47.         $criteria->resetFilters();
  48.         $criteria->addAssociation('product');
  49.         $criteria->addFilter(new EqualsFilter('status'true));
  50.         $criteria->addFilter(new EqualsFilter('product.customFields.custom_product_model'$model));
  51.         $allReviews $this->productReviewRepository->search($criteria$event->getContext());
  52.         $event->getSearchResult()->merge($allReviews->getEntities());
  53.         $event->getSearchResult()->getAggregations()->set('ratingMatrix'$allReviews->getAggregations()->get('ratingMatrix'));
  54.     }
  55. }