custom/plugins/S360Experts/src/Storefront/Page/Product/Subscriber/ProductPageSubscriber.php line 45

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace S360Experts\Storefront\Page\Product\Subscriber;
  4. use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Shopware\Core\System\SystemConfig\SystemConfigService;
  7. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  9. use Shopware\Core\Framework\Struct\ArrayStruct;
  10. class ProductPageSubscriber implements EventSubscriberInterface
  11. {
  12.     /**
  13.      * @var SystemConfigService
  14.      */
  15.     private $systemConfigService;
  16.     /**
  17.      * @var EntityRepository
  18.      */
  19.     private $expertRepository;
  20.     public function __construct(
  21.         SystemConfigService $systemConfigService
  22.         EntityRepository $expertRepository
  23.     )   {
  24.         $this->expertRepository $expertRepository;
  25.         $this->systemConfigService $systemConfigService;
  26.     }
  27.     /**
  28.      * @inheritDoc
  29.      */
  30.     public static function getSubscribedEvents(): array
  31.     {
  32.         return [
  33.             ProductPageLoadedEvent::class => 'onProductPageLoaded'
  34.         ];
  35.     }
  36.     public function onProductPageLoaded(ProductPageLoadedEvent $event): void
  37.     {
  38.         $product $event->getPage()->getProduct();
  39.         $productExtensions $product->getExtensions();
  40.         //    has expert assigned via category no product expert assigned
  41.         if($this->systemConfigService->get('S360Experts.config.inheritFromCategory') && $productExtensions['experts'] && empty($productExtensions['experts']->getElements())) {
  42.             $categoryTree $event->getPage()->getProduct()->getCategoryTree();
  43.             if(!empty($categoryTree)) {
  44.                 $categoryTree array_reverse($categoryTree); // needs to reverse cause the most specific category needs to be first and then we get more general
  45.                 array_pop($categoryTree);
  46.         
  47.                 $criteria = new Criteria();
  48.                 $criteria->addAssociation('categories');
  49.                 $allExperts $this->expertRepository->search($criteria$event->getContext());
  50.         
  51.                 foreach($allExperts as $expert) {
  52.                     if(empty($productExtensions['experts']->getElements())) {
  53.         
  54.                     foreach($categoryTree as $categoryId) {
  55.                         if($expert->getCategories()->has($categoryId)) {
  56.                         $productExtensions['experts']->add($expert);
  57.                         }
  58.                     }
  59.                     }
  60.                 }
  61.             }
  62.         }
  63.         // this is the base entities we assign to my page
  64.         if($productExtensions['experts'] && !empty($productExtensions['experts']->getElements())) {
  65.             $event->getPage()->getProduct()->addExtension('s360_experts'$productExtensions['experts']);
  66.         }
  67.         // this is their images
  68.         $s360ExpertImages = [];
  69.         foreach($productExtensions['experts'] as $s360Expert) {
  70.             if(!empty($s360Expert->getImage())) {
  71.                 $s360ExpertImages[] = $s360Expert->getImage();
  72.             }
  73.         }
  74.         $event->getPage()->getProduct()->addExtension('s360_experts_images', new ArrayStruct($s360ExpertImages));
  75.     }
  76. }