Compare commits

...

9 Commits

16 changed files with 515 additions and 209 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.idea

View File

@ -1,49 +1,56 @@
[{$smarty.block.parent}] [{$smarty.block.parent}]
[{strip}] [{block name="d3_ga4_purchase_block"}]
<script> [{capture assign=d3_ga4_purchase}]
dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ [{strip}]
[{assign var="gtmOrder" value=$oView->getOrder()}] dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */
[{assign var="gtmBasket" value=$oView->getBasket()}] [{assign var="gtmOrder" value=$oView->getOrder()}]
[{assign var="gtmArticles" value=$gtmOrder->getOrderArticles()}] [{assign var="gtmBasket" value=$oView->getBasket()}]
[{assign var="gtmOrderVouchers" value=$gtmOrder->getVoucherNrList()}] [{assign var="gtmArticles" value=$gtmOrder->getOrderArticles()}]
[{assign var="gtmOrderVouchers" value=$gtmOrder->getVoucherNrList()}]
dataLayer.push({ dataLayer.push({
'event': 'purchase', 'event': 'purchase',
'eventLabel':'Checkout Step 5', 'eventLabel':'Checkout Step 5',
'ecommerce': { 'ecommerce': {
'transaction_id': '[{$gtmOrder->getFieldData("oxordernr")}]', 'transaction_id': '[{$gtmOrder->getFieldData("oxordernr")}]',
'affiliation': '[{$oxcmp_shop->getFieldData("oxname")}]', 'affiliation': '[{$oxcmp_shop->getFieldData("oxname")}]',
'value': [{$gtmOrder->getTotalOrderSum()}], 'value': [{$gtmOrder->getTotalOrderSum()}],
'tax': [{math equation="x+y" x=$gtmOrder->getFieldData("oxartvatprice1") y=$gtmOrder->getFieldData("oxartvatprice2") }], 'tax': [{math equation="x+y" x=$gtmOrder->getFieldData("oxartvatprice1") y=$gtmOrder->getFieldData("oxartvatprice2") }],
'shipping': [{$gtmOrder->getFieldData("oxdelcost")}], 'shipping': [{$gtmOrder->getFieldData("oxdelcost")}],
'currency': '[{$gtmOrder->getFieldData('oxcurrency')}]', 'currency': '[{$gtmOrder->getFieldData('oxcurrency')}]',
'coupon': '[{foreach from=$gtmOrderVouchers item="gtmOrderVoucher" name="gtmOrderVoucherIteration"}][{$gtmOrderVoucher}][{if !$smarty.foreach.gtmOrderVoucherIteration.last}], [{/if}][{/foreach}]', 'coupon': '[{foreach from=$gtmOrderVouchers item="gtmOrderVoucher" name="gtmOrderVoucherIteration"}][{$gtmOrderVoucher}][{if !$smarty.foreach.gtmOrderVoucherIteration.last}], [{/if}][{/foreach}]',
'paymentType': '[{$gtmBasket->getPaymentOnPaymentId()}]', 'paymentType': '[{$gtmBasket->getPaymentOnPaymentId()}]',
'items': [ 'items': [
[{foreach from=$gtmArticles item="gtmBasketItem" name="gtmArticles"}] [{foreach from=$gtmArticles item="gtmBasketItem" name="gtmArticles"}]
[{assign var="gtmPurchaseItemPriceObject" value=$gtmBasketItem->getPrice()}] [{assign var="gtmPurchaseItemPriceObject" value=$gtmBasketItem->getPrice()}]
[{assign var="gtmPurchaseItem" value=$gtmBasketItem->getArticle()}] [{assign var="gtmPurchaseItem" value=$gtmBasketItem->getArticle()}]
[{assign var="gtmPurchaseItemCategory" value=$gtmPurchaseItem->getCategory()}] [{assign var="gtmPurchaseItemCategory" value=$gtmPurchaseItem->getCategory()}]
{ {
'item_id': '[{$gtmBasketItem->getFieldData("oxartnum")}]', 'item_id': '[{$gtmBasketItem->getFieldData("oxartnum")}]',
'item_name': '[{$gtmBasketItem->getFieldData("oxtitle")}]', 'item_name': '[{$gtmBasketItem->getFieldData("oxtitle")}]',
'affiliation': '[{$gtmBasketItem->getFieldData("oxtitle")}]', 'affiliation': '[{$gtmBasketItem->getFieldData("oxtitle")}]',
'coupon': '[{foreach from=$gtmOrderVouchers item="gtmOrderVoucher" name="gtmOrderVoucherIteration"}][{$gtmOrderVoucher}][{if !$smarty.foreach.gtmOrderVoucherIteration.last}], [{/if}][{/foreach}]', 'coupon': '[{foreach from=$gtmOrderVouchers item="gtmOrderVoucher" name="gtmOrderVoucherIteration"}][{$gtmOrderVoucher}][{if !$smarty.foreach.gtmOrderVoucherIteration.last}], [{/if}][{/foreach}]',
'item_variant': '[{$gtmBasketItem->getFieldData("oxselvariant")}]', 'item_variant': '[{$gtmBasketItem->getFieldData("oxselvariant")}]',
'item_category': '[{$gtmPurchaseItemCategory->getSplitCategoryArray(0)}]', [{if $gtmPurchaseItemCategory}]
'item_category_2': '[{$gtmPurchaseItemCategory->getSplitCategoryArray(1)}]', 'item_category': '[{$gtmPurchaseItemCategory->getSplitCategoryArray(0)}]',
'item_category_3': '[{$gtmPurchaseItemCategory->getSplitCategoryArray(2)}]', 'item_category_2': '[{$gtmPurchaseItemCategory->getSplitCategoryArray(1)}]',
'item_category_4': '[{$gtmPurchaseItemCategory->getSplitCategoryArray(3)}]', 'item_category_3': '[{$gtmPurchaseItemCategory->getSplitCategoryArray(2)}]',
'item_list_name': '[{$gtmPurchaseItemCategory->getSplitCategoryArray()}]', 'item_category_4': '[{$gtmPurchaseItemCategory->getSplitCategoryArray(3)}]',
'price': [{$gtmPurchaseItemPriceObject->getPrice()}], 'item_list_name': '[{$gtmPurchaseItemCategory->getSplitCategoryArray()}]',
'quantity': [{$gtmBasketItem->getFieldData("oxamount")}], [{/if}]
'position': [{$smarty.foreach.gtmArticles.iteration}] 'price': [{$gtmPurchaseItemPriceObject->getPrice()}],
}[{if !$smarty.foreach.gtmArticles.last}],[{/if}] 'quantity': [{$gtmBasketItem->getFieldData("oxamount")}],
[{/foreach}] 'position': [{$smarty.foreach.gtmArticles.iteration}]
] }[{if !$smarty.foreach.gtmArticles.last}],[{/if}]
} [{/foreach}]
}) ]
</script> }[{if $oViewConf->isDebugModeOn()}],
[{/strip}] 'debug_mode': 'true'
[{/if}]
})
[{/strip}]
[{/capture}]
[{oxscript add=$d3_ga4_purchase}]
[{/block}]

