custom/plugins/NetzpPowerPack6/src/Subscriber/FrontendSubscriber.php line 161

  1. <?php declare(strict_types=1);
  2. namespace NetzpPowerPack6\Subscriber;
  3. use Shopware\Core\Content\Category\CategoryEntity;
  4. use Shopware\Core\Content\Category\CategoryEvents;
  5. use Shopware\Core\Content\Category\Event\CategoryRouteCacheKeyEvent;
  6. use Shopware\Core\Content\Cms\Exception\PageNotFoundException;
  7. use Shopware\Core\Content\Cms\SalesChannel\SalesChannelCmsPageLoaderInterface;
  8. use Shopware\Core\Content\Product\ProductEntity;
  9. use Shopware\Core\Content\Product\ProductEvents;
  10. use Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  13. use Shopware\Core\System\SystemConfig\SystemConfigService;
  14. use Shopware\Storefront\Event\ThemeCompilerConcatenatedStylesEvent;
  15. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  16. use Shopware\Storefront\Pagelet\Footer\FooterPageletLoadedEvent;
  17. use Shopware\Storefront\Pagelet\Header\HeaderPageletLoadedEvent;
  18. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  19. use Symfony\Component\DependencyInjection\ContainerInterface;
  20. class FrontendSubscriber implements EventSubscriberInterface
  21. {
  22.     public function __construct(private readonly ContainerInterface $container,
  23.                                 private readonly SalesChannelCmsPageLoaderInterface $cmsPageLoader,
  24.                                 private readonly SystemConfigService $config)
  25.     {
  26.     }
  27.     public static function getSubscribedEvents(): array
  28.     {
  29.         return [
  30.             HeaderPageletLoadedEvent::class             => 'loadCmsHeader',
  31.             FooterPageletLoadedEvent::class             => 'loadCmsFooter',
  32.             CheckoutFinishPageLoadedEvent::class        => 'loadFinishPage',
  33.             ProductEvents::PRODUCT_LOADED_EVENT         => 'onProductLoaded',
  34.             CategoryEvents::CATEGORY_LOADED_EVENT       => 'onCategoryLoaded',
  35.             CategoryRouteCacheKeyEvent::class           => 'onCategoryRouteCacheKey',
  36.             ThemeCompilerConcatenatedStylesEvent::class => 'onThemeCompiler'
  37.         ];
  38.     }
  39.     public function onCategoryRouteCacheKey(CategoryRouteCacheKeyEvent $event): void
  40.     {
  41.         // In 6.4 all active rules were used for the cache key,
  42.         // with 6.5 only rule ids matching to the "requested entity" will be used for caching
  43.         // so disable caching when custom rule ids are set in sections and/or blocks
  44.         $repo $this->container->get('category.repository');
  45.         $criteria = (new Criteria([$event->getNavigationId()]));
  46.         $criteria->addAssociation('cmsPage.sections.blocks.slots.config');
  47.         $category $repo->search($criteria$event->getContext()->getContext())->getEntities()->first();
  48.         if( ! $category) {
  49.             return;
  50.         }
  51.         $page $category->getCmsPage();
  52.         if ( ! $page) {
  53.             return;
  54.         }
  55.         foreach($page->getSections()->getElements() as $element)
  56.         {
  57.             $customFields $element->getCustomFields()['netzp_pp'] ?? '';
  58.             $ruleId $customFields['ruleId'] ?? null;
  59.             if($ruleId) {
  60.                 $event->disableCaching();
  61.                 return;
  62.             }
  63.         }
  64.         foreach($page->getSections()->getBlocks()->getElements() as $element)
  65.         {
  66.             $customFields $element->getCustomFields()['netzp_pp'] ?? '';
  67.             $ruleId $customFields['ruleId'] ?? null;
  68.             if($ruleId) {
  69.                 $event->disableCaching();
  70.                 return;
  71.             }
  72.         }
  73.     }
  74.     public function onThemeCompiler(ThemeCompilerConcatenatedStylesEvent $event)
  75.     {
  76.         $config $this->config->get('NetzpPowerPack6.config'$event->getSalesChannelId());
  77.         if (array_key_exists('excludefontawesome'$config) && $config['excludefontawesome']) {
  78.             return;
  79.         }
  80.         $bundle $this->container->get('kernel')->getBundles()['NetzpPowerPack6'] ?? null;
  81.         if($bundle === null) {
  82.             return;
  83.         }
  84.         $projectDir $bundle->getPath() ?? null;
  85.         if($projectDir === null) {
  86.             return;
  87.         }
  88.         $styles $event->getConcatenatedStyles();
  89.         $includeFile $projectDir "/Resources/app/storefront/src/csslibs/fontawesome/fontawesome";
  90.         $styles .= "@import '" $includeFile "';" PHP_EOL;
  91.         $event->setConcatenatedStyles($styles);
  92.     }
  93.     public function onCategoryLoaded(EntityLoadedEvent $event)
  94.     {
  95.         if($event->getContext()->getScope() != 'user') {
  96.             return;
  97.         }
  98.         if ( ! property_exists($event->getContext()->getSource(), 'salesChannelId')) {
  99.             return;
  100.         }
  101.         $config $this->config->get('NetzpPowerPack6.config'$event->getContext()
  102.                                ->getSource()
  103.                                ->getSalesChannelId());
  104.         if ( ! $config['snippetsproduct']) {
  105.             return;
  106.         }
  107.         $twig = clone $this->container->get('twig');
  108.         foreach($event->getEntities() as $entity) {
  109.             if($entity::class !== CategoryEntity::class) {
  110.                 continue;
  111.             }
  112.             $translated $entity->getTranslated();
  113.             $tplDescription $twig->createTemplate($translated['description'] ?? '');
  114.             $description $tplDescription->render();
  115.             $translated['description'] = $description;
  116.             $entity->setDescription($description);
  117.             // Name führt hier zu Problemen, u.a. <title> wird nicht ersetzt
  118.             /*
  119.             $tplName = $twig->createTemplate($translated['name'] ?? '');
  120.             $translated['name'] = $tplName->render();
  121.             $breadcrumbs = $translated['breadcrumb'];
  122.             foreach($breadcrumbs as &$bc) {
  123.                 $tplBreadcrumb = $twig->createTemplate($bc ?? '');
  124.                 $bc = $tplBreadcrumb->render();
  125.             }
  126.             $translated['breadcrumb'] = $breadcrumbs;
  127.             */
  128.             $entity->assign(['translated' => $translated]);
  129.         }
  130.     }
  131.     public function onProductLoaded(EntityLoadedEvent $event)
  132.     {
  133.         if($event->getContext()->getScope() != 'user') {
  134.             return;
  135.         }
  136.         if (property_exists($event->getContext()->getSource(), 'salesChannelId')) {
  137.             $config $this->config->get('NetzpPowerPack6.config'$event->getContext()->getSource()->getSalesChannelId());
  138.         }
  139.         else {
  140.             $config $this->config->get('NetzpPowerPack6.config');
  141.         }
  142.         if( ! $config['snippetsproduct']) {
  143.             return;
  144.         }
  145.         $twig = clone $this->container->get('twig');
  146.         foreach($event->getEntities() as $entity) {
  147.             if($entity::class !== SalesChannelProductEntity::class &&
  148.                 $entity::class !== ProductEntity::class) {
  149.                 continue;
  150.             }
  151.             $translated $entity->getTranslated();
  152.             $tplName $twig->createTemplate($translated['name'] ?? '');
  153.             $translated['name'] = $tplName->render();
  154.             $tplDescription $twig->createTemplate($translated['description'] ?? '');
  155.             $translated['description'] = $tplDescription->render();
  156.             $entity->assign(['translated' => $translated]);
  157.         }
  158.     }
  159.     public function loadCmsheader(HeaderPageletLoadedEvent $event): void
  160.     {
  161.         $pages null;
  162.         $request $event->getRequest();
  163.         $context $event->getSalesChannelContext();
  164.         $customFields $context->getSalesChannel()->getTranslated()['customFields'];
  165.         if($customFields && array_key_exists('netzp_powerpack6_header_cms_show'$customFields) &&
  166.                             array_key_exists('netzp_powerpack6_header_cms_id'$customFields) &&
  167.                             $customFields['netzp_powerpack6_header_cms_id'] != null) {
  168.             $id strtolower(trim((string) $customFields['netzp_powerpack6_header_cms_id']));
  169.             if ($id != '') {
  170.                 $criteria = new Criteria([$id]);
  171.                 $pages $this->cmsPageLoader->load($request$criteria$context);
  172.                 if (!$pages->has($id)) {
  173.                     return;
  174.                 }
  175.             }
  176.             $event->getPagelet()->assign([
  177.                 'netzp_header_cms_page'     => $pages->get($id),
  178.                 'netzp_header_cms_position' => $customFields['netzp_powerpack6_header_cms_show'] ?? 0,
  179.                 'netzp_header_cms_sticky'   => $customFields['netzp_powerpack6_header_cms_sticky'] ?? false
  180.             ]);
  181.         }
  182.     }
  183.     public function loadCmsFooter(FooterPageletLoadedEvent $event): void
  184.     {
  185.         $pages null;
  186.         $request $event->getRequest();
  187.         $context $event->getSalesChannelContext();
  188.         $customFields $context->getSalesChannel()->getTranslated()['customFields'];
  189.         if($customFields && array_key_exists('netzp_powerpack6_footer_cms_show'$customFields)
  190.                          && array_key_exists('netzp_powerpack6_footer_cms_id'$customFields)
  191.                          && $customFields['netzp_powerpack6_footer_cms_id'] != null) {
  192.             $id strtolower(trim((string) $customFields['netzp_powerpack6_footer_cms_id']));
  193.             $position $customFields['netzp_powerpack6_footer_cms_show'];
  194.             if ($id != '') {
  195.                 $criteria = new Criteria([$id]);
  196.                 $pages $this->cmsPageLoader->load($request$criteria$context);
  197.                 if (!$pages->has($id)) {
  198.                     return;
  199.                 }
  200.             }
  201.             $event->getPagelet()->assign([
  202.                 'netzp_footer_cms_page'     => $pages->get($id),
  203.                 'netzp_footer_cms_position' => $position
  204.             ]);
  205.         }
  206.     }
  207.     public function loadFinishPage(CheckoutFinishPageLoadedEvent $event): void
  208.     {
  209.         $pages null;
  210.         $request $event->getRequest();
  211.         $context $event->getSalesChannelContext();
  212.         $customFields $context->getSalesChannel()->getTranslated()['customFields'];
  213.         if($customFields && array_key_exists('netzp_powerpack6_finish_cms_show'$customFields)
  214.             && array_key_exists('netzp_powerpack6_finish_cms_id'$customFields)
  215.             && $customFields['netzp_powerpack6_finish_cms_id'] != null) {
  216.             $id strtolower(trim((string) $customFields['netzp_powerpack6_finish_cms_id']));
  217.             $position $customFields['netzp_powerpack6_finish_cms_show'];
  218.             if ($id != '') {
  219.                 $criteria = new Criteria([$id]);
  220.                 $pages $this->cmsPageLoader->load($request$criteria$context);
  221.                 if (!$pages->has($id)) {
  222.                     return;
  223.                 }
  224.             }
  225.             $event->getPage()->assign([
  226.                 'netzp_finish_cms_page'     => $pages->get($id),
  227.                 'netzp_finish_cms_position' => $position
  228.             ]);
  229.         }
  230.     }
  231. }