vendor/store.shopware.com/flinkcmsgridbuilder/src/Subscriber/CmsPageSubscriber.php line 38

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Flink\CmsGridBuilder\Subscriber;
  3. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  4. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  5. use Shopware\Storefront\Event\StorefrontRenderEvent;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Shopware\Core\Content\Cms\Events\CmsPageLoadedEvent;
  8. class CmsPageSubscriber implements EventSubscriberInterface
  9. {
  10.     protected $cmsGridRepository null;
  11.     public function __construct(
  12.         EntityRepository $cmsGridRepository
  13.     )
  14.     {
  15.         $this->cmsGridRepository $cmsGridRepository;
  16.     }
  17.     public static function getSubscribedEvents()
  18.     {
  19.         return [
  20.             CmsPageLoadedEvent::class => 'onCmsPageLoaded',
  21.             StorefrontRenderEvent::class => 'onStorefrontRender'
  22.         ];
  23.     }
  24.     public function onCmsPageLoaded(CmsPageLoadedEvent $event)
  25.     {
  26.         $entities $event->getResult()->getElements();
  27.         $this->_addCmsGridsToBlocks($entities$event->getContext());
  28.         array_walk($entities, function($cmsPage) { $cmsPage->flinkCmsGridsAdded true; });
  29.     }
  30.     public function onStorefrontRender(StorefrontRenderEvent $event)
  31.     {
  32.         $parameters $event->getParameters();
  33.         if (@is_object($parameters['page']) && method_exists($parameters['page'], 'getCmsPage')) {
  34.             $cmsPage $parameters['page']->getCmsPage();
  35.             if ($cmsPage) {
  36.                 $this->_addCmsGridsToBlocks([$cmsPage], $event->getContext());
  37.                 $cmsPage->flinkCmsGridsAdded true;
  38.             }
  39.         }
  40.     }
  41.     private function _addCmsGridsToBlocks($cmsPages$context)
  42.     {
  43.         $gridBlocks $this->_getGridBlocks($cmsPages);
  44.         $cmsGrids $this->_getCmsGrids($gridBlocks$context);
  45.         foreach ($cmsGrids as $cmsGrid) {
  46.             if (isset($gridBlocks[$cmsGrid->getId()])) {
  47.                 foreach ($gridBlocks[$cmsGrid->getId()] as $gridBlock) {
  48.                     $customFields $gridBlock->getCustomFields();
  49.                     $customFields['flinkCmsGrid'] = $cmsGrid;
  50.                     $gridBlock->setCustomFields($customFields);
  51.                 }
  52.             }
  53.         }
  54.     }
  55.     private function _getGridBlocks($cmsPages)
  56.     {
  57.         $gridBlocks = [];
  58.         foreach ($cmsPages as $cmsPage) {
  59.             if (empty($cmsPage->flinkCmsGridsAdded)) {
  60.                 foreach ($cmsPage->getSections() as $section) {
  61.                     foreach ($section->getBlocks() as $block) {
  62.                         if (strpos($block->getType(), 'flink-cms-grid') === 0) {
  63.                             $cmsGridId str_replace('flink-cms-grid-'''$block->getType());
  64.                             if (!isset($gridBlocks[$cmsGridId])) {
  65.                                 $gridBlocks[$cmsGridId] = [];
  66.                             }
  67.                             $gridBlocks[$cmsGridId][] = $block;
  68.                         }
  69.                     }
  70.                 }
  71.             }
  72.         }
  73.         return $gridBlocks;
  74.     }
  75.     private function _getCmsGrids($gridBlocks$context)
  76.     {
  77.         if (!$gridBlocks) {
  78.             return [];
  79.         }
  80.         $criteria = new Criteria(array_keys($gridBlocks));
  81.         return $this->cmsGridRepository->search($criteria$context);
  82.     }
  83. }