custom/plugins/ThemeOkeOnline/src/Storefront/CmsPage/Subscriber/CmsPageLoadedSubscriber.php line 40

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace ThemeOkeOnline\Storefront\CmsPage\Subscriber;
  3. use Shopware\Core\Content\Cms\Events\CmsPageLoadedEvent;
  4. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ContainsFilter;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  9. use Shopware\Core\Framework\Struct\ArrayEntity;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. class CmsPageLoadedSubscriber implements EventSubscriberInterface
  12. {
  13.     /**
  14.      * @var EntityRepository
  15.      */
  16.     private $categoryRepository;
  17.     /**
  18.      * @var CmsPageLoadedEvent
  19.      */
  20.     private $event;
  21.     private $context;
  22.     public function __construct(EntityRepository $categoryRepository)
  23.     {
  24.         $this->categoryRepository $categoryRepository;
  25.     }
  26.     public static function getSubscribedEvents(): array
  27.     {
  28.         return [
  29.             CmsPageLoadedEvent::class => ['cmsPageLoaded']
  30.         ];
  31.     }
  32.     public function cmsPageLoaded(CmsPageLoadedEvent $event): void
  33.     {
  34.         $this->addCategoryDataToCMSPage($event);
  35.         $this->addSubcategoryDataToCMSPage($event);
  36.     }
  37.     public function addCategoryDataToCMSPage(CmsPageLoadedEvent $event)
  38.     {
  39.         $this->context $event->getSalesChannelContext()->getContext();
  40.         $cmsPage $event->getResult()->first();
  41.         $criteria = new Criteria();
  42.         $criteria->addAssociation('media');
  43.         $criteria->addFilter(
  44.             new EqualsFilter('active'true),
  45.         );
  46.         $categories $this->categoryRepository->search(
  47.             $criteria,
  48.             $this->context
  49.         );
  50.         $cmsPage->addExtension(
  51.             'categories',
  52.             $categories->getEntities()
  53.         );
  54.     }
  55.     public function addSubcategoryDataToCMSPage(CmsPageLoadedEvent $event)
  56.     {
  57.         $this->context $event->getSalesChannelContext()->getContext();
  58.         $cmsPage $event->getResult()->first();
  59.         $listingElements $cmsPage->getElementsOfType('product-listing');
  60.         if(sizeof($listingElements) <= 0) return;
  61.         $listing $listingElements[0]->getData()->getListing();
  62.         $currentCategoryId $listing->getCurrentFilters()['navigationId'];
  63.         $currentCategory $this->getCategory($currentCategoryId);
  64.         $baseCategoryId $this->getBaseCategoryOf($currentCategory);
  65.         $criteria = new Criteria();
  66.         $criteria->addAssociation('media');
  67.         $criteria->addFilter(
  68.             //new EqualsFilter('level', '4'),   //Default was 4, filtering is now done by cms-component.
  69.             new EqualsFilter('active'true),
  70.             new ContainsFilter('path'$baseCategoryId)
  71.         );
  72.         $subcategories $this->categoryRepository->search(
  73.             $criteria,
  74.             $this->context
  75.         );
  76.         $cmsPage->addExtension(
  77.             'subcategories',
  78.             $subcategories->getEntities()
  79.         );
  80.         $cmsPage->addExtension(
  81.             'subcategorymetadata',
  82.             new ArrayEntity([
  83.                 'baseCategory' => $baseCategoryId,
  84.                 'currentCategory' => $currentCategoryId,
  85.                 'currentLevel' => $currentCategory->level
  86.             ])
  87.         );
  88.     }
  89.     private function getBaseCategoryOf($category) {
  90.         if($category->getLevel() <= 2)
  91.             return $category->id;
  92.         return $this->getParentCategoryOf($category);
  93.     }
  94.     private function getParentCategoryOf($input) {
  95.         return preg_split('/\|/'$input->getPath(),-1PREG_SPLIT_NO_EMPTY)[1];
  96.     }
  97.     private function getCategory($categoryId) {
  98.         $criteria = new Criteria();
  99.         $criteria->addFilter(
  100.             new EqualsFilter('id'$categoryId)
  101.         );
  102.         return $this->categoryRepository->search(
  103.             $criteria,
  104.             $this->context
  105.         )->getElements()[$categoryId];
  106.     }
  107. }