custom/plugins/NimbitsProductSuccessorNext/src/Subscriber/Subscriber.php line 57

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Nimbits\NimbitsProductSuccessorNext\Subscriber;
  3. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Shopware\Core\Content\Product\ProductEvents;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  7. use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
  8. use Shopware\Core\Content\Cms\CmsPageEntity;
  9. use Symfony\Component\HttpKernel\KernelEvents;
  10. use Symfony\Component\HttpKernel\Event\KernelEvent;
  11. use Shopware\Storefront\Event\StorefrontRenderEvent;
  12. use Shopware\Storefront\Pagelet\Footer\FooterPageletLoadedEvent;
  13. use Nimbits\NimbitsProductSuccessorNext\Setting\Service\SettingService;
  14. use Shopware\Core\Framework\Struct\ArrayEntity;
  15. use Shopware\Core\Framework\Struct\StructCollection;
  16. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  17. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  18. use Shopware\Core\Content\Product\SalesChannel\Detail\AbstractProductDetailRoute;
  19. class Subscriber implements EventSubscriberInterface
  20. {
  21.     
  22.     /** @var SettingService $settingsService */
  23.     protected $settingsService;
  24.     
  25.     /** @var AbstractProductDetailRoute $productDetailRoute */
  26.     protected $productDetailRoute;
  27.     
  28.     /** @var EntityRepositoryInterface $productSuccessorRepository */
  29.     protected $productSuccessorRepository;
  30.     public function __construct(
  31.         SettingService $settingsService,
  32.         AbstractProductDetailRoute $productDetailRoute,
  33.         EntityRepositoryInterface $productSuccessorRepository
  34.     
  35.     {
  36.         $this->settingsService $settingsService;
  37.         $this->productDetailRoute $productDetailRoute;
  38.         $this->productSuccessorRepository $productSuccessorRepository;
  39.     }
  40.     public static function getSubscribedEvents(): array
  41.     {
  42.         // Return the events to listen to as array like this:  <event to listen to> => <method to execute>
  43.         return [
  44.             ProductPageLoadedEvent::class => 'onProductPageLoaded'
  45.         ];
  46.     }
  47.     
  48.     public function onProductPageLoaded(ProductPageLoadedEvent $event)
  49.     {
  50.         $productId $event->getPage()->getProduct()->getId();
  51.         
  52.         $event->getPage()->getProduct()->addExtension('nimbitsProductSuccessorSettings'$this->settingsService->getSettingsAsStruct($event->getSalesChannelContext()->getSalesChannel()->getId()));
  53.         
  54.         $successors $this->productSuccessorRepository->search(
  55.                 (new Criteria())
  56.                     ->addFilter(new EqualsFilter('productIdFrom'$productId)),
  57.                 \Shopware\Core\Framework\Context::createDefaultContext()
  58.         );
  59.         
  60.         $successors $successors->getElements();
  61.         if(count($successors) == 0)
  62.             return;
  63.         
  64.         $sucessorArticles = [];
  65.         
  66.         foreach($successors as $k => $successor)
  67.         {
  68.             try
  69.             {
  70.                 $criteria = (new Criteria())
  71.                 ->addAssociation('manufacturer.media')
  72.                 ->addAssociation('options.group')
  73.                 ->addAssociation('properties.group')
  74.                 ->addAssociation('mainCategories.category');
  75.                 $criteria
  76.                 ->getAssociation('media');
  77.             
  78.                 $sucessorArticles[] = $this->productDetailRoute->load($successor->getProductIdTo(), 
  79.                     $event->getRequest(), $event->getSalesChannelContext(), $criteria)->getProduct();
  80.             }
  81.             catch(\Exception $e)
  82.             {
  83.                 //there might be inactivate products in the list; we must not display them and just skip therefore
  84.             }
  85.         }
  86.         
  87.         $event->getPage()->getProduct()->addExtension('nimbitsProductSuccessor', (new StructCollection())->assign(['articles' => $sucessorArticles]));
  88.     }
  89.     
  90. }
  91. ?>