88use Magento \Quote \Model \Quote \Item as CartItem ;
99use Magento \Store \Model \ScopeInterface ;
1010use Magento \Tax \Model \Config ;
11+ use Yireo \GoogleTagManager2 \Api \Data \CartItemTagInterface ;
12+ use Yireo \GoogleTagManager2 \Api \Data \TagInterface ;
1113use Yireo \GoogleTagManager2 \Util \PriceFormatter ;
1214use Yireo \GoogleTagManager2 \Util \ProductProvider ;
1315
@@ -18,6 +20,8 @@ class CartItemDataMapper
1820 private PriceFormatter $ priceFormatter ;
1921 private ScopeConfigInterface $ scopeConfig ;
2022 private bool $ useProductProvider = false ;
23+ private array $ dataLayerMapping ;
24+
2125
2226 /**
2327 * @param ProductDataMapper $productDataMapper
@@ -30,13 +34,15 @@ public function __construct(
3034 ProductProvider $ productProvider ,
3135 PriceFormatter $ priceFormatter ,
3236 ScopeConfigInterface $ scopeConfig ,
33- bool $ useProductProvider = false
37+ bool $ useProductProvider = false ,
38+ array $ dataLayerMapping = []
3439 ) {
3540 $ this ->productDataMapper = $ productDataMapper ;
3641 $ this ->productProvider = $ productProvider ;
3742 $ this ->priceFormatter = $ priceFormatter ;
3843 $ this ->scopeConfig = $ scopeConfig ;
3944 $ this ->useProductProvider = $ useProductProvider ;
45+ $ this ->dataLayerMapping = $ dataLayerMapping ;
4046 }
4147
4248 /**
@@ -59,7 +65,7 @@ public function mapByCartItem(CartItem $cartItem): array
5965 }
6066
6167 $ price = $ this ->getPrice ($ cartItem );
62- return array_merge ($ cartItemData , [
68+ $ cartItemData = array_merge ($ cartItemData , [
6369 'item_sku ' => $ cartItem ->getSku (),
6470 'item_name ' => $ cartItem ->getName (),
6571 'order_item_id ' => $ cartItem ->getItemId (),
@@ -69,6 +75,9 @@ public function mapByCartItem(CartItem $cartItem): array
6975 'price ' => $ price ,
7076 'discount ' => $ this ->getPriceDiscount ($ cartItem , $ price )
7177 ]);
78+
79+ $ cartItemData = $ this ->parseDataLayerMapping ($ cartItem , $ cartItemData );
80+ return $ cartItemData ;
7281 }
7382
7483 /**
@@ -101,4 +110,36 @@ private function getPriceDiscount(CartItem $cartItem, float $price): float
101110 {
102111 return $ cartItem ->getDiscountAmount () / $ cartItem ->getQty ();
103112 }
113+
114+ /**
115+ * @param CartItem $cartItem
116+ * @param array $data
117+ *
118+ * @return array
119+ */
120+ private function parseDataLayerMapping (CartItem $ cartItem , array $ data ): array
121+ {
122+ if (empty ($ this ->dataLayerMapping )) {
123+ return [];
124+ }
125+
126+ foreach ($ this ->dataLayerMapping as $ tagName => $ tagValue ) {
127+ if (is_string ($ tagValue ) && array_key_exists ($ tagValue , $ data )) {
128+ $ data [$ tagName ] = $ data [$ tagValue ];
129+ continue ;
130+ }
131+
132+ if ($ tagValue instanceof CartItemTagInterface) {
133+ $ tagValue ->setCartItem ($ cartItem );
134+ $ data [$ tagName ] = $ tagValue ->get ();
135+ continue ;
136+ }
137+
138+ if ($ tagValue instanceof TagInterface) {
139+ $ data [$ tagName ] = $ tagValue ->get ();
140+ }
141+ }
142+
143+ return $ data ;
144+ }
104145}
0 commit comments