custom/plugins/CbaxModulManufacturers/src/Subscriber/FrontendSubscriber.php line 44

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Cbax\ModulManufacturers\Subscriber;
  3. use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Cbax\ModulManufacturers\Components\ConfigReaderHelper;
  6. use Cbax\ModulManufacturers\Components\ManufacturersHelper;
  7. use Shopware\Core\Content\Cms\Aggregate\CmsSection\CmsSectionCollection;
  8. class FrontendSubscriber implements EventSubscriberInterface
  9. {
  10.     private $config;
  11.     /**
  12.      * @var ConfigReaderHelper
  13.      */
  14.     private $configReader;
  15.     /**
  16.      * @var ManufacturersHelper
  17.      */
  18.     private $helperComponent;
  19.     public function __construct(
  20.             ConfigReaderHelper $configReader,
  21.             ManufacturersHelper $helperComponent
  22.             )
  23.     {
  24.         $this->configReader $configReader;
  25.         $this->config null;
  26.         $this->helperComponent $helperComponent;
  27.     }
  28.     public static function getSubscribedEvents(): array
  29.     {
  30.         return [
  31.             ProductPageLoadedEvent::class => 'onProductPageLoaded'
  32.         ];
  33.     }
  34.     public function onProductPageLoaded(ProductPageLoadedEvent $event)
  35.     {
  36.         $this->config $this->config ?? $this->configReader->getConfig();
  37.         if ($this->config['active'] != true)
  38.         {
  39.             return;
  40.         }
  41.         $page $event->getPage();
  42.         $cmsPage $page->getCmsPage();
  43.         $hasCmsProductSlider false;
  44.         $cbaxProductSliderBlockId null;
  45.         if (!empty($cmsPage))
  46.         {
  47.             foreach ($cmsPage->getSections()->getElements() as $section)
  48.             {
  49.                 if (!empty($section->getBlocks()))
  50.                 {
  51.                     $filteredBlocks $section->getBlocks()->filterByProperty('type''cbax-manufacturers-product-slider');
  52.                     if (!empty($filteredBlocks->getElements()))
  53.                     {
  54.                         $hasCmsProductSlider true;
  55.                         $sliderConfig $filteredBlocks->first()->getSlots()->first()->getFieldConfig()->getElements();
  56.                         $cbaxProductSliderBlockId $filteredBlocks->first()->getId();
  57.                         break;
  58.                     }
  59.                 }
  60.             }
  61.         }
  62.         if (($this->config['showProductSlider'] == true && empty($cmsPage)) || ($hasCmsProductSlider && !empty($cmsPage)))
  63.         {
  64.             $salesChannelContext $event->getSalesChannelContext();
  65.             $product $page->getProduct();
  66.             $currentProductId $product->getParentId() ? $product->getParentId() : $product->getId();
  67.             // Shopware übergibt hier nur einen Teil der nötigen Daten, daher später kompletten Hersteller holen
  68.             $thinManufacurer $product->getManufacturer();
  69.             // prüfen, ob ein Hersteller hinterlegt ist
  70.             if ($thinManufacurer !== null) {
  71.                 $manufaturerId $thinManufacurer->getId();
  72.                 $categoryId null;
  73.                 if (($this->config['sliderByCategory'] && !$hasCmsProductSlider) || ($hasCmsProductSlider && $sliderConfig['sliderByCategory']->getValue()))
  74.                 {
  75.                     $categoryTree $product->getCategoryTree();
  76.                     $categoryId end($categoryTree);
  77.                 }
  78.                 $manufacturerProducts $this->helperComponent->getProductsByManufacturer(
  79.                     $manufaturerId,
  80.                     $categoryId,
  81.                     $salesChannelContext,
  82.                     $hasCmsProductSlider $sliderConfig['productSliderSorting']->getValue() : $this->config['productSliderSorting'],
  83.                     $hasCmsProductSlider $sliderConfig['maxSliderProducts']->getValue() : $this->config['maxSliderProducts'],
  84.                     $currentProductId
  85.                 );
  86.                 if (($this->config['sliderWithManufacturer'] && !$hasCmsProductSlider) || ($hasCmsProductSlider && $sliderConfig['sliderWithManufacturer']->getValue()))
  87.                 {
  88.                     $manufacturer $this->helperComponent->getManufacturerById($manufaturerId$salesChannelContext);
  89.                     $manufacturerProducts array_merge($manufacturer$manufacturerProducts);
  90.                 }
  91.             } else {
  92.                 $manufacturerProducts = [];
  93.             }
  94.             if (empty($manufacturerProducts) && !empty($cmsPage) && !empty($cbaxProductSliderBlockId))
  95.             {
  96.                 $cmsSectionCollection = new CmsSectionCollection();
  97.                 foreach ($cmsPage->getSections() as $section) {
  98.                     $newBlocksCollection $section->getBlocks();
  99.                     $newBlocksCollection->filterAndReduceByProperty('id'$cbaxProductSliderBlockId);
  100.                     $section->setBlocks($newBlocksCollection);
  101.                     $cmsSectionCollection->add($section);
  102.                 }
  103.                 $cmsPage->setSections($cmsSectionCollection);
  104.                 $page->setCmsPage($cmsPage);
  105.             }
  106.             $page->assign( ['cbaxModulManufacturers' => $manufacturerProducts]);
  107.         }
  108.     }
  109. }