custom/plugins/RhiemRentalProducts/src/Subscriber/Product.php line 58

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Rhiem\RhiemRentalProducts\Subscriber;
  4. use Doctrine\DBAL\Connection;
  5. use Rhiem\RhiemRentalProducts\Components\RentalProduct\RentalProductPriceCalculator;
  6. use Rhiem\RhiemRentalProducts\Entities\RentalProduct\RentalProductEntity;
  7. use Shopware\Core\Content\Product\ProductEvents;
  8. use Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntitySearchResultLoadedEvent;
  10. use Shopware\Core\Framework\Struct\ArrayStruct;
  11. use Shopware\Core\PlatformRequest;
  12. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\HttpFoundation\RequestStack;
  15. class Product implements EventSubscriberInterface
  16. {
  17.     /**
  18.      * @var RentalProductPriceCalculator
  19.      */
  20.     private $rentalProductPriceCalculator;
  21.     /**
  22.      * @var Connection
  23.      */
  24.     private $connection;
  25.     /**
  26.      * @var RequestStack
  27.      */
  28.     private $requestStack;
  29.     public function __construct(
  30.         RentalProductPriceCalculator $rentalProductPriceCalculator,
  31.         Connection $connection,
  32.         RequestStack $requestStack
  33.     ) {
  34.         $this->rentalProductPriceCalculator $rentalProductPriceCalculator;
  35.         $this->connection $connection;
  36.         $this->requestStack $requestStack;
  37.     }
  38.     /**
  39.      * @return array|string[]
  40.      */
  41.     public static function getSubscribedEvents()
  42.     {
  43.         return [
  44.             ProductEvents::PRODUCT_SEARCH_RESULT_LOADED_EVENT => 'onProductsLoaded',
  45.         ];
  46.     }
  47.     public function onProductsLoaded(EntitySearchResultLoadedEvent $event): void
  48.     {
  49.         $request $this->requestStack->getMasterRequest();
  50.         if (is_null($request)) {
  51.             return;
  52.         }
  53.         $salesChannelContext $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_CONTEXT_OBJECT);
  54.         if (!$salesChannelContext instanceof SalesChannelContext) {
  55.             return;
  56.         }
  57.         $products $event->getResult()->getEntities();
  58.         $parentIds = [];
  59.         foreach ($products as $product) {
  60.             $rentalProduct $product->getExtension('rentalProduct');
  61.             if (!empty($rentalProduct) && !empty($rentalProduct->getParentId())) {
  62.                 $parentIds[] = $rentalProduct->getParentId();
  63.             }
  64.         }
  65.         if (!empty($parentIds)) {
  66.             $sql 'SELECT LOWER(HEX(t1.parent_id)) as parent_id,MAX(IFNULL(t1.active,t2.active)) as hasRentalVariant FROM rental_product t1
  67.                     LEFT JOIN rental_product t2 ON t1.parent_id=t2.id
  68.                     WHERE HEX(t1.parent_id) IN(?)
  69.                     GROUP BY t1.parent_id';
  70.             $result $this->connection->fetchAll(
  71.                 $sql,
  72.                 [$parentIds],
  73.                 [Connection::PARAM_STR_ARRAY]
  74.             );
  75.             $hasRentalVariant = [];
  76.             foreach ($result as $row) {
  77.                 $hasRentalVariant[$row['parent_id']] = $row['hasRentalVariant'];
  78.             }
  79.         }
  80.         foreach ($products as $product) {
  81.             /**
  82.              * @var RentalProductEntity $rentalProduct
  83.              */
  84.             $rentalProduct $product->getExtension('rentalProduct');
  85.             if (empty($rentalProduct)) {
  86.                 continue;
  87.             }
  88.             if ($rentalProduct->isActive() || !empty($hasRentalVariant[$rentalProduct->getParentId()])) {
  89.                 /*
  90.                  * @var SalesChannelProductEntity $product
  91.                  */
  92.                 $rentalProduct->addExtension('isRentalProduct', new ArrayStruct(['isRentalProduct' => true]));
  93.                 if ($rentalProduct->isActive()) {
  94.                     $prices $rentalProduct->getPrices();
  95.                     if ($prices->count()) {
  96.                         $priceMode $prices->first()->getMode();
  97.                         $rentalProduct->addExtension('rentalPriceMode', new ArrayStruct([$priceMode]));
  98.                     }
  99.                 }
  100.                 $this->rentalProductPriceCalculator->calculateRentalProductPrices(
  101.                     $salesChannelContext,
  102.                     $product
  103.                 );
  104.             }
  105.         }
  106.     }
  107. }