View File

@ -5,38 +5,46 @@
[{assign var="d3BasketPrice" value=$oxcmp_basket->getPrice()}] [{assign var="d3BasketPrice" value=$oxcmp_basket->getPrice()}]
[{assign var='gtmCartArticles' value=$oView->getBasketArticles()}] [{assign var='gtmCartArticles' value=$oView->getBasketArticles()}]
[{strip}][{capture assign=d3_ga4_view_cart}] [{block name="d3_ga4_view_cart_block"}]
dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ [{capture assign=d3_ga4_view_cart}]
dataLayer.push({ [{strip}]
'event': 'view_cart', dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */
'eventLabel':'Checkout Step 1', dataLayer.push({
'ecommerce': { 'event': 'view_cart',
'actionField': "step: 1", 'eventLabel':'Checkout Step 1',
'currency': "[{$currency->name}]", 'ecommerce': {
'value': [{$d3BasketPrice->getPrice()}], 'actionField': "step: 1",
'coupon': '[{foreach from=$oxcmp_basket->getVouchers() item=sVoucher key=key name=Voucher}][{$sVoucher->sVoucherNr}][{if !$smarty.foreach.Voucher.last}], [{/if}][{/foreach}]', 'currency': "[{$currency->name}]",
'items': [ 'value': [{$d3BasketPrice->getPrice()}],
[{foreach from=$oxcmp_basket->getContents() item=basketitem name=gtmCartContents key=basketindex}] 'coupon': '[{foreach from=$oxcmp_basket->getVouchers() item=sVoucher key=key name=Voucher}][{$sVoucher->sVoucherNr}][{if !$smarty.foreach.Voucher.last}], [{/if}][{/foreach}]',
[{assign var="d3oItemPrice" value=$basketitem->getPrice()}] 'items': [
[{assign var="gtmBasketItem" value=$basketitem->getArticle()}] [{foreach from=$oxcmp_basket->getContents() item=basketitem name=gtmCartContents key=basketindex}]
[{assign var="gtmBasketItemCategory" value=$gtmBasketItem->getCategory()}] [{assign var="d3oItemPrice" value=$basketitem->getPrice()}]
{ [{assign var="gtmBasketItem" value=$basketitem->getArticle()}]
'item_id': '[{$gtmCartArticles[$basketindex]->getFieldData('oxartnum')}]', [{assign var="gtmBasketItemCategory" value=$gtmBasketItem->getCategory()}]
'item_name': '[{$gtmCartArticles[$basketindex]->getFieldData('oxtitle')}]', {
'item_variant': '[{$gtmCartArticles[$basketindex]->getFieldData('oxvarselect')}]', 'item_id': '[{$gtmCartArticles[$basketindex]->getFieldData('oxartnum')}]',
'item_category': '[{$gtmBasketItemCategory->getSplitCategoryArray(0)}]', 'item_name': '[{$gtmCartArticles[$basketindex]->getFieldData('oxtitle')}]',
'item_category_2': '[{$gtmBasketItemCategory->getSplitCategoryArray(1)}]', 'item_variant': '[{$gtmCartArticles[$basketindex]->getFieldData('oxvarselect')}]',
'item_category_3': '[{$gtmBasketItemCategory->getSplitCategoryArray(2)}]', [{if $gtmBasketItemCategory}]
'item_category_4': '[{$gtmBasketItemCategory->getSplitCategoryArray(3)}]', 'item_category': '[{$gtmBasketItemCategory->getSplitCategoryArray(0)}]',
'item_list_name': '[{$gtmBasketItemCategory->getSplitCategoryArray()}]', 'item_category_2': '[{$gtmBasketItemCategory->getSplitCategoryArray(1)}]',
'price': [{$d3oItemPrice->getPrice()}], 'item_category_3': '[{$gtmBasketItemCategory->getSplitCategoryArray(2)}]',
'coupon': '[{foreach from=$oxcmp_basket->getVouchers() item=sVoucher key=key name=Voucher}][{$sVoucher->sVoucherNr}][{if !$smarty.foreach.Voucher.last}], [{/if}][{/foreach}]', 'item_category_4': '[{$gtmBasketItemCategory->getSplitCategoryArray(3)}]',
'quantity': [{$basketitem->getAmount()}], 'item_list_name': '[{$gtmBasketItemCategory->getSplitCategoryArray()}]',
'position': [{$smarty.foreach.gtmCartContents.index}] [{/if}]
}[{if !$smarty.foreach.gtmCartContents.last}],[{/if}] 'price': [{$d3oItemPrice->getPrice()}],
[{/foreach}] 'coupon': '[{foreach from=$oxcmp_basket->getVouchers() item=sVoucher key=key name=Voucher}][{$sVoucher->sVoucherNr}][{if !$smarty.foreach.Voucher.last}], [{/if}][{/foreach}]',
] 'quantity': [{$basketitem->getAmount()}],
} 'position': [{$smarty.foreach.gtmCartContents.index}]
}); }[{if !$smarty.foreach.gtmCartContents.last}],[{/if}]
[{/capture}][{/strip}] [{/foreach}]
[{oxscript add=$d3_ga4_view_cart}] ]
}[{if $oViewConf->isDebugModeOn()}],
'debug_mode': 'true'
[{/if}]
});
[{/strip}]
[{/capture}]
[{oxscript add=$d3_ga4_view_cart}]
[{/block}]

