custom/plugins/theme/src/Subscriber/AccountOrderSubscriber.php line 30

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace DonCarneTheme\Subscriber;
  3. use Doctrine\DBAL\Connection;
  4. use Psr\Log\LoggerInterface;
  5. use Shopware\Storefront\Page\Account\Order\AccountEditOrderPageLoadedEvent;
  6. use Shopware\Storefront\Page\Account\Order\AccountOrderPageLoadedEvent;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. class AccountOrderSubscriber implements EventSubscriberInterface
  9. {
  10.     private Connection $connection;
  11.     private LoggerInterface $logger;
  12.     public function __construct(Connection $connectionLoggerInterface $logger)
  13.     {
  14.         $this->connection $connection;
  15.         $this->logger $logger;
  16.     }
  17.     public static function getSubscribedEvents(): array
  18.     {
  19.         return [
  20.             AccountEditOrderPageLoadedEvent::class => 'onAccountOrderPageLoaded',
  21.             AccountOrderPageLoadedEvent::class => 'onAccountOrderPageLoaded'
  22.         ];
  23.     }
  24.     public function onAccountOrderPageLoaded($event): void
  25.     {
  26.         $this->logger->info('AccountOrderSubscriber called for event: ' get_class($event));
  27.         // For AccountEditOrderPageLoadedEvent, process single order
  28.         if ($event instanceof AccountEditOrderPageLoadedEvent) {
  29.             $this->logger->info('Processing AccountEditOrderPageLoadedEvent');
  30.             try {
  31.                 $order $event->getPage()->getOrder();
  32.                 $this->logger->info('Got order: ' . ($order $order->getOrderNumber() : 'null'));
  33.                 if ($order) {
  34.                     $this->processOrder($order$event);
  35.                 } else {
  36.                     $this->logger->warning('Order is null in AccountEditOrderPageLoadedEvent');
  37.                 }
  38.             } catch (\Exception $e) {
  39.                 $this->logger->error('Error in AccountEditOrderPageLoadedEvent: ' $e->getMessage());
  40.             }
  41.             return;
  42.         }
  43.         // For AccountOrderPageLoadedEvent (Order History), process all orders
  44.         if ($event instanceof AccountOrderPageLoadedEvent) {
  45.             $this->logger->info('Processing AccountOrderPageLoadedEvent (Order History)');
  46.             try {
  47.                 $orders $event->getPage()->getOrders();
  48.                 $this->logger->info('Got ' $orders->count() . ' orders');
  49.                 foreach ($orders as $order) {
  50.                     $this->processOrder($order$event);
  51.                 }
  52.             } catch (\Exception $e) {
  53.                 $this->logger->error('Error in AccountOrderPageLoadedEvent: ' $e->getMessage());
  54.             }
  55.         }
  56.     }
  57.     private function processOrder($order$event): void
  58.     {
  59.         $customerId $event->getSalesChannelContext()->getCustomer()?->getId();
  60.         $this->logger->info('Order Number: ' $order->getOrderNumber());
  61.         $this->logger->info('Customer ID: ' . ($customerId ?? 'null'));
  62.         if (!$customerId) {
  63.             $this->logger->warning('No customer ID found');
  64.             return;
  65.         }
  66.         // Get all product numbers from the order
  67.         $productNumbers = [];
  68.         foreach ($order->getLineItems() as $lineItem) {
  69.             if ($lineItem->getType() === 'product' && $lineItem->getPayload()['productNumber']) {
  70.                 $productNumbers[] = $lineItem->getPayload()['productNumber'];
  71.             }
  72.         }
  73.         $this->logger->info('Product numbers found: ' implode(', '$productNumbers));
  74.         if (empty($productNumbers)) {
  75.             $this->logger->warning('No product numbers found');
  76.             return;
  77.         }
  78.         // Check which products already have reviews from this customer for this order
  79.         $placeholders str_repeat('?,'count($productNumbers) - 1) . '?';
  80.         $existingReviews $this->connection->executeQuery("
  81.             SELECT article as productNumber
  82.             FROM `trusted_reviews`
  83.             WHERE order_number = ?
  84.             AND article IN ($placeholders)
  85.         "array_merge([$order->getOrderNumber()], $productNumbers))
  86.         ->fetchAllAssociative();
  87.         $this->logger->info('Existing reviews found: ' count($existingReviews));
  88.         // Create a map of reviewed product numbers
  89.         $reviewedProducts = [];
  90.         foreach ($existingReviews as $review) {
  91.             $reviewedProducts[$review['productNumber']] = true;
  92.             $this->logger->info('Product ' $review['productNumber'] . ' already reviewed');
  93.         }
  94.         // Add extension to order entity with reviewed products info
  95.         $order->addExtension('reviewedProducts', new \Shopware\Core\Framework\Struct\ArrayStruct([
  96.             'reviewedProducts' => $reviewedProducts,
  97.             'debug_order_number' => $order->getOrderNumber(),
  98.             'debug_product_numbers' => $productNumbers,
  99.             'debug_query_result_count' => count($existingReviews)
  100.         ]));
  101.         $this->logger->info('Extension added to order');
  102.     }
  103. }