<?php
declare(strict_types=1);
namespace Tanmar\GoogleAdsTracking\Storefront\Page\Checkout;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Shopware\Core\Checkout\Cart\LineItem\LineItem;
use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
use Shopware\Storefront\Page\Checkout\Offcanvas\OffcanvasCartPageLoadedEvent;
use Tanmar\GoogleAdsTracking\Storefront\BaseSubscriber;
use Tanmar\GoogleAdsTracking\Components\Helper\LoggerHelper;
use Tanmar\GoogleAdsTracking\Service\ConfigService;
use Tanmar\GoogleAdsTracking\Service\Article\ArticleIdentifierService;
use Tanmar\GoogleAdsTracking\Service\RemarketingEvent\RemarketingEventService;
class CheckoutPageSubscriber extends BaseSubscriber implements EventSubscriberInterface {
protected $remarketingEventService;
public function __construct(ConfigService $configService, LoggerHelper $loggerHelper, ArticleIdentifierService $articleIdentifierService, RemarketingEventService $remarketingEventService) {
parent::__construct($configService, $loggerHelper, $articleIdentifierService);
$this->remarketingEventService = $remarketingEventService;
}
public static function getSubscribedEvents(): array {
return [
OffcanvasCartPageLoadedEvent::class => 'onOffcanvasCartPageLoaded',
CheckoutCartPageLoadedEvent::class => 'onCheckoutCartPageLoaded',
CheckoutConfirmPageLoadedEvent::class => 'onCheckoutConfirmPageLoaded',
CheckoutFinishPageLoadedEvent::class => 'onCheckoutFinishPageLoaded'
];
}
public function onOffcanvasCartPageLoaded(OffcanvasCartPageLoadedEvent $event): void {
try {
$googleAdsData = $this->getExtension($event);
if (!is_null($googleAdsData) && $this->getConfig()->isRetargetingActive()) {
$eventData = $this->remarketingEventService->getEventData($event->getPage()->getCart()->getLineItems()->filterType(LineItem::PRODUCT_LINE_ITEM_TYPE)->getElements(), $event->getPage()->getCart()->getPrice()->getNetPrice(), true);
$googleAdsData->assign([
'eventName' => RemarketingEventService::GOOGLE_ADS_EVENT_NAME_CART,
'eventData' => (count($eventData) > 0) ? $eventData : false
]);
}
$this->addExtension($event, $googleAdsData);
} catch (\Throwable $e) {
$this->loggerHelper->logThrowable($e);
}
}
public function onCheckoutCartPageLoaded(CheckoutCartPageLoadedEvent $event): void {
try {
$googleAdsData = $this->getExtension($event);
if (!is_null($googleAdsData) && $this->getConfig()->isRetargetingActive()) {
$eventData = $this->remarketingEventService->getEventData($event->getPage()->getCart()->getLineItems()->filterType(LineItem::PRODUCT_LINE_ITEM_TYPE)->getElements(), $event->getPage()->getCart()->getPrice()->getNetPrice(), true);
$googleAdsData->assign([
'eventName' => RemarketingEventService::GOOGLE_ADS_EVENT_NAME_CART,
'eventData' => (count($eventData) > 0) ? $eventData : false
]);
}
$this->addExtension($event, $googleAdsData);
} catch (\Throwable $e) {
$this->loggerHelper->logThrowable($e);
}
}
public function onCheckoutConfirmPageLoaded(CheckoutConfirmPageLoadedEvent $event): void {
try {
$googleAdsData = $this->getExtension($event);
if (!is_null($googleAdsData) && $this->getConfig()->isRetargetingActive()) {
$eventData = $this->remarketingEventService->getEventData($event->getPage()->getCart()->getLineItems()->filterType(LineItem::PRODUCT_LINE_ITEM_TYPE)->getElements(), $event->getPage()->getCart()->getPrice()->getNetPrice(), true);
$googleAdsData->assign([
'eventName' => RemarketingEventService::GOOGLE_ADS_EVENT_NAME_CART,
'eventData' => (count($eventData) > 0) ? $eventData : false
]);
}
$this->addExtension($event, $googleAdsData);
} catch (\Throwable $e) {
$this->loggerHelper->logThrowable($e);
}
}
public function onCheckoutFinishPageLoaded(CheckoutFinishPageLoadedEvent $event): void {
try {
$googleAdsData = $this->getExtension($event);
if (!is_null($googleAdsData)) {
$eventData = $this->remarketingEventService->getEventData($event->getPage()->getOrder()->getLineItems()->filterByType(LineItem::PRODUCT_LINE_ITEM_TYPE)->getElements(), $event->getPage()->getOrder()->getAmountNet(), true);
$googleAdsData->assign([
'eventName' => RemarketingEventService::GOOGLE_ADS_EVENT_NAME_FINISH,
'eventData' => (count($eventData) > 0) ? $eventData : false
]);
}
$this->addExtension($event, $googleAdsData);
} catch (\Throwable $e) {
$this->loggerHelper->logThrowable($e);
}
}
/**
*
* @param array $products
* @return array
*/
private function getElements(array $products): array {
$elements = array();
try {
foreach ($products as $product) {
if ($product->getType() == "product") {
$elements[] = $product;
}
}
} catch (\Throwable $e) {
$this->loggerHelper->logThrowable($e);
}
return $elements;
}
}