View File

@ -3,29 +3,38 @@
[{assign var="gtmCategory" value=$gtmProduct->getCategory()}] [{assign var="gtmCategory" value=$gtmProduct->getCategory()}]
[{assign var="gtmManufacturer" value=$gtmProduct->getManufacturer()}] [{assign var="gtmManufacturer" value=$gtmProduct->getManufacturer()}]
<script> [{block name="d3_ga4_view_item_block"}]
dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ [{capture assign=d3_ga4_view_item}]
[{strip}]
dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */
dataLayer.push({ dataLayer.push({
'event': 'view_item', 'event': 'view_item',
'eventLabel':'Product View', 'eventLabel':'Product View',
'ecommerce': { 'ecommerce': {
'currency': '[{$currency->name}]', 'currency': '[{$currency->name}]',
'items': [ 'items': [
{ {
'item_name': '[{$gtmProduct->getFieldData("oxtitle")}]', 'item_name': '[{$gtmProduct->getFieldData("oxtitle")}]',
'item_id': '[{$gtmProduct->getFieldData("oxartnum")}]', 'item_id': '[{$gtmProduct->getFieldData("oxartnum")}]',
'item_brand': '[{if $gtmManufacturer}][{$gtmManufacturer->oxmanufacturers__oxtitle->value}][{/if}]', 'item_brand': '[{if $gtmManufacturer}][{$gtmManufacturer->oxmanufacturers__oxtitle->value}][{/if}]',
'item_variant': '[{if $gtmProduct->getFieldData("oxvarselect")}][{$gtmProduct->getFieldData("oxvarselect")}][{/if}]', 'item_variant': '[{if $gtmProduct->getFieldData("oxvarselect")}][{$gtmProduct->getFieldData("oxvarselect")}][{/if}]',
'item_category': '[{$gtmCategory->getSplitCategoryArray(0)}]', [{if $gtmCategory}]
'item_category_2':'[{$gtmCategory->getSplitCategoryArray(1)}]', 'item_category': '[{$gtmCategory->getSplitCategoryArray(0)}]',
'item_category_3':'[{$gtmCategory->getSplitCategoryArray(2)}]', 'item_category_2':'[{$gtmCategory->getSplitCategoryArray(1)}]',
'item_category_4':'[{$gtmCategory->getSplitCategoryArray(3)}]', 'item_category_3':'[{$gtmCategory->getSplitCategoryArray(2)}]',
'item_list_name':'[{$gtmCategory->getSplitCategoryArray()}]', 'item_category_4':'[{$gtmCategory->getSplitCategoryArray(3)}]',
[{assign var="d3PriceObject" value=$gtmProduct->getPrice()}] 'item_list_name':'[{$gtmCategory->getSplitCategoryArray()}]',
'price': [{$d3PriceObject->getPrice()}] [{/if}]
} [{assign var="d3PriceObject" value=$gtmProduct->getPrice()}]
] 'price': [{$d3PriceObject->getPrice()}]
} }
}); ]
</script> }[{if $oViewConf->isDebugModeOn()}],
'debug_mode': 'true'
[{/if}]
});
[{/strip}]
[{/capture}]
[{oxscript add=$d3_ga4_view_item}]
[{/block}]

View File

