custom/plugins/fourtwosixPreOrderProduct/src/Subscriber/ProductDetails.php line 77

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace fourtwosix\PreOrder\Subscriber;
  4. use Shopware\Core\Content\Product\ProductEvents;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
  6. use Shopware\Core\Framework\Api\Context\SalesChannelApiSource;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Shopware\Core\System\SystemConfig\SystemConfigService;
  9. use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoadedEvent;
  10. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  11. use Shopware\Core\Framework\Struct\ArrayEntity;
  12. use Shopware\Storefront\Page\PageLoadedEvent;
  13. class ProductDetails implements EventSubscriberInterface
  14. {
  15.     /**
  16.      * @var SystemConfigService
  17.      */
  18.     private $systemConfigService;
  19.     private const DATETIME_FORMAT 'Y-m-d H:i:s';
  20.     public function __construct(SystemConfigService $systemConfigService)
  21.     {
  22.         $this->systemConfigService $systemConfigService;
  23.     }
  24.     public static function getSubscribedEvents(): array
  25.     {
  26.         return [
  27.             ProductEvents::PRODUCT_LOADED_EVENT => 'onProductDetails',
  28.             CheckoutCartPageLoadedEvent::class => 'onCartPage',
  29.             CheckoutConfirmPageLoadedEvent::class => 'onConfirmPage'
  30.         ];
  31.     }
  32.     public function onProductDetails(EntityLoadedEvent $event)
  33.     {
  34.         $salesChannelId null;
  35.         if ($event->getContext()->getSource() instanceof SalesChannelApiSource) {
  36.             $salesChannelId $event->getContext()->getSource()->getSalesChannelId();
  37.         }
  38.         $buttonColor $this->systemConfigService->get(
  39.             'fourtwosixPreOrderProduct.config.preOrderButtonColor',
  40.             $salesChannelId
  41.         );
  42.         if ($buttonColor == null) {
  43.             $buttonColor '';
  44.         }
  45.         $matches = array();
  46.         preg_match('/#([a-f0-9]{3}){1,2}\b/i'$buttonColor$matches);
  47.         if (empty($matches)) {
  48.             return;
  49.         }
  50.         $buttonColor $matches[0];
  51.         $entities $event->getEntities();
  52.         foreach ($entities as $entity) {
  53.             $extensions = new ArrayEntity();
  54.             $extensions['preorder_button_color'] = $buttonColor;
  55.             $entity->addExtension("productDetailStruct"$extensions);
  56.         }
  57.     }
  58.     public function onCartPage(CheckoutCartPageLoadedEvent $event)
  59.     {
  60.         $this->addReleaseDateToLineItems($event);
  61.     }
  62.     public function onConfirmPage(CheckoutConfirmPageLoadedEvent $event)
  63.     {
  64.         $this->addReleaseDateToLineItems($event);
  65.     }
  66.     private function addReleaseDateToLineItems(PageLoadedEvent $event): void
  67.     {
  68.         /* add to lineItems extensions the release date indicator */
  69.         $cartReleaseDates = [];
  70.         $maxDeliveryDate = [];
  71.         $lineItems $event->getPage()->getCart()->getLineItems();
  72.         foreach ($lineItems as $lineItem) {
  73.             foreach ($event->getPage()->getCart()->getData() as $originalProduct) {
  74.                 if (
  75.                     is_array($originalProduct) ||
  76.                     !is_object($originalProduct) ||
  77.                     get_class($originalProduct) != 'Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity' ||
  78.                     $lineItem->getId() != $originalProduct->getId()
  79.                 ) {
  80.                     continue;
  81.                 }
  82.                 if (
  83.                     !isset($originalProduct->getCustomFields()["preorder_enabled"]) ||
  84.                     !$originalProduct->getCustomFields()["preorder_enabled"] ||
  85.                     !$originalProduct->getReleaseDate()
  86.                 ) {
  87.                     break;
  88.                 }
  89.                 $cartReleaseDates[$lineItem->getId()] = $originalProduct->getReleaseDate()->format(self::DATETIME_FORMAT);
  90.                 if (!$lineItem->getDeliveryInformation()->getDeliveryTime()) {
  91.                     $maxDeliveryDate[$lineItem->getId()] = $originalProduct->getReleaseDate()->format(self::DATETIME_FORMAT);
  92.                     break;
  93.                 }
  94.                 $maxDeliveryDate[$lineItem->getId()] = $this->addDate(
  95.                     $originalProduct->getReleaseDate()->format(self::DATETIME_FORMAT),
  96.                     $lineItem->getDeliveryInformation()->getDeliveryTime()->getUnit(),
  97.                     $lineItem->getDeliveryInformation()->getDeliveryTime()->getMax()
  98.                 );
  99.                 break;
  100.             }
  101.         }
  102.         $extensions $event->getPage()->getExtensions();
  103.         $extensions["fourtwosixPreorderCartReleaseDates"] = $cartReleaseDates;
  104.         $extensions["fourtwosixPreorderCartDeliveryMax"] = $maxDeliveryDate;
  105.         $event->getPage()->setExtensions($extensions);
  106.     }
  107.     public function addDate(string $datestring $unitint $max)
  108.     {
  109.         $date strtotime($date);
  110.         switch ($unit) {
  111.             case 'hour':
  112.                 return date(self::DATETIME_FORMATstrtotime("+{$max} hour"$date));
  113.             case 'day':
  114.                 return date(self::DATETIME_FORMATstrtotime("+{$max} day"$date));
  115.             case 'week':
  116.                 return date(self::DATETIME_FORMATstrtotime("+{$max} week"$date));
  117.             case 'month':
  118.                 return date(self::DATETIME_FORMATstrtotime("+{$max} month"$date));
  119.             case 'year':
  120.                 return date(self::DATETIME_FORMATstrtotime("+{$max} year"$date));
  121.             default:
  122.                 return $date;
  123.         }
  124.     }
  125. }