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

Open in your IDE?
  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\Tree\TreeItem;
  6. use Shopware\Core\Content\Cms\Events\CmsPageLoadedEvent;
  7. use Shopware\Core\Content\Cms\Exception\PageNotFoundException;
  8. use Shopware\Core\Content\Cms\SalesChannel\SalesChannelCmsPageLoaderInterface;
  9. use Shopware\Core\Content\Product\ProductEntity;
  10. use Shopware\Core\Content\Product\ProductEvents;
  11. use Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity;
  12. use Shopware\Core\Content\Product\Subscriber\ProductLoadedSubscriber;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  15. use Shopware\Core\System\SystemConfig\SystemConfigService;
  16. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  17. use Shopware\Storefront\Page\Navigation\NavigationPageLoadedEvent;
  18. use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
  19. use Shopware\Storefront\Pagelet\Footer\FooterPageletLoadedEvent;
  20. use Shopware\Storefront\Pagelet\Header\HeaderPageletLoadedEvent;
  21. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  22. use Symfony\Component\DependencyInjection\ContainerInterface;
  23. class FrontendSubscriber implements EventSubscriberInterface
  24. {
  25.     private $container;
  26.     private $cmsPageLoader;
  27.     private $config;
  28.     public function __construct(ContainerInterface $container,
  29.                                 SalesChannelCmsPageLoaderInterface $cmsPageLoader,
  30.                                 SystemConfigService $config)
  31.     {
  32.         $this->container $container;
  33.         $this->cmsPageLoader $cmsPageLoader;
  34.         $this->config $config;
  35.     }
  36.     public static function getSubscribedEvents(): array
  37.     {
  38.         return [
  39.             HeaderPageletLoadedEvent::class       => 'loadCmsHeader',
  40.             FooterPageletLoadedEvent::class       => 'loadCmsFooter',
  41.             CheckoutFinishPageLoadedEvent::class  => 'loadFinishPage',
  42.             ProductEvents::PRODUCT_LOADED_EVENT   => 'onProductLoaded',
  43.             CategoryEvents::CATEGORY_LOADED_EVENT => 'onCategoryLoaded',
  44.         ];
  45.     }
  46.     public function onCategoryLoaded(EntityLoadedEvent $event)
  47.     {
  48.         if($event->getContext()->getScope() != 'user') {
  49.             return;
  50.         }
  51.         if ( ! property_exists($event->getContext()->getSource(), 'salesChannelId')) {
  52.             return;
  53.         }
  54.         $config $this->config->get('NetzpPowerPack6.config'$event->getContext()->getSource()->getSalesChannelId());
  55.         if (!$config['snippetsproduct']) {
  56.             return;
  57.         }
  58.         $twig = clone $this->container->get('twig');
  59.         foreach($event->getEntities() as $entity) {
  60.             if(get_class($entity) !== CategoryEntity::class) {
  61.                 continue;
  62.             }
  63.             $translated $entity->getTranslated();
  64.             $tplDescription $twig->createTemplate($translated['description'] ?? '');
  65.             $description $tplDescription->render();
  66.             $translated['description'] = $description;
  67.             $entity->setDescription($description);
  68.             // Name führt hier zu Problemen, u.a. <title> wird nicht ersetzt
  69.             /*
  70.             $tplName = $twig->createTemplate($translated['name'] ?? '');
  71.             $translated['name'] = $tplName->render();
  72.             $breadcrumbs = $translated['breadcrumb'];
  73.             foreach($breadcrumbs as &$bc) {
  74.                 $tplBreadcrumb = $twig->createTemplate($bc ?? '');
  75.                 $bc = $tplBreadcrumb->render();
  76.             }
  77.             $translated['breadcrumb'] = $breadcrumbs;
  78.             */
  79.             $entity->assign(['translated' => $translated]);
  80.         }
  81.     }
  82.     public function onProductLoaded(EntityLoadedEvent $event)
  83.     {
  84.         if($event->getContext()->getScope() != 'user') {
  85.             return;
  86.         }
  87.         if ( ! property_exists($event->getContext()->getSource(), 'salesChannelId')) {
  88.             return;
  89.         }
  90.         $config $this->config->get('NetzpPowerPack6.config'$event->getContext()->getSource()->getSalesChannelId());
  91.         if( ! $config['snippetsproduct']) {
  92.             return;
  93.         }
  94.         $twig = clone $this->container->get('twig');
  95.         foreach($event->getEntities() as $entity) {
  96.             if(get_class($entity) !== SalesChannelProductEntity::class &&
  97.                 get_class($entity) !== ProductEntity::class) {
  98.                 continue;
  99.             }
  100.             $translated $entity->getTranslated();
  101.             $tplName $twig->createTemplate($translated['name'] ?? '');
  102.             $translated['name'] = $tplName->render();
  103.             $tplDescription $twig->createTemplate($translated['description'] ?? '');
  104.             $translated['description'] = $tplDescription->render();
  105.             $entity->assign(['translated' => $translated]);
  106.         }
  107.     }
  108.     public function loadCmsheader(HeaderPageletLoadedEvent $event): void
  109.     {
  110.         $request $event->getRequest();
  111.         $context $event->getSalesChannelContext();
  112.         $customFields $context->getSalesChannel()->getCustomFields();
  113.         if($customFields && array_key_exists('netzp_powerpack6_header_cms_show'$customFields) &&
  114.                             array_key_exists('netzp_powerpack6_header_cms_id'$customFields) &&
  115.                             $customFields['netzp_powerpack6_header_cms_id'] != null) {
  116.             $id strtolower(trim($customFields['netzp_powerpack6_header_cms_id']));
  117.             if ($id != '') {
  118.                 $criteria = new Criteria([$id]);
  119.                 $pages $this->cmsPageLoader->load($request$criteria$context);
  120.                 if (!$pages->has($id)) {
  121.                     throw new PageNotFoundException($id);
  122.                 }
  123.             }
  124.             $event->getPagelet()->assign([
  125.                 'netzp_header_cms_page'     => $pages->get($id),
  126.                 'netzp_header_cms_position' => $customFields['netzp_powerpack6_header_cms_show'] ?? 0,
  127.                 'netzp_header_cms_sticky'   => $customFields['netzp_powerpack6_header_cms_sticky'] ?? false
  128.             ]);
  129.         }
  130.     }
  131.     public function loadCmsFooter(FooterPageletLoadedEvent $event): void
  132.     {
  133.         $request $event->getRequest();
  134.         $context $event->getSalesChannelContext();
  135.         $customFields $context->getSalesChannel()->getCustomFields();
  136.         if($customFields && array_key_exists('netzp_powerpack6_footer_cms_show'$customFields)
  137.                          && array_key_exists('netzp_powerpack6_footer_cms_id'$customFields)
  138.                          && $customFields['netzp_powerpack6_footer_cms_id'] != null) {
  139.             $id strtolower(trim($customFields['netzp_powerpack6_footer_cms_id']));
  140.             $position $customFields['netzp_powerpack6_footer_cms_show'];
  141.             if ($id != '') {
  142.                 $criteria = new Criteria([$id]);
  143.                 $pages $this->cmsPageLoader->load($request$criteria$context);
  144.                 if (!$pages->has($id)) {
  145.                     throw new PageNotFoundException($id);
  146.                 }
  147.             }
  148.             $event->getPagelet()->assign([
  149.                 'netzp_footer_cms_page'     => $pages->get($id),
  150.                 'netzp_footer_cms_position' => $position
  151.             ]);
  152.         }
  153.     }
  154.     public function loadFinishPage(CheckoutFinishPageLoadedEvent $event): void
  155.     {
  156.         $request $event->getRequest();
  157.         $context $event->getSalesChannelContext();
  158.         $customFields $context->getSalesChannel()->getCustomFields();
  159.         if($customFields && array_key_exists('netzp_powerpack6_finish_cms_show'$customFields)
  160.             && array_key_exists('netzp_powerpack6_finish_cms_id'$customFields)
  161.             && $customFields['netzp_powerpack6_finish_cms_id'] != null) {
  162.             $id strtolower(trim($customFields['netzp_powerpack6_finish_cms_id']));
  163.             $position $customFields['netzp_powerpack6_finish_cms_show'];
  164.             if ($id != '') {
  165.                 $criteria = new Criteria([$id]);
  166.                 $pages $this->cmsPageLoader->load($request$criteria$context);
  167.                 if (!$pages->has($id)) {
  168.                     throw new PageNotFoundException($id);
  169.                 }
  170.             }
  171.             $event->getPage()->assign([
  172.                 'netzp_finish_cms_page'     => $pages->get($id),
  173.                 'netzp_finish_cms_position' => $position
  174.             ]);
  175.         }
  176.     }
  177. }