@ -6,41 +6,47 @@
[{assign var="gtmManufacturer" value=$gtmProduct->getManufacturer()}] [{assign var="gtmManufacturer" value=$gtmProduct->getManufacturer()}]
[{assign var="gtmCategory" value=$gtmProduct->getCategory()}] [{assign var="gtmCategory" value=$gtmProduct->getCategory()}]
[{capture assign=d3_ga4_add_to_cart}] [{block name="d3_ga4_add_to_cart_block"}]
[{block name="d3_ga4_add_to_basket"}] [{capture assign=d3_ga4_add_to_cart}]
$("#toBasket").click(function(event) { [{strip}]
dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ $("#toBasket").click(function(event) {
dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */
[{*** Debug cases ***}] [{*** Debug cases ***}]
[{*event.preventDefault();*}] [{*event.preventDefault();*}]
let iArtQuantity = $("#amountToBasket").val(); let iArtQuantity = $("#amountToBasket").val();
dataLayer.push({ dataLayer.push({
'isAddToBasket': true, 'isAddToBasket': true,
'event':'add_to_cart', 'event':'add_to_cart',
'eventLabel': 'add_to_cart', 'eventLabel': 'add_to_cart',
'ecommerce': { 'ecommerce': {
'currency': "[{$currency->name}]", 'currency': "[{$currency->name}]",
'value': iArtQuantity*[{$d3PriceObject->getPrice()}], 'value': iArtQuantity*[{$d3PriceObject->getPrice()}],
'items': [ 'items': [
{ {
'item_id': '[{$gtmProduct->getFieldData('oxartnum')}]', 'item_id': '[{$gtmProduct->getFieldData('oxartnum')}]',
'item_name': '[{$gtmProduct->getFieldData('oxtitle')}]', 'item_name': '[{$gtmProduct->getFieldData('oxtitle')}]',
'price': [{$d3PriceObject->getPrice()}], 'price': [{$d3PriceObject->getPrice()}],
'item_brand': '[{if $gtmManufacturer}][{$gtmManufacturer->oxmanufacturers__oxtitle->value}][{/if}]', 'item_brand': '[{if $gtmManufacturer}][{$gtmManufacturer->oxmanufacturers__oxtitle->value}][{/if}]',
'item_variant': '[{if $gtmProduct->getFieldData('oxvarselect')}][{$gtmProduct->getFieldData('oxvarselect')}][{/if}]', 'item_variant': '[{if $gtmProduct->getFieldData('oxvarselect')}][{$gtmProduct->getFieldData('oxvarselect')}][{/if}]',
'item_category': '[{$gtmCategory->getSplitCategoryArray(0)}]', [{if $gtmCategory}]
'item_category_2':'[{$gtmCategory->getSplitCategoryArray(1)}]', 'item_category': '[{$gtmCategory->getSplitCategoryArray(0)}]',
'item_category_3':'[{$gtmCategory->getSplitCategoryArray(2)}]', 'item_category_2':'[{$gtmCategory->getSplitCategoryArray(1)}]',
'item_category_4':'[{$gtmCategory->getSplitCategoryArray(3)}]', 'item_category_3':'[{$gtmCategory->getSplitCategoryArray(2)}]',
'item_list_name':'[{$gtmCategory->getSplitCategoryArray()}]', 'item_category_4':'[{$gtmCategory->getSplitCategoryArray(3)}]',
'quantity': iArtQuantity 'item_list_name':'[{$gtmCategory->getSplitCategoryArray()}]',
} [{/if}]
] 'quantity': iArtQuantity
} }
}); ]
}); }[{if $oViewConf->isDebugModeOn()}],
[{/block}] 'debug_mode': 'true'
[{/if}]
});
});
[{/strip}]
[{/capture}] [{/capture}]
[{oxscript add=$d3_ga4_add_to_cart}] [{oxscript add=$d3_ga4_add_to_cart}]
[{/block}]

View File

@ -0,0 +1,48 @@
[{$smarty.block.parent}]
[{block name="d3_ga4_remove_from_cart_block"}]
[{if $hasBeenReloaded}]
[{assign var="d3BasketPrice" value=$oxcmp_basket->getPrice()}]
[{capture assign=d3_ga4_remove_from_cart}]
[{strip}]
dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */
dataLayer.push({
'isRemoveFromCart': true,
'event': 'remove_from_cart',
'eventLabel':'remove_from_cart',
'ecommerce': {
'actionField': "step: 1",
'currency': "[{$currency->name}]",
'value': [{$d3BasketPrice->getPrice()}],
'coupon': '[{foreach from=$oxcmp_basket->getVouchers() item=sVoucher key=key name=Voucher}][{$sVoucher->sVoucherNr}][{if !$smarty.foreach.Voucher.last}], [{/if}][{/foreach}]',
'items': [
[{foreach from=$toRemoveArticles->getArray() name=gtmRemovedItems item=rmItem key=rmItemindex}]
[{assign var="d3oItemPrice" value=$rmItem->getPrice()}]
[{assign var="gtmBasketItemCategory" value=$rmItem->getCategory()}]
{
'item_id': '[{$rmItem->getFieldData('oxartnum')}]',
'item_name': '[{$rmItem->getFieldData('oxtitle')}]',
'item_variant': '[{$rmItem->getFieldData('oxvarselect')}]',
[{if $gtmBasketItemCategory}]
'item_category': '[{$gtmBasketItemCategory->getSplitCategoryArray(0)}]',
'item_category_2': '[{$gtmBasketItemCategory->getSplitCategoryArray(1)}]',
'item_category_3': '[{$gtmBasketItemCategory->getSplitCategoryArray(2)}]',
'item_category_4': '[{$gtmBasketItemCategory->getSplitCategoryArray(3)}]',
'item_list_name': '[{$gtmBasketItemCategory->getSplitCategoryArray()}]',
[{/if}]
'price': [{$d3oItemPrice->getPrice()}],
'coupon': '[{foreach from=$oxcmp_basket->getVouchers() item=sVoucher key=key name=Voucher}][{$sVoucher->sVoucherNr}][{if !$smarty.foreach.Voucher.last}], [{/if}][{/foreach}]',
'quantity': '[{$rmItem->getFieldData('d3AmountThatGotRemoved')}]',
'position': [{$smarty.foreach.gtmRemovedItems.index}]
}[{if !$smarty.foreach.gtmRemovedItems.last}],[{/if}]
[{/foreach}]
]
}[{if $oViewConf->isDebugModeOn()}],
'debug_mode': 'true'
[{/if}]
});
[{/strip}]
[{/capture}]
[{oxscript add=$d3_ga4_remove_from_cart}]
[{/if}]
[{/block}]

