Skip to content

Commit a612a51

Browse files
authored
Merge pull request #67 from webmatch/feature/WBMSWPLUG-102
[TASK] change session & add storefront condition to subscriber
2 parents 6063178 + 4f97418 commit a612a51

File tree

7 files changed

+62
-36
lines changed

7 files changed

+62
-36
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# 2.1.6
2+
* change session handling
3+
* Add a condition to the kernel subscriber to prevent code unless we are in the storefront scope
4+
15
# 2.1.5
26
* fix button link to extension config for sw >= 6.4
37

composer.json

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "webmatch/tag-manager-sw6",
33
"keywords": ["shopware6", "shopware-6", "GTM", "datalayer", "datalayer-configuration", "google-tag-manager", "shopware-plugin"],
44
"description": "Google Tag Manager + Enhanced E-Commerce Tracking",
5-
"version": "2.1.5",
5+
"version": "2.1.6",
66
"type": "shopware-platform-plugin",
77
"license": "proprietary",
88
"require": {
@@ -26,12 +26,12 @@
2626
"en-GB": "Integration of Google Tag Manager with implementation of Google Analytics Enhanced E-Commerce Tracking for Shopware 6"
2727
},
2828
"manufacturerLink": {
29-
"de-DE": "http://www.webmatch.de",
30-
"en-GB": "http://www.webmatch.de"
29+
"de-DE": "https://www.webmatch.de",
30+
"en-GB": "https://www.webmatch.de"
3131
},
3232
"supportLink": {
33-
"de-DE": "http://www.webmatch.de",
34-
"en-GB": "http://www.webmatch.de"
33+
"de-DE": "https://github.com/webmatch/WbmTagManagerEcomm/issues/new/choose",
34+
"en-GB": "https://github.com/webmatch/WbmTagManagerEcomm/issues/new/choose"
3535
}
3636
},
3737
"autoload": {
@@ -44,10 +44,6 @@
4444
"Wbm\\TagManagerEcomm\\Test\\": "tests/"
4545
}
4646
},
47-
"suggest": {
48-
"shopware/storefront": "Require '6.1' - '6.3'.",
49-
"shopware/administration": "Require '6.1' - '6.3'. Allows you to set up the plugin easily"
50-
},
5147
"conflict": {
5248
"shopware/storefront": "<6,>=7",
5349
"shopware/administration": "<6,>=7"

src/Resources/config/services.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,18 @@
2121
<service id="Wbm\TagManagerEcomm\Subscriber\StorefrontRenderSubscriber">
2222
<argument type="service" id="Wbm\TagManagerEcomm\Services\DataLayerModules" />
2323
<argument type="service" id="Wbm\TagManagerEcomm\Services\DataLayerRenderer" />
24-
<argument type="service" id="Wbm\TagManagerEcomm\Utility\SessionUtility" />
24+
<argument type="service" id="session" />
2525
<tag name="kernel.event_subscriber" />
2626
</service>
2727
<service id="Wbm\TagManagerEcomm\Subscriber\KernelEventsSubscriber">
2828
<argument type="service" id="Wbm\TagManagerEcomm\Services\DataLayerModules" />
2929
<argument type="service" id="Wbm\TagManagerEcomm\Services\DataLayerRenderer" />
30-
<argument type="service" id="Wbm\TagManagerEcomm\Utility\SessionUtility" />
30+
<argument type="service" id="session" />
31+
<argument type="service" id="monolog.logger.wbmTagManager"/>
3132
<tag name="kernel.event_subscriber" />
3233
</service>
3334
<service id="Wbm\TagManagerEcomm\Subscriber\CartAddPrice\AfterLineItemAddedSubscriber">
34-
<argument type="service" id="Wbm\TagManagerEcomm\Utility\SessionUtility" />
35+
<argument type="service" id="session" />
3536
<argument type="service" id="product.repository"/>
3637
<tag name="kernel.event_subscriber" />
3738
</service>

src/Subscriber/CartAddPrice/AfterLineItemAddedSubscriber.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@
1313
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
1414
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
1515
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
16+
use Symfony\Component\HttpFoundation\Session\SessionInterface;
1617
use Wbm\TagManagerEcomm\Utility\SessionUtility;
1718

1819
class AfterLineItemAddedSubscriber implements EventSubscriberInterface
1920
{
2021
/**
21-
* @var SessionUtility
22+
* @var SessionInterface
2223
*/
2324
protected $session;
2425

@@ -27,7 +28,7 @@ class AfterLineItemAddedSubscriber implements EventSubscriberInterface
2728
*/
2829
protected $productRepository;
2930

30-
public function __construct(SessionUtility $session, EntityRepositoryInterface $productRepository)
31+
public function __construct(SessionInterface $session, EntityRepositoryInterface $productRepository)
3132
{
3233
$this->session = $session;
3334
$this->productRepository = $productRepository;

src/Subscriber/KernelEventsSubscriber.php

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
namespace Wbm\TagManagerEcomm\Subscriber;
44

5+
use Shopware\Core\Framework\Routing\Annotation\RouteScope;
6+
use Shopware\Core\Framework\Routing\KernelListenerPriorities;
57
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
8+
use Symfony\Component\HttpFoundation\Request;
9+
use Symfony\Component\HttpFoundation\Session\SessionInterface;
610
use Symfony\Component\HttpKernel\Event\ControllerEvent;
711
use Symfony\Component\HttpKernel\Event\ResponseEvent;
812
use Symfony\Component\HttpKernel\KernelEvents;
@@ -23,14 +27,14 @@ class KernelEventsSubscriber implements EventSubscriberInterface
2327
private $dataLayerRenderer;
2428

2529
/**
26-
* @var SessionUtility
30+
* @var SessionInterface
2731
*/
2832
private $session;
2933

3034
public function __construct(
3135
DataLayerModulesInterface $modules,
3236
DataLayerRendererInterface $dataLayerRender,
33-
SessionUtility $session
37+
SessionInterface $session
3438
) {
3539
$this->modules = $modules;
3640
$this->dataLayerRenderer = $dataLayerRender;
@@ -41,18 +45,23 @@ public static function getSubscribedEvents(): array
4145
{
4246
return [
4347
KernelEvents::CONTROLLER => [
44-
['getDataLayerForXmlHttpRequest'],
48+
['getDataLayerForXmlHttpRequest', KernelListenerPriorities::KERNEL_CONTROLLER_EVENT_SCOPE_VALIDATE_POST],
4549
],
4650
KernelEvents::RESPONSE => [
47-
['prependDataLayerToResponse'],
51+
['prependDataLayerToResponse', -1],
4852
],
4953
];
5054
}
5155

5256
public function getDataLayerForXmlHttpRequest(ControllerEvent $event): void
5357
{
58+
$request = $event->getRequest();
59+
if (!$this->isStorefrontRequest($request)) {
60+
return;
61+
}
62+
5463
$modules = $this->modules->getModules();
55-
$route = $event->getRequest()->attributes->get('_route');
64+
$route = $request->attributes->get('_route');
5665

5766
if (!array_key_exists($route, $modules)
5867
|| empty($modules[$route])
@@ -61,7 +70,7 @@ public function getDataLayerForXmlHttpRequest(ControllerEvent $event): void
6170
return;
6271
}
6372

64-
$salesChannelId = $event->getRequest()->get('sw-sales-channel-id');
73+
$salesChannelId = $request->get('sw-sales-channel-id');
6574
$isActive = !empty($this->modules->getContainerId($salesChannelId)) && $this->modules->isActive($salesChannelId);
6675

6776
if (!$isActive) {
@@ -75,13 +84,14 @@ public function prependDataLayerToResponse(ResponseEvent $event): void
7584
{
7685
$response = $event->getResponse();
7786
$request = $event->getRequest();
78-
$storedDatalayer = $this->session->get(SessionUtility::ATTRIBUTE_NAME);
79-
$this->session->remove(SessionUtility::ATTRIBUTE_NAME);
87+
if (!$this->isStorefrontRequest($request)) {
88+
return;
89+
}
8090

8191
$route = $request->attributes->get('_route');
8292
$dataLayer = $this->dataLayerRenderer->getDataLayer($route);
8393
if ($dataLayer !== null) {
84-
$dataLayer = $this->session->injectSessionVars($dataLayer);
94+
$dataLayer = SessionUtility::injectSessionVars($dataLayer, $this->session);
8595
$dataLayer = json_encode($dataLayer);
8696
}
8797

@@ -95,6 +105,8 @@ public function prependDataLayerToResponse(ResponseEvent $event): void
95105
return;
96106
}
97107

108+
$storedDatalayer = $this->session->get(SessionUtility::ATTRIBUTE_NAME);
109+
$this->session->remove(SessionUtility::ATTRIBUTE_NAME);
98110
if ($storedDatalayer && in_array($route, $this->modules->getResponseRoutes(), true)) {
99111
$dataLayer = $storedDatalayer;
100112
}
@@ -113,4 +125,16 @@ public function prependDataLayerToResponse(ResponseEvent $event): void
113125

114126
$event->setResponse($response);
115127
}
128+
129+
private function isStorefrontRequest(Request $request)
130+
{
131+
if ($request->attributes->has('_routeScope')
132+
&& $request->attributes->get('_routeScope') instanceof RouteScope
133+
&& $request->attributes->get('_routeScope')->hasScope('storefront')
134+
) {
135+
return true;
136+
}
137+
138+
return false;
139+
}
116140
}

src/Subscriber/StorefrontRenderSubscriber.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Shopware\Storefront\Event\StorefrontRenderEvent;
66
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
7+
use Symfony\Component\HttpFoundation\Session\SessionInterface;
78
use Wbm\TagManagerEcomm\Cookie\CustomCookieProvider;
89
use Wbm\TagManagerEcomm\Services\DataLayerModules;
910
use Wbm\TagManagerEcomm\Services\DataLayerRenderer;
@@ -22,14 +23,14 @@ class StorefrontRenderSubscriber implements EventSubscriberInterface
2223
private $dataLayerRenderer;
2324

2425
/**
25-
* @var SessionUtility
26+
* @var SessionInterface
2627
*/
2728
private $session;
2829

2930
public function __construct(
3031
DataLayerModules $modules,
3132
DataLayerRenderer $dataLayerRenderer,
32-
SessionUtility $session
33+
SessionInterface $session
3334
) {
3435
$this->modules = $modules;
3536
$this->dataLayerRenderer = $dataLayerRenderer;
@@ -54,10 +55,9 @@ public function onRender(StorefrontRenderEvent $event): void
5455
return;
5556
}
5657

57-
$storedDatalayer = $this->session->get(SessionUtility::ATTRIBUTE_NAME);
58-
if ($storedDatalayer) {
58+
if ($this->session->has(SessionUtility::ATTRIBUTE_NAME)) {
5959
if (in_array($route, $this->modules->getResponseRoutes(), true)) {
60-
$dataLayer = json_decode($storedDatalayer, true);
60+
$dataLayer = json_decode($this->session->get(SessionUtility::ATTRIBUTE_NAME), true);
6161
}
6262
} else {
6363
$parameters = $event->getParameters();

src/Utility/SessionUtility.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
namespace Wbm\TagManagerEcomm\Utility;
44

5-
use Symfony\Component\HttpFoundation\Session\Session;
5+
use Symfony\Component\HttpFoundation\Session\SessionInterface;
66

7-
class SessionUtility extends Session
7+
class SessionUtility
88
{
99
public const ATTRIBUTE_NAME = 'wbm-stored-datalayer';
1010

@@ -13,18 +13,18 @@ class SessionUtility extends Session
1313
public const ADDCART_UPDATEFLAG_VALUE = 'cartaddprice';
1414
public const ADDCART_CART_ITEMS = 'wbm-stored-addCart-addedCartItems';
1515

16-
public function injectSessionVars(array $dataLayer): array
16+
public static function injectSessionVars(array $dataLayer, SessionInterface $session): array
1717
{
18-
if (!$this->has(self::UPDATE_FLAG)) {
18+
if (!$session->has(self::UPDATE_FLAG)) {
1919
return $dataLayer;
2020
}
2121

22-
if ($this->get(self::UPDATE_FLAG) === self::ADDCART_UPDATEFLAG_VALUE) {
22+
if ($session->get(self::UPDATE_FLAG) === self::ADDCART_UPDATEFLAG_VALUE) {
2323
try {
2424
foreach ($dataLayer as &$dLayer) {
2525
$dLayer = json_decode($dLayer, true, 512);
2626
foreach ($dLayer['ecommerce']['add']['products'] as &$product) {
27-
$lineItems = $this->get(self::ADDCART_CART_ITEMS);
27+
$lineItems = $session->get(self::ADDCART_CART_ITEMS);
2828
$product['price'] = $lineItems[$product['id']];
2929
}
3030
unset($product);
@@ -33,8 +33,8 @@ public function injectSessionVars(array $dataLayer): array
3333
} catch (\Throwable $t) {
3434
// just to make sure session vars are removed on error
3535
}
36-
$this->remove(self::UPDATE_FLAG);
37-
$this->remove(self::ADDCART_CART_ITEMS);
36+
$session->remove(self::UPDATE_FLAG);
37+
$session->remove(self::ADDCART_CART_ITEMS);
3838
}
3939

4040
return $dataLayer;

0 commit comments

Comments
 (0)