custom/plugins/AcrisProductTabCS/src/Storefront/Subscriber/ProductTabSubscriber.php line 54

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Acris\ProductTab\Storefront\Subscriber;
  3. use Acris\ProductTab\Components\ProductTab\ProductTabGateway;
  4. use Acris\ProductTab\Components\ProductTab\ProductTabService;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  7. use Shopware\Core\Framework\Struct\ArrayEntity;
  8. use Shopware\Storefront\Page\Product\ProductPageCriteriaEvent;
  9. use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\HttpFoundation\RequestStack;
  12. Class ProductTabSubscriber implements EventSubscriberInterface
  13. {
  14.     public const ACRIS_STREAM_IDS_EXTENSION = 'acrisStreamIds';
  15.     public const PRODUCT_TAB_SORT_BY = 'DESC';
  16.     /**
  17.      * @var RequestStack
  18.      */
  19.     private $requestStack;
  20.     /**
  21.      * @var ProductTabGateway
  22.      */
  23.     private $productTabGateway;
  24.     /**
  25.      * @var ProductTabService
  26.      */
  27.     private $productTabService;
  28.     public function __construct(
  29.         RequestStack $requestStack,
  30.         ProductTabGateway $productTabGateway,
  31.         ProductTabService $productTabService
  32.     )
  33.     {
  34.         $this->requestStack = $requestStack;
  35.         $this->productTabGateway = $productTabGateway;
  36.         $this->productTabService = $productTabService;
  37.     }
  38.     public static function getSubscribedEvents(): array
  39.     {
  40.         return [
  41.             ProductPageCriteriaEvent::class => 'onProductPageCriteria',
  42.             ProductPageLoadedEvent::class => 'onProductPageLoaded'
  43.         ];
  44.     }
  45.     public function onProductPageCriteria(ProductPageCriteriaEvent $event): void
  46.     {
  47.         $event->getCriteria()->addAssociation('acrisProductTab')->addAssociation('acrisProductTab.cmsPage')
  48.             ->getAssociation('acrisProductTab')->addSorting(new FieldSorting('priority', self::PRODUCT_TAB_SORT_BY))
  49.             ->addFilter(new EqualsFilter('active', true));
  50.     }
  51.     public function onProductPageLoaded(ProductPageLoadedEvent $event): void
  52.     {
  53.         $request = $this->requestStack->getCurrentRequest();
  54.         if(empty($request) === true) {
  55.             return;
  56.         }
  57.         $product = $event->getPage()->getProduct();
  58.         if (empty($product)) return;
  59.         $productId = $product->getId();
  60.         if ($product->hasExtension(self::ACRIS_STREAM_IDS_EXTENSION) && !empty($product->getExtension(self::ACRIS_STREAM_IDS_EXTENSION))) {
  61.             $productStreamIds = $product->getExtension(self::ACRIS_STREAM_IDS_EXTENSION)->get('ids');
  62.         } else {
  63.             $productStreamIds = $this->productTabGateway->getProductStreamIds([$productId], $event->getSalesChannelContext()->getContext());
  64.             $product->addExtension(self::ACRIS_STREAM_IDS_EXTENSION, new ArrayEntity(['ids' => $productStreamIds]));
  65.         }
  66.         $productTabResult = !empty($product->getParentId()) ? $this->productTabGateway->getProductDetailProductTab($product->getParentId(), $productStreamIds, $event->getSalesChannelContext()) : $this->productTabGateway->getProductDetailProductTab($productId, $productStreamIds, $event->getSalesChannelContext());
  67.         if($productTabResult->count() === 0) {
  68.             if($product->hasExtension('acrisProductTab')){
  69.                 $product->removeExtension('acrisProductTab');
  70.             }
  71.             return;
  72.         }
  73.         $this->productTabService->setCmsPages($productTabResult->getEntities(), $request, $event);
  74.         $product->addExtension('acrisProductTab', $productTabResult->getEntities());
  75.     }
  76. }