custom/plugins/EsmConfigurator/src/Storefront/Subscriber/ProductSubscriber.php line 51

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace EsmConfigurator\Storefront\Subscriber;
  3. use EsmConfigurator\Core\Content\ConfigurationGroup\ConfigurationGroupCollection;
  4. use EsmConfigurator\Core\Content\ConfigurationGroup\ConfigurationGroupEntity;
  5. use EsmConfigurator\Core\Content\ConfigurationItem\ConfigurationItemEntity;
  6. use EsmConfigurator\Core\Content\ResultText\ResultTextEntity;
  7. use Shopware\Core\Checkout\Cart\SalesChannel\CartService;
  8. use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemEntity;
  9. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  14. use Shopware\Core\Framework\Struct\ArrayStruct;
  15. use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
  16. use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
  17. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  18. use function array_key_exists;
  19. class ProductSubscriber implements EventSubscriberInterface
  20. {
  21.     private EntityRepository $configurationGroupRepository;
  22.     private SalesChannelRepositoryInterface $salesChannelProductRepository;
  23.     private EntityRepository $resultTextRepository;
  24.     private CartService $cartService;
  25.     public function __construct(
  26.         EntityRepository $configurationGroupRepository,
  27.         SalesChannelRepositoryInterface $salesChannelProductRepository,
  28.         EntityRepository $resultTextRepository,
  29.         CartService $cartService
  30.     )
  31.     {
  32.         $this->configurationGroupRepository $configurationGroupRepository;
  33.         $this->salesChannelProductRepository $salesChannelProductRepository;
  34.         $this->resultTextRepository $resultTextRepository;
  35.         $this->cartService $cartService;
  36.     }
  37.     public static function getSubscribedEvents(): array
  38.     {
  39.         return [
  40.             ProductPageLoadedEvent::class => [
  41.                 ['onProductLoaded'50]
  42.             ]
  43.         ];
  44.     }
  45.     public function onProductLoaded(ProductPageLoadedEvent $event): void
  46.     {
  47.         $product $event->getPage()->getProduct();
  48.         if(empty($product->getId())) {
  49.             return;
  50.         }
  51.         $criteria = new Criteria();
  52.         $criteria->addFilter(new EqualsFilter('articleNumber'$product->getProductNumber()));
  53.         $criteria->addSorting(new FieldSorting('sorting'));
  54.         $criteria->addAssociation('configurationItems');
  55.         $criteria->addAssociation('configurationItems.product');
  56.         $criteria->addAssociation('product');
  57.         /** @var ConfigurationGroupCollection $configurationGroups */
  58.         $configurationGroups $this->configurationGroupRepository->search($criteria$event->getContext())->getEntities();
  59.         /** @var ConfigurationGroupEntity $configurationGroup */
  60.         foreach($configurationGroups as $groupKey => $configurationGroup) {
  61.             $configurationItems $configurationGroup->getConfigurationItems();
  62.             if(!$configurationItems) {
  63.                 $configurationGroups->remove($groupKey);
  64.                 continue;
  65.             }
  66.             /** @var ConfigurationItemEntity $configurationItem */
  67.             foreach($configurationItems as $itemKey => $configurationItem) {
  68.                 $criteria = new Criteria();
  69.                 $criteria->addFilter(new EqualsFilter('productNumber'$configurationItem->getArticleNumber()));
  70.                 $criteria->addFilter(new EqualsFilter('active'1));
  71.                 $criteria->addFilter(new RangeFilter('availableStock', [RangeFilter::GT => 0]));
  72.                 $criteria->addExtension('enableUpgrades', new ArrayStruct());
  73.                 $product $this->salesChannelProductRepository->search($criteria$event->getSalesChannelContext())->first();
  74.                 if(!$product) {
  75.                     $configurationItems->remove($itemKey);
  76.                 }
  77.                 $configurationItem->setProduct($product);
  78.             }
  79.             $configurationGroup->setConfigurationItems($configurationItems);
  80.             if($configurationItems->count() <= ){
  81.                 $configurationGroups->remove($groupKey);
  82.             }
  83.         }
  84.         if($configurationGroups->count() === 0) {
  85.             return;
  86.         }
  87.         $cart $this->cartService->getCart($event->getSalesChannelContext()->getToken(), $event->getSalesChannelContext());
  88.         foreach($cart->getLineItems() as $lineItem) {
  89.             if(!$lineItem->hasChildren()) {
  90.                 continue;
  91.             }
  92.             /** @var OrderLineItemEntity $child */
  93.             foreach($lineItem->getChildren() as $child) {
  94.                 if(array_key_exists('configurationGroupId'$child->getPayload())) {
  95.                     $configurationGroup $configurationGroups->get($child->getPayload()['configurationGroupId']);
  96.                     if($configurationGroup) {
  97.                         $configurationGroup->setActiveItem($child->getPayload()['configurationItemId']);
  98.                     }
  99.                 }
  100.             }
  101.         }
  102.         // Set default value to property if exists with same name
  103.         foreach($configurationGroups as $configurationGroup) {
  104.             $title $configurationGroup->getTitle();
  105.             $properties $event->getPage()->getProduct()->getProperties();
  106.             foreach ($properties as $property) {
  107.                 if($property->getGroup() && $property->getGroup()->getName() === $title) {
  108.                     $configurationGroup->setDefaultValue($property->getName());
  109.                 }
  110.             }
  111.         }
  112.         $event->getPage()->addExtension('configurationGroups'$configurationGroups);
  113.         $scores = [];
  114.         $resultTexts $this->resultTextRepository->search(new Criteria(), $event->getContext())->getEntities();
  115.         /** @var ResultTextEntity $resultText */
  116.         foreach($resultTexts as $resultText) {
  117.             $scores[$resultText->getScore()] = $resultText->getChartTitle();
  118.         }
  119.         $event->getPage()->addExtension('scores', new ArrayStruct($scores));
  120.     }
  121. }