custom/plugins/ZweiPunktSameDayDelivery/src/Subscriber/ProductPageLoadedSubscriber.php line 29

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace ZweiPunktSameDayDelivery\Subscriber;
  4. use DateTime;
  5. use DateTimeZone;
  6. use Shopware\Storefront\Page\Product\ProductPageLoadedEvent;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use ZweiPunktSameDayDelivery\Service\ConfigService;
  9. class ProductPageLoadedSubscriber implements EventSubscriberInterface
  10. {
  11.     private ConfigService $configService;
  12.     public function __construct(ConfigService $configService)
  13.     {
  14.         $this->configService $configService;
  15.     }
  16.     public static function getSubscribedEvents(): array
  17.     {
  18.         return [
  19.             ProductPageLoadedEvent::class => 'onProductPageLoaded',
  20.         ];
  21.     }
  22.     public function onProductPageLoaded(ProductPageLoadedEvent $event): void
  23.     {
  24.         $salesChannelId $event->getSalesChannelContext()->getSalesChannel()->getId();
  25.         $this->configService->setSalesChannelId($salesChannelId);
  26.         if (!$this->configService->isActive()) {
  27.             return;
  28.         }
  29.         $vacationStart $this->configService->getVacationStart();
  30.         $vacationEnd $this->configService->getVacationEnd();
  31.         $vacationMessage $this->configService->getVacationMessage();
  32.         // Abfragen, welches Banner Layout gezeigt werden soll
  33.         $viewBanner $this->configService->getBannerLayout();
  34.         $today = new DateTime();
  35.         if ($vacationStart <= $today && $today <= $vacationEnd) {
  36.             // Wenn wir uns im Urlaubszeitraum befinden, geben wir die Urlaubsnachricht
  37.             // an Twig weiter und beenden die Ausführung der Funktion.
  38.             $event->getPage()->assign([
  39.                 'viewBanner' => $viewBanner,
  40.                 'vacationMessage' => $vacationMessage,
  41.             ]);
  42.             return;
  43.         }
  44.         // Überprüfen, ob der aktuelle Tag ein Versandtag ist
  45.         $deliveryDays $this->configService->getDeliveryDays();
  46.         $currentDay strtolower(date('l'));
  47.         if (!in_array(strtolower($currentDay), $deliveryDaystrue)) {
  48.             return;
  49.         }
  50.         // Überprüfen, ob der aktuelle Tag ein Versandausschluss-Feiertag ist
  51.         if ($this->checkExclusionDays($this->configService->getExcludeShippingHolidayDays())) {
  52.             return;
  53.         }
  54.         // Überprüfen, ob der aktuelle Tag ein spezifischer Tag ist, an dem kein Versand erfolgen soll
  55.         if ($this->checkExclusionDays($this->configService->getExcludeShippingVacationDays())) {
  56.             return;
  57.         }
  58.         // Zugriff auf die benutzerdefinierten Felder des Produkts
  59.         $product $event->getPage()->getProduct();
  60.         $customFields $product->getCustomFields();
  61.         // Prüfen, ob das Feld für den Versand am selben Tag deaktiviert ist
  62.         // beim Artikel
  63.         if ($customFields['zweipunkt_samedaydelivery_switch'] ?? false) {
  64.             return;
  65.         }
  66.         // Abfragen, ob nur Artikel mit Lagerbestand angezeigt werden sollen
  67.         $onlyInStock $this->configService->getOnlyInStock();
  68.         // Nur anzeigen, wenn der Aufruf vor der Deadline erfolgt,
  69.         // nach der Deadline wird es bis 00:00 Uhr nicht mehr angezeigt.
  70.         $currentHour = (new DateTime('now', new DateTimeZone('Europe/Berlin')))->format('H:i:s');
  71.         $orderDeadline $this->configService->getOrderDeadline();
  72.         $orderDeadlineHour = (int) explode(':'$orderDeadline)[0];
  73.         if ($currentHour $orderDeadlineHour) {
  74.             return;
  75.         }
  76.         // Hole das Ausgabeformat
  77.         $outputFormat $this->configService->getOutputFormat();
  78.         $event->getPage()->assign([
  79.             'viewBanner' => $viewBanner,
  80.             'outputFormat' => $outputFormat,
  81.             'onlyInStock' => $onlyInStock,
  82.             'currentHour' => $currentHour,
  83.             'orderDeadline' => $orderDeadline,
  84.             'vacationMessage' => '',
  85.         ]);
  86.     }
  87.     private function checkExclusionDays(string $excludeDaysString): bool
  88.     {
  89.         // Teilt die Zeichenkette an jedem Komma auf und speichert die
  90.         // resultierenden Werte in einem Array
  91.         $excludeDays explode(','$excludeDaysString);
  92.         // Erstellt ein DateTime-Objekt für den aktuellen Tag
  93.         $today = new DateTime();
  94.         foreach ($excludeDays as $excludeDay) {
  95.             // Entferne Leerzeichen vom Anfang und
  96.             // Ende des ausgeschlossenen Tags
  97.             $excludeDay trim($excludeDay);
  98.             // Versucht, das Datum aus dem ausgeschlossenen Tag zu erzeugen,
  99.             // wobei verschiedene Datumsformate berücksichtigt werden
  100.             $excludeDate DateTime::createFromFormat('m-d'$excludeDay)
  101.                 ?: DateTime::createFromFormat('n-j'$excludeDay)
  102.                     ?: DateTime::createFromFormat('j.n'$excludeDay)
  103.                         ?: DateTime::createFromFormat('d.m'$excludeDay)
  104.             ;
  105.             // Überprüft, ob das aus dem ausgeschlossenen Tag erzeugte Datum
  106.             // gültig ist und ob es mit dem heutigen Datum übereinstimmt
  107.             if (
  108.                 $excludeDate !== false &&
  109.                 $excludeDate->format('m-d') === $today->format('m-d')
  110.             ) {
  111.                 return true;
  112.             }
  113.         }
  114.         return false;
  115.     }
  116. }