View File

@ -4,37 +4,43 @@
[{assign var="breadCrumb" value=''}] [{assign var="breadCrumb" value=''}]
[{if $gtmProducts|@count}] [{block name="d3_ga4_view_item_list_block"}]
[{strip}] [{if $gtmProducts|@count}]
<script> [{capture assign=d3_ga4_view_item_list}]
/* ga4 */ [{strip}]
dataLayer.push({ecommerce: null}); dataLayer.push({ecommerce: null});
dataLayer.push({ dataLayer.push({
'event':'view_item_list', 'event':'view_item_list',
'event_name': 'view_item_list', 'event_name': 'view_item_list',
'ecommerce': { 'ecommerce': {
'item_list_id': '[{$oView->getCategoryId()}]', 'item_list_id': '[{$oView->getCategoryId()}]',
'item_list_name': '[{foreach from=$oView->getBreadCrumb() item=sCrum}][{if $sCrum.title }][{$breadCrumb|cat:$sCrum.title|cat:" > "}][{/if}][{/foreach}]', 'item_list_name': '[{foreach from=$oView->getBreadCrumb() item=sCrum}][{if $sCrum.title }][{$breadCrumb|cat:$sCrum.title|cat:" > "}][{/if}][{/foreach}]',
'items': [ 'items': [
[{foreach from=$gtmProducts name="gtmProducts" item="gtmProduct"}] [{foreach from=$gtmProducts name="gtmProducts" item="gtmProduct"}]
[{assign var="d3PriceObject" value=$gtmProduct->getPrice()}] [{assign var="d3PriceObject" value=$gtmProduct->getPrice()}]
[{assign var="gtmManufacturer" value=$gtmProduct->getManufacturer()}] [{assign var="gtmManufacturer" value=$gtmProduct->getManufacturer()}]
[{if !$gtmCategory}][{assign var="gtmCategory" value=$gtmProduct->getCategory()}][{/if}] [{if !$gtmCategory}][{assign var="gtmCategory" value=$gtmProduct->getCategory()}][{/if}]
{ {
'item_id': '[{$gtmProduct->getFieldData("oxartnum")}]', 'item_id': '[{$gtmProduct->getFieldData("oxartnum")}]',
'item_name': '[{$gtmProduct->getFieldData("oxtitle")}]', 'item_name': '[{$gtmProduct->getFieldData("oxtitle")}]',
'price': [{$d3PriceObject->getPrice()}], 'price': [{$d3PriceObject->getPrice()}],
'item_brand': '[{if $gtmManufacturer}][{$gtmManufacturer->oxmanufacturers__oxtitle->value}][{/if}]', 'item_brand': '[{if $gtmManufacturer}][{$gtmManufacturer->oxmanufacturers__oxtitle->value}][{/if}]',
'item_category': '[{$gtmCategory->getSplitCategoryArray(0)}]', [{if $gtmCategory}]
'item_category_2':'[{$gtmCategory->getSplitCategoryArray(1)}]', 'item_category': '[{$gtmCategory->getSplitCategoryArray(0)}]',
'item_category_3':'[{$gtmCategory->getSplitCategoryArray(2)}]', 'item_category_2':'[{$gtmCategory->getSplitCategoryArray(1)}]',
'item_category_4':'[{$gtmCategory->getSplitCategoryArray(3)}]', 'item_category_3':'[{$gtmCategory->getSplitCategoryArray(2)}]',
'quantity': 1 'item_category_4':'[{$gtmCategory->getSplitCategoryArray(3)}]',
}[{if !$smarty.foreach.gtmProducts.last}],[{/if}] [{/if}]
[{/foreach}] 'quantity': 1
] }[{if !$smarty.foreach.gtmProducts.last}],[{/if}]
} [{/foreach}]
}); ]
</script> }[{if $oViewConf->isDebugModeOn()}],
[{/strip}] 'debug_mode': 'true'
[{/if}] [{/if}]
});
[{/strip}]
[{/capture}]
[{oxscript add=$d3_ga4_view_item_list}]
[{/if}]
[{/block}]

View File

@ -2,36 +2,43 @@
[{assign var="gtmProducts" value=$oView->getArticleList()}] [{assign var="gtmProducts" value=$oView->getArticleList()}]
[{if $gtmProducts|@count}] [{block name="d3_ga4_view_search_result_block"}]
[{strip}] [{if $gtmProducts|@count}]
<script> [{capture assign=d3_ga4_view_search_result}]
dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ [{strip}]
dataLayer.push({ dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */
'event': 'view_search_result', dataLayer.push({
'eventLabel':'view_search_result', 'event': 'view_search_result',
'ecommerce': { 'eventLabel':'view_search_result[{if $oViewConf->isDebugModeOn()}]_test[{/if}]',
'search_term': '[{$searchparamforhtml}]', 'ecommerce': {
'items': [ 'search_term': '[{$searchparamforhtml}]',
[{foreach from=$gtmProducts name="gtmProducts" item="gtmProduct"}] 'items': [
[{assign var="d3PriceObject" value=$gtmProduct->getPrice()}] [{foreach from=$gtmProducts name="gtmProducts" item="gtmProduct"}]
[{assign var="gtmManufacturer" value=$gtmProduct->getManufacturer()}] [{assign var="d3PriceObject" value=$gtmProduct->getPrice()}]
[{assign var="gtmCategory" value=$gtmProduct->getCategory()}] [{assign var="gtmManufacturer" value=$gtmProduct->getManufacturer()}]
{ [{assign var="gtmCategory" value=$gtmProduct->getCategory()}]
'item_id': '[{$gtmProduct->getFieldData("oxartnum")}]', {
'item_name': '[{$gtmProduct->getFieldData("oxtitle")}]', 'item_id': '[{$gtmProduct->getFieldData("oxartnum")}]',
'price': [{$d3PriceObject->getPrice()}], 'item_name': '[{$gtmProduct->getFieldData("oxtitle")}]',
'item_brand': '[{if $gtmManufacturer}][{$gtmManufacturer->oxmanufacturers__oxtitle->value}][{/if}]', 'price': [{$d3PriceObject->getPrice()}],
'item_category': '[{$gtmCategory->getSplitCategoryArray(0)}]', 'item_brand': '[{if $gtmManufacturer}][{$gtmManufacturer->oxmanufacturers__oxtitle->value}][{/if}]',
'item_category_2':'[{$gtmCategory->getSplitCategoryArray(1)}]', [{if $gtmCategory}]
'item_category_3':'[{$gtmCategory->getSplitCategoryArray(2)}]', 'item_category': '[{$gtmCategory->getSplitCategoryArray(0)}]',
'item_category_4':'[{$gtmCategory->getSplitCategoryArray(3)}]', 'item_category_2':'[{$gtmCategory->getSplitCategoryArray(1)}]',
'item_list_name':'[{$gtmCategory->getSplitCategoryArray()}]', 'item_category_3':'[{$gtmCategory->getSplitCategoryArray(2)}]',
'quantity': 1 'item_category_4':'[{$gtmCategory->getSplitCategoryArray(3)}]',
}[{if !$smarty.foreach.gtmProducts.last}],[{/if}] 'item_list_name':'[{$gtmCategory->getSplitCategoryArray()}]',
[{/foreach}] [{/if}]
] 'quantity': 1
} }[{if !$smarty.foreach.gtmProducts.last}],[{/if}]
}); [{/foreach}]
</script> ]
[{/strip}] }[{if $oViewConf->isDebugModeOn()}],
[{/if}] 'debug_mode': 'true'
[{/if}]
});
[{/strip}]
[{/capture}]
[{oxscript add=$d3_ga4_view_search_result}]
[{/if}]
[{/block}]

View File

@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.11.0](https://git.d3data.de/D3Public/GoogleAnalytics4/compare/1.10.0...1.11.0) - 2023-08-16
### Added
- remove_from_cart
- auto debug_mode setter
- manufacturer extension for breadcrumb
### Changed
- general template cleanup
## [1.10.0](https://git.d3data.de/D3Public/GoogleAnalytics4/compare/1.9.0...1.10.0) - 2023-06-27 ## [1.10.0](https://git.d3data.de/D3Public/GoogleAnalytics4/compare/1.9.0...1.10.0) - 2023-06-27
### Added ### Added
- Following Entries to dedicated event-templates - Following Entries to dedicated event-templates

View File

@ -23,6 +23,10 @@ Für den geregelten Ablauf sind folgende Blöcke nötig:
- Blockname: details_productmain_tobasket - Blockname: details_productmain_tobasket
- Datei: page/details/inc/productmain.tpl - Datei: page/details/inc/productmain.tpl
- GA4 Event: add_to_cart - GA4 Event: add_to_cart
- aus dem WK entfernen
- Blockname: checkout_basket_main
- Datei: page/checkout/basket.tpl
- GA4 Event: remove_from_cart
- Warenkorb - Warenkorb
- Blockname: checkout_basket_main - Blockname: checkout_basket_main
- Datei: page/checkout/basket.tpl - Datei: page/checkout/basket.tpl
@ -65,4 +69,12 @@ Aktivieren Sie anschließend diese Weiche. Setzen Sie den Haken bei "Eigenen Coo
- [OXID Cookie Management powered by usercentrics](https://docs.oxid-esales.com/modules/usercentrics/de/latest/einfuehrung.html) - [OXID Cookie Management powered by usercentrics](https://docs.oxid-esales.com/modules/usercentrics/de/latest/einfuehrung.html)
- In der Usercentrics-Verwaltung die Services "Google Analytics" und "Google Tag Manager" anlegen - In der Usercentrics-Verwaltung die Services "Google Analytics" und "Google Tag Manager" anlegen
- Den Service ```Google Tag Manager``` in den Moduleinstellungen des 'Google Analytics 4' unter - Den Service ```Google Tag Manager``` in den Moduleinstellungen des 'Google Analytics 4' unter
```Einstell. > Cookie Manager Einstellungen > Cookie-ID``` eintragen Google Tag Manager eintragen
-
- [Consent Management Provider](https://www.consentmanager.net/)
- In der Consentmanager-Oberfläche den Anbieter "Google Tag Manager" mit der ID s905 hinzufügen
- Im Frontend, im consentmanager-Pop-up nach dem 'Google Tag Manager' suchen
- kleines Fragezeichen neben den Namen anklicken und ganz runter scrollen
- prüfen, ob ein Cookie vorgegeben ist
- sonst, in der Consentmanager-Oberfläche Cookie-Liste entsprechendes Cookie suchen und im Admin unter
```Einstell. > Cookie Manager Einstellungen > Cookie-ID``` eintragen

View File

@ -20,4 +20,9 @@ namespace D3\GoogleAnalytics4\Modules\Core{
namespace D3\GoogleAnalytics4\Modules\Application\Model{ namespace D3\GoogleAnalytics4\Modules\Application\Model{
class Category_parent extends \OxidEsales\Eshop\Application\Model\Category {} class Category_parent extends \OxidEsales\Eshop\Application\Model\Category {}
class Basket_parent extends \OxidEsales\Eshop\Application\Model\Basket {} class Basket_parent extends \OxidEsales\Eshop\Application\Model\Basket {}
}
namespace D3\GoogleAnalytics4\Modules\Application\Controller{
class BasketController_parent extends \OxidEsales\Eshop\Application\Controller\BasketController {}
class ThankYouController_parent extends \OxidEsales\Eshop\Application\Controller\ThankYouController {}
} }

View File

@ -0,0 +1,103 @@
<?php
namespace D3\GoogleAnalytics4\Modules\Application\Controller;
use OxidEsales\Eshop\Application\Component\BasketComponent;
use OxidEsales\Eshop\Application\Model\Article;
use OxidEsales\Eshop\Application\Model\ArticleList;
use OxidEsales\Eshop\Core\Registry;
use oxSystemComponentException;
class BasketController extends BasketController_parent
{
/**
* @throws oxSystemComponentException
*/
public function render()
{
$return = parent::render();
$this->d3GA4getRemovedArticlesListObject();
return $return;
}
/**
* @return void
* @throws oxSystemComponentException
*/
public function d3GA4getRemovedArticlesListObject() :void
{
$this->addTplParam('hasBeenReloaded', false);
// collecting items to add
$aProducts = Registry::getRequest()->getRequestEscapedParameter('aproducts');
// collecting specified item
$sProductId = $sProductId ?? Registry::getRequest()->getRequestEscapedParameter('aid');
if ($sProductId) {
// additionally fetching current product info
$dAmount = $dAmount ?? Registry::getRequest()->getRequestEscapedParameter('am');
// select lists
$aSel = $aSel ?? Registry::getRequest()->getRequestEscapedParameter('sel');
// persistent parameters
if (empty($aPersParam)) {
/** @var BasketComponent $oBasketComponent */
$oBasketComponent = $this->getComponent('oxcmp_basket');
$aPersParam = $oBasketComponent->__call('getPersistedParameters', []);
}
$sBasketItemId = Registry::getRequest()->getRequestEscapedParameter('bindex');
$aProducts[$sProductId] = ['am' => $dAmount,
'sel' => $aSel,
'persparam' => $aPersParam,
'basketitemid' => $sBasketItemId
];
}
if (is_array($aProducts) && count($aProducts)) {
$toRemoveArticleIdList = [];
$artIdOnArtAmountList = [];
if (Registry::getRequest()->getRequestEscapedParameter('removeBtn') !== null
or Registry::getRequest()->getRequestParameter('updateBtn') !== null) {
//setting amount to 0 if removing article from basket
foreach ($aProducts as $sProductId => $aProduct) {
if ((isset($aProduct['remove']) && $aProduct['remove']) or intval($aProduct['am']) === 0) {
if (!in_array($aProduct, $toRemoveArticleIdList)) {
$toRemoveArticleIdList[] = $aProduct['aid'];
$artIdOnArtAmountList[$aProduct['aid']] = $aProduct['am'];
}
$aProducts[$sProductId]['am'] = 0;
#for GA4 Event
$this->addTplParam('hasBeenReloaded', true);
} else {
unset($aProducts[$sProductId]);
}
}
}
$oArtList = oxNew(ArticleList::class);
$oArtList->loadIds($toRemoveArticleIdList);
#dumpVar($this->getBasketArticles());
/** @var Article $item */
foreach ($oArtList->getArray() as $item){
foreach ($artIdOnArtAmountList as $artId => $artAmount){
if ($item->getId() === $artId){
$item->assign(['d3AmountThatGotRemoved' => $artAmount]);
}
}
}
$this->addTplParam('toRemoveArticles', $oArtList);
}
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace D3\GoogleAnalytics4\Modules\Application\Controller;
use OxidEsales\Eshop\Application\Model\Country;
class ThankYouController extends ThankYouController_parent
{
/**
* @return Country
*/
public function d3GAGetUserCountry()
{
$sCountryId = $this->getOrder()->getFieldData('oxbillcountryid');
/** @var Country $oCountry */
$oCountry = oxNew(Country::class);
$oCountry->load($sCountryId);
return $oCountry;
}
}

View File

@ -0,0 +1,44 @@
<?php
namespace D3\GoogleAnalytics4\Modules\Application\Model;
class Manufacturer extends Manufacturer_parent
{
/**
* @param int $indexOfArray
* @return string
*/
public function getSplitCategoryArray(int $indexOfArray = -1) :string
{
if ($indexOfArray > -1){
$splitCatArray =
array_values(
array_filter(
explode(
'/',
trim(
parse_url(
$this->getLink(),
5
)
)
)
)
);
if ($splitCatArray[$indexOfArray]){
return $splitCatArray[$indexOfArray];
}else{
return "";
}
}
return
trim(
parse_url(
$this->getLink(),
5
)
);
}
}

View File

@ -195,6 +195,11 @@ class ViewConfig extends ViewConfig_parent
return json_encode([$dataLayer], JSON_PRETTY_PRINT); return json_encode([$dataLayer], JSON_PRETTY_PRINT);
} }
public function isDebugModeOn() :bool
{
return Registry::getConfig()->getConfigParam('d3_gtm_blEnableDebug');
}
public function isPromotionList($listId) public function isPromotionList($listId)
{ {
$oConfig = Registry::getConfig(); $oConfig = Registry::getConfig();

View File

@ -1,10 +1,15 @@
<?php <?php
use D3\GoogleAnalytics4\Modules\Application\Controller\BasketController;
use D3\GoogleAnalytics4\Modules\Application\Controller\ThankYouController;
use D3\GoogleAnalytics4\Modules\Application\Model\Basket as Basket; use D3\GoogleAnalytics4\Modules\Application\Model\Basket as Basket;
use D3\GoogleAnalytics4\Modules\Application\Model\Category as Category; use D3\GoogleAnalytics4\Modules\Application\Model\Category as Category;
use D3\GoogleAnalytics4\Modules\Core\ViewConfig; use D3\GoogleAnalytics4\Modules\Core\ViewConfig;
use OxidEsales\Eshop\Application\Controller\BasketController as OEBasketController;
use OxidEsales\Eshop\Application\Controller\ThankYouController as OEThankYouController;
use OxidEsales\Eshop\Application\Model\Basket as OEBasket; use OxidEsales\Eshop\Application\Model\Basket as OEBasket;
use OxidEsales\Eshop\Application\Model\Category as OECategory; use OxidEsales\Eshop\Application\Model\Category as OECategory;
use OxidEsales\Eshop\Application\Model\Manufacturer as OEManufacturer;
use OxidEsales\Eshop\Core\ViewConfig as OEViewConfig; use OxidEsales\Eshop\Core\ViewConfig as OEViewConfig;
$sMetadataVersion = '2.1'; $sMetadataVersion = '2.1';
@ -22,14 +27,17 @@ $aModule = [
Die Entwicklung basiert auf einem Fork von Marat Bedoev - <a href='https://github.com/vanilla-thunder/oxid-module-gtm'>Github-Link</a> Die Entwicklung basiert auf einem Fork von Marat Bedoev - <a href='https://github.com/vanilla-thunder/oxid-module-gtm'>Github-Link</a>
", ",
'thumbnail' => 'thumbnail.png', 'thumbnail' => 'thumbnail.png',
'version' => '1.10.0', 'version' => '1.11.0',
'author' => 'Data Development (Inh.: Thomas Dartsch)', 'author' => 'Data Development (Inh.: Thomas Dartsch)',
'email' => 'support@shopmodule.com', 'email' => 'support@shopmodule.com',
'url' => 'https://www.oxidmodule.com/', 'url' => 'https://www.oxidmodule.com/',
'extend' => [ 'extend' => [
OEViewConfig::class => ViewConfig::class, OEViewConfig::class => ViewConfig::class,
OECategory::class => Category::class, OECategory::class => Category::class,
OEBasket::class => Basket::class OEBasket::class => Basket::class,
OEBasketController::class => BasketController::class,
OEManufacturer::class => Manufacturer::class,
OEThankYouController::class => ThankYouController::class
], ],
'templates' => [], 'templates' => [],
'blocks' => [ 'blocks' => [
@ -85,6 +93,13 @@ $aModule = [
'block' => 'details_productmain_tobasket', 'block' => 'details_productmain_tobasket',
'file' => '/Application/views/ga4/add_to_cart.tpl', 'file' => '/Application/views/ga4/add_to_cart.tpl',
'position' => 150 'position' => 150
],
// remove_from_cart
[
'template' => 'page/checkout/basket.tpl',
'block' => 'checkout_basket_main',
'file' => '/Application/views/ga4/remove_from_cart.tpl',
'position' => 150
] ]
], ],
'settings' => [ 'settings' => [