From 22bec306213133bbbda1ecb2829df4f5884beeeb Mon Sep 17 00:00:00 2001 From: MaxBUhe Date: Thu, 3 Aug 2023 14:57:26 +0200 Subject: [PATCH 01/11] add remove_from_cart --- Application/views/ga4/remove_from_cart.tpl | 44 ++++++++ IntelliSenseHelper.php | 4 + .../Controller/BasketController.php | 103 ++++++++++++++++++ metadata.php | 12 +- 4 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 Application/views/ga4/remove_from_cart.tpl create mode 100644 Modules/Application/Controller/BasketController.php diff --git a/Application/views/ga4/remove_from_cart.tpl b/Application/views/ga4/remove_from_cart.tpl new file mode 100644 index 0000000..39460d6 --- /dev/null +++ b/Application/views/ga4/remove_from_cart.tpl @@ -0,0 +1,44 @@ +[{$smarty.block.parent}] + +[{assign var="d3BasketPrice" value=$oxcmp_basket->getPrice()}] + +[{if $hasBeenReloaded}] + [{strip}] + [{capture assign=d3_ga4_view_cart}] + dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ + dataLayer.push({ + '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}] + ] + } + }); + [{/capture}] + [{/strip}] + [{oxscript add=$d3_ga4_view_cart}] +[{/if}] \ No newline at end of file diff --git a/IntelliSenseHelper.php b/IntelliSenseHelper.php index 2291ade..f8ac44a 100644 --- a/IntelliSenseHelper.php +++ b/IntelliSenseHelper.php @@ -20,4 +20,8 @@ namespace D3\GoogleAnalytics4\Modules\Core{ namespace D3\GoogleAnalytics4\Modules\Application\Model{ class Category_parent extends \OxidEsales\Eshop\Application\Model\Category {} class Basket_parent extends \OxidEsales\Eshop\Application\Model\Basket {} +} + +namespace D3\GoogleAnalytics4\Modules\Application\Controller{ + class BasketController_parent extends \OxidEsales\Eshop\Application\Controller\BasketController {} } \ No newline at end of file diff --git a/Modules/Application/Controller/BasketController.php b/Modules/Application/Controller/BasketController.php new file mode 100644 index 0000000..511f151 --- /dev/null +++ b/Modules/Application/Controller/BasketController.php @@ -0,0 +1,103 @@ +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); + } + } +} \ No newline at end of file diff --git a/metadata.php b/metadata.php index 4cdb6da..846efe9 100755 --- a/metadata.php +++ b/metadata.php @@ -1,8 +1,10 @@ [ OEViewConfig::class => ViewConfig::class, OECategory::class => Category::class, - OEBasket::class => Basket::class + OEBasket::class => Basket::class, + OEBasketController::class => BasketController::class ], 'templates' => [], 'blocks' => [ @@ -85,6 +88,13 @@ $aModule = [ 'block' => 'details_productmain_tobasket', 'file' => '/Application/views/ga4/add_to_cart.tpl', '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' => [ From c0206f741f97a1baddf23627c7108e5d6ac6173b Mon Sep 17 00:00:00 2001 From: MaxBUhe Date: Thu, 3 Aug 2023 15:09:12 +0200 Subject: [PATCH 02/11] add missing param to check if isRemoveFromCart --- Application/views/ga4/remove_from_cart.tpl | 1 + 1 file changed, 1 insertion(+) diff --git a/Application/views/ga4/remove_from_cart.tpl b/Application/views/ga4/remove_from_cart.tpl index 39460d6..8f3e61e 100644 --- a/Application/views/ga4/remove_from_cart.tpl +++ b/Application/views/ga4/remove_from_cart.tpl @@ -7,6 +7,7 @@ [{capture assign=d3_ga4_view_cart}] 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': { From 71b743ddcc0c70dfd75885dade56abe80300c7c0 Mon Sep 17 00:00:00 2001 From: MaxBUhe Date: Thu, 3 Aug 2023 15:10:38 +0200 Subject: [PATCH 03/11] bump changelog && version to 2.10.1 --- CHANGELOG.md | 4 ++++ metadata.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f004a60..5b78f10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ 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/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.10.1](https://git.d3data.de/D3Public/GoogleAnalytics4/compare/2.10.0...2.10.1) - 2023-08-03 +### Added +- missing param to identify the event + ## [2.10.0](https://git.d3data.de/D3Public/GoogleAnalytics4/compare/2.9.2...2.10.0) - 2023-08-02 ### Added - new Event "remove_from_cart" diff --git a/metadata.php b/metadata.php index 846efe9..b0191d8 100755 --- a/metadata.php +++ b/metadata.php @@ -24,7 +24,7 @@ $aModule = [ Die Entwicklung basiert auf einem Fork von Marat Bedoev - Github-Link ", 'thumbnail' => 'thumbnail.png', - 'version' => '2.10.0', + 'version' => '2.10.1', 'author' => 'Data Development (Inh.: Thomas Dartsch)', 'email' => 'support@shopmodule.com', 'url' => 'https://www.oxidmodule.com/', From 0f15df8364252317a849370f0e1607af84005d8f Mon Sep 17 00:00:00 2001 From: MaxBUhe Date: Thu, 3 Aug 2023 15:55:07 +0200 Subject: [PATCH 04/11] [working-state] rebuilding meta structure --- Application/views/blocks/purchase.tpl | 97 ++++++++++---------- Application/views/blocks/view_cart.tpl | 78 ++++++++-------- Application/views/blocks/view_item.tpl | 57 ++++++------ Application/views/ga4/add_to_cart.tpl | 74 +++++++-------- Application/views/ga4/remove_from_cart.tpl | 19 ++-- Application/views/ga4/view_item_list.tpl | 74 +++++++-------- Application/views/ga4/view_search_result.tpl | 73 ++++++++------- 7 files changed, 246 insertions(+), 226 deletions(-) diff --git a/Application/views/blocks/purchase.tpl b/Application/views/blocks/purchase.tpl index 8cb92b8..9109d19 100644 --- a/Application/views/blocks/purchase.tpl +++ b/Application/views/blocks/purchase.tpl @@ -1,51 +1,54 @@ [{$smarty.block.parent}] -[{strip}] - -[{/strip}] + { + 'item_id': '[{$gtmBasketItem->getFieldData("oxartnum")}]', + 'item_name': '[{$gtmBasketItem->getFieldData("oxtitle")}]', + 'affiliation': '[{$gtmBasketItem->getFieldData("oxtitle")}]', + 'coupon': '[{foreach from=$gtmOrderVouchers item="gtmOrderVoucher" name="gtmOrderVoucherIteration"}][{$gtmOrderVoucher}][{if !$smarty.foreach.gtmOrderVoucherIteration.last}], [{/if}][{/foreach}]', + 'item_variant': '[{$gtmBasketItem->getFieldData("oxselvariant")}]', + [{if $gtmPurchaseItemCategory}] + 'item_category': '[{$gtmPurchaseItemCategory->getSplitCategoryArray(0)}]', + 'item_category_2': '[{$gtmPurchaseItemCategory->getSplitCategoryArray(1)}]', + 'item_category_3': '[{$gtmPurchaseItemCategory->getSplitCategoryArray(2)}]', + 'item_category_4': '[{$gtmPurchaseItemCategory->getSplitCategoryArray(3)}]', + 'item_list_name': '[{$gtmPurchaseItemCategory->getSplitCategoryArray()}]', + [{/if}] + 'price': [{$gtmPurchaseItemPriceObject->getPrice()}], + 'quantity': [{$gtmBasketItem->getFieldData("oxamount")}], + 'position': [{$smarty.foreach.gtmArticles.iteration}] + }[{if !$smarty.foreach.gtmArticles.last}],[{/if}] + [{/foreach}] + ] + } + }) + [{/strip}] + [{/capture}] + [{oxscript add=$d3_ga4_purchase}] +[{/block}] \ No newline at end of file diff --git a/Application/views/blocks/view_cart.tpl b/Application/views/blocks/view_cart.tpl index 2671fde..cffdbde 100644 --- a/Application/views/blocks/view_cart.tpl +++ b/Application/views/blocks/view_cart.tpl @@ -5,40 +5,44 @@ [{assign var="d3BasketPrice" value=$oxcmp_basket->getPrice()}] [{assign var='gtmCartArticles' value=$oView->getBasketArticles()}] -[{strip}][{capture assign=d3_ga4_view_cart}] - dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ - dataLayer.push({ - 'event': 'view_cart', - 'eventLabel':'Checkout Step 1', - '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=$oxcmp_basket->getContents() item=basketitem name=gtmCartContents key=basketindex}] - [{assign var="d3oItemPrice" value=$basketitem->getPrice()}] - [{assign var="gtmBasketItem" value=$basketitem->getArticle()}] - [{assign var="gtmBasketItemCategory" value=$gtmBasketItem->getCategory()}] - { - 'item_id': '[{$gtmCartArticles[$basketindex]->getFieldData('oxartnum')}]', - 'item_name': '[{$gtmCartArticles[$basketindex]->getFieldData('oxtitle')}]', - 'item_variant': '[{$gtmCartArticles[$basketindex]->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': [{$basketitem->getAmount()}], - 'position': [{$smarty.foreach.gtmCartContents.index}] - }[{if !$smarty.foreach.gtmCartContents.last}],[{/if}] - [{/foreach}] - ] - } - }); -[{/capture}][{/strip}] -[{oxscript add=$d3_ga4_view_cart}] \ No newline at end of file +[{block name="d3_ga4_view_cart_block"}] + [{capture assign=d3_ga4_view_cart}] + [{strip}] + dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ + dataLayer.push({ + 'event': 'view_cart', + 'eventLabel':'Checkout Step 1', + '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=$oxcmp_basket->getContents() item=basketitem name=gtmCartContents key=basketindex}] + [{assign var="d3oItemPrice" value=$basketitem->getPrice()}] + [{assign var="gtmBasketItem" value=$basketitem->getArticle()}] + [{assign var="gtmBasketItemCategory" value=$gtmBasketItem->getCategory()}] + { + 'item_id': '[{$gtmCartArticles[$basketindex]->getFieldData('oxartnum')}]', + 'item_name': '[{$gtmCartArticles[$basketindex]->getFieldData('oxtitle')}]', + 'item_variant': '[{$gtmCartArticles[$basketindex]->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': [{$basketitem->getAmount()}], + 'position': [{$smarty.foreach.gtmCartContents.index}] + }[{if !$smarty.foreach.gtmCartContents.last}],[{/if}] + [{/foreach}] + ] + } + }); + [{/strip}] + [{/capture}] + [{oxscript add=$d3_ga4_view_cart}] +[{/block}] \ No newline at end of file diff --git a/Application/views/blocks/view_item.tpl b/Application/views/blocks/view_item.tpl index 6a4e87f..720a2cc 100644 --- a/Application/views/blocks/view_item.tpl +++ b/Application/views/blocks/view_item.tpl @@ -3,31 +3,36 @@ [{assign var="gtmCategory" value=$gtmProduct->getCategory()}] [{assign var="gtmManufacturer" value=$gtmProduct->getManufacturer()}] - \ No newline at end of file + }); + [{/strip}] + [{/capture}] + [{oxscript add=$d3_ga4_view_item}] +[{/block}] \ No newline at end of file diff --git a/Application/views/ga4/add_to_cart.tpl b/Application/views/ga4/add_to_cart.tpl index 8a63023..2c76b2f 100644 --- a/Application/views/ga4/add_to_cart.tpl +++ b/Application/views/ga4/add_to_cart.tpl @@ -6,43 +6,45 @@ [{assign var="gtmManufacturer" value=$gtmProduct->getManufacturer()}] [{assign var="gtmCategory" value=$gtmProduct->getCategory()}] -[{capture assign=d3_ga4_add_to_cart}] - [{block name="d3_ga4_add_to_basket"}] - $("#toBasket").click(function(event) { - dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ +[{block name="d3_ga4_add_to_cart_block"}] + [{capture assign=d3_ga4_add_to_cart}] + [{strip}] + $("#toBasket").click(function(event) { + dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ - [{*** Debug cases ***}] - [{*event.preventDefault();*}] + [{*** Debug cases ***}] + [{*event.preventDefault();*}] - let iArtQuantity = $("#amountToBasket").val(); + let iArtQuantity = $("#amountToBasket").val(); - dataLayer.push({ - 'isAddToBasket': true, - 'event':'add_to_cart', - 'eventLabel': 'add_to_cart', - 'ecommerce': { - 'currency': "[{$currency->name}]", - 'value': iArtQuantity*[{$d3PriceObject->getPrice()}], - 'items': [ - { - 'item_id': '[{$gtmProduct->getFieldData('oxartnum')}]', - 'item_name': '[{$gtmProduct->getFieldData('oxtitle')}]', - 'price': [{$d3PriceObject->getPrice()}], - 'item_brand': '[{if $gtmManufacturer}][{$gtmManufacturer->oxmanufacturers__oxtitle->value}][{/if}]', - 'item_variant': '[{if $gtmProduct->getFieldData('oxvarselect')}][{$gtmProduct->getFieldData('oxvarselect')}][{/if}]', - [{if $gtmCategory}] - 'item_category': '[{$gtmCategory->getSplitCategoryArray(0)}]', - 'item_category_2':'[{$gtmCategory->getSplitCategoryArray(1)}]', - 'item_category_3':'[{$gtmCategory->getSplitCategoryArray(2)}]', - 'item_category_4':'[{$gtmCategory->getSplitCategoryArray(3)}]', - 'item_list_name':'[{$gtmCategory->getSplitCategoryArray()}]', - [{/if}] - 'quantity': iArtQuantity - } - ] - } - }); - }); - [{/block}] + dataLayer.push({ + 'isAddToBasket': true, + 'event':'add_to_cart', + 'eventLabel': 'add_to_cart', + 'ecommerce': { + 'currency': "[{$currency->name}]", + 'value': iArtQuantity*[{$d3PriceObject->getPrice()}], + 'items': [ + { + 'item_id': '[{$gtmProduct->getFieldData('oxartnum')}]', + 'item_name': '[{$gtmProduct->getFieldData('oxtitle')}]', + 'price': [{$d3PriceObject->getPrice()}], + 'item_brand': '[{if $gtmManufacturer}][{$gtmManufacturer->oxmanufacturers__oxtitle->value}][{/if}]', + 'item_variant': '[{if $gtmProduct->getFieldData('oxvarselect')}][{$gtmProduct->getFieldData('oxvarselect')}][{/if}]', + [{if $gtmCategory}] + 'item_category': '[{$gtmCategory->getSplitCategoryArray(0)}]', + 'item_category_2':'[{$gtmCategory->getSplitCategoryArray(1)}]', + 'item_category_3':'[{$gtmCategory->getSplitCategoryArray(2)}]', + 'item_category_4':'[{$gtmCategory->getSplitCategoryArray(3)}]', + 'item_list_name':'[{$gtmCategory->getSplitCategoryArray()}]', + [{/if}] + 'quantity': iArtQuantity + } + ] + } + }); + }); + [{/strip}] [{/capture}] -[{oxscript add=$d3_ga4_add_to_cart}] \ No newline at end of file + [{oxscript add=$d3_ga4_add_to_cart}] +[{/block}] \ No newline at end of file diff --git a/Application/views/ga4/remove_from_cart.tpl b/Application/views/ga4/remove_from_cart.tpl index 8f3e61e..5386f26 100644 --- a/Application/views/ga4/remove_from_cart.tpl +++ b/Application/views/ga4/remove_from_cart.tpl @@ -1,10 +1,10 @@ [{$smarty.block.parent}] -[{assign var="d3BasketPrice" value=$oxcmp_basket->getPrice()}] - -[{if $hasBeenReloaded}] - [{strip}] - [{capture assign=d3_ga4_view_cart}] +[{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, @@ -39,7 +39,8 @@ ] } }); - [{/capture}] - [{/strip}] - [{oxscript add=$d3_ga4_view_cart}] -[{/if}] \ No newline at end of file + [{/strip}] + [{/capture}] + [{oxscript add=$d3_ga4_remove_from_cart}] + [{/if}] +[{/block}] \ No newline at end of file diff --git a/Application/views/ga4/view_item_list.tpl b/Application/views/ga4/view_item_list.tpl index 942ad28..47b920e 100644 --- a/Application/views/ga4/view_item_list.tpl +++ b/Application/views/ga4/view_item_list.tpl @@ -4,39 +4,41 @@ [{assign var="breadCrumb" value=''}] -[{if $gtmProducts|@count}] -[{strip}] - -[{/strip}] -[{/if}] \ No newline at end of file +[{block name="d3_ga4_view_item_list_block"}] + [{if $gtmProducts|@count}] + [{capture assign=d3_ga4_view_item_list}] + [{strip}] + dataLayer.push({ecommerce: null}); + dataLayer.push({ + 'event':'view_item_list', + 'event_name': 'view_item_list', + 'ecommerce': { + 'item_list_id': '[{$oView->getCategoryId()}]', + 'item_list_name': '[{foreach from=$oView->getBreadCrumb() item=sCrum}][{if $sCrum.title }][{$breadCrumb|cat:$sCrum.title|cat:" > "}][{/if}][{/foreach}]', + 'items': [ + [{foreach from=$gtmProducts name="gtmProducts" item="gtmProduct"}] + [{assign var="d3PriceObject" value=$gtmProduct->getPrice()}] + [{assign var="gtmManufacturer" value=$gtmProduct->getManufacturer()}] + [{if !$gtmCategory}][{assign var="gtmCategory" value=$gtmProduct->getCategory()}][{/if}] + { + 'item_id': '[{$gtmProduct->getFieldData("oxartnum")}]', + 'item_name': '[{$gtmProduct->getFieldData("oxtitle")}]', + 'price': [{$d3PriceObject->getPrice()}], + 'item_brand': '[{if $gtmManufacturer}][{$gtmManufacturer->oxmanufacturers__oxtitle->value}][{/if}]', + [{if $gtmCategory}] + 'item_category': '[{$gtmCategory->getSplitCategoryArray(0)}]', + 'item_category_2':'[{$gtmCategory->getSplitCategoryArray(1)}]', + 'item_category_3':'[{$gtmCategory->getSplitCategoryArray(2)}]', + 'item_category_4':'[{$gtmCategory->getSplitCategoryArray(3)}]', + [{/if}] + 'quantity': 1 + }[{if !$smarty.foreach.gtmProducts.last}],[{/if}] + [{/foreach}] + ] + } + }); + [{/strip}] + [{/capture}] + [{oxscript add=$d3_ga4_view_item_list}] + [{/if}] +[{/block}] \ No newline at end of file diff --git a/Application/views/ga4/view_search_result.tpl b/Application/views/ga4/view_search_result.tpl index 991d682..8c9a547 100644 --- a/Application/views/ga4/view_search_result.tpl +++ b/Application/views/ga4/view_search_result.tpl @@ -2,38 +2,41 @@ [{assign var="gtmProducts" value=$oView->getArticleList()}] -[{if $gtmProducts|@count}] - [{strip}] - - [{/strip}] -[{/if}] \ No newline at end of file +[{block name="d3_ga4_add_to_cart_block"}] + [{if $gtmProducts|@count}] + [{capture assign=d3_ga4_add_to_cart}] + [{strip}] + dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ + dataLayer.push({ + 'event': 'view_search_result', + 'eventLabel':'view_search_result', + 'ecommerce': { + 'search_term': '[{$searchparamforhtml}]', + 'items': [ + [{foreach from=$gtmProducts name="gtmProducts" item="gtmProduct"}] + [{assign var="d3PriceObject" value=$gtmProduct->getPrice()}] + [{assign var="gtmManufacturer" value=$gtmProduct->getManufacturer()}] + [{assign var="gtmCategory" value=$gtmProduct->getCategory()}] + { + 'item_id': '[{$gtmProduct->getFieldData("oxartnum")}]', + 'item_name': '[{$gtmProduct->getFieldData("oxtitle")}]', + 'price': [{$d3PriceObject->getPrice()}], + 'item_brand': '[{if $gtmManufacturer}][{$gtmManufacturer->oxmanufacturers__oxtitle->value}][{/if}]', + [{if $gtmCategory}] + 'item_category': '[{$gtmCategory->getSplitCategoryArray(0)}]', + 'item_category_2':'[{$gtmCategory->getSplitCategoryArray(1)}]', + 'item_category_3':'[{$gtmCategory->getSplitCategoryArray(2)}]', + 'item_category_4':'[{$gtmCategory->getSplitCategoryArray(3)}]', + 'item_list_name':'[{$gtmCategory->getSplitCategoryArray()}]', + [{/if}] + 'quantity': 1 + }[{if !$smarty.foreach.gtmProducts.last}],[{/if}] + [{/foreach}] + ] + } + }); + [{/strip}] + [{/capture}] + [{oxscript add=$d3_ga4_add_to_cart}] + [{/if}] +[{/block}] \ No newline at end of file From 7b1241ab975fbaa13b1616f61851e6b118dce782 Mon Sep 17 00:00:00 2001 From: MaxBUhe Date: Wed, 16 Aug 2023 09:38:03 +0200 Subject: [PATCH 05/11] correct naming in view_search_result --- Application/views/ga4/view_search_result.tpl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Application/views/ga4/view_search_result.tpl b/Application/views/ga4/view_search_result.tpl index 8c9a547..326cee4 100644 --- a/Application/views/ga4/view_search_result.tpl +++ b/Application/views/ga4/view_search_result.tpl @@ -2,9 +2,9 @@ [{assign var="gtmProducts" value=$oView->getArticleList()}] -[{block name="d3_ga4_add_to_cart_block"}] +[{block name="d3_ga4_view_search_result_block"}] [{if $gtmProducts|@count}] - [{capture assign=d3_ga4_add_to_cart}] + [{capture assign=d3_ga4_view_search_result}] [{strip}] dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ dataLayer.push({ @@ -37,6 +37,6 @@ }); [{/strip}] [{/capture}] - [{oxscript add=$d3_ga4_add_to_cart}] + [{oxscript add=$d3_ga4_view_search_result}] [{/if}] [{/block}] \ No newline at end of file From 9e7b4653ea02ca4442749609a1fb6ec037c8a45f Mon Sep 17 00:00:00 2001 From: MaxBUhe Date: Wed, 16 Aug 2023 10:44:50 +0200 Subject: [PATCH 06/11] add deug_mode switch --- Application/views/blocks/purchase.tpl | 4 +++- Application/views/blocks/view_cart.tpl | 4 +++- Application/views/blocks/view_item.tpl | 4 +++- Application/views/ga4/add_to_cart.tpl | 4 +++- Application/views/ga4/remove_from_cart.tpl | 4 +++- Application/views/ga4/view_item_list.tpl | 4 +++- Application/views/ga4/view_search_result.tpl | 6 ++++-- Modules/Core/ViewConfig.php | 5 +++++ 8 files changed, 27 insertions(+), 8 deletions(-) diff --git a/Application/views/blocks/purchase.tpl b/Application/views/blocks/purchase.tpl index 9109d19..3419a43 100644 --- a/Application/views/blocks/purchase.tpl +++ b/Application/views/blocks/purchase.tpl @@ -46,7 +46,9 @@ }[{if !$smarty.foreach.gtmArticles.last}],[{/if}] [{/foreach}] ] - } + }[{if $oViewConf->isDebugModeOn()}], + 'debug_mode': 'true' + [{/if}] }) [{/strip}] [{/capture}] diff --git a/Application/views/blocks/view_cart.tpl b/Application/views/blocks/view_cart.tpl index cffdbde..765bfe8 100644 --- a/Application/views/blocks/view_cart.tpl +++ b/Application/views/blocks/view_cart.tpl @@ -40,7 +40,9 @@ }[{if !$smarty.foreach.gtmCartContents.last}],[{/if}] [{/foreach}] ] - } + }[{if $oViewConf->isDebugModeOn()}], + 'debug_mode': 'true' + [{/if}] }); [{/strip}] [{/capture}] diff --git a/Application/views/blocks/view_item.tpl b/Application/views/blocks/view_item.tpl index 720a2cc..e79852e 100644 --- a/Application/views/blocks/view_item.tpl +++ b/Application/views/blocks/view_item.tpl @@ -30,7 +30,9 @@ 'price': [{$d3PriceObject->getPrice()}] } ] - } + }[{if $oViewConf->isDebugModeOn()}], + 'debug_mode': 'true' + [{/if}] }); [{/strip}] [{/capture}] diff --git a/Application/views/ga4/add_to_cart.tpl b/Application/views/ga4/add_to_cart.tpl index 2c76b2f..8a2b68e 100644 --- a/Application/views/ga4/add_to_cart.tpl +++ b/Application/views/ga4/add_to_cart.tpl @@ -41,7 +41,9 @@ 'quantity': iArtQuantity } ] - } + }[{if $oViewConf->isDebugModeOn()}], + 'debug_mode': 'true' + [{/if}] }); }); [{/strip}] diff --git a/Application/views/ga4/remove_from_cart.tpl b/Application/views/ga4/remove_from_cart.tpl index 5386f26..8c41746 100644 --- a/Application/views/ga4/remove_from_cart.tpl +++ b/Application/views/ga4/remove_from_cart.tpl @@ -37,7 +37,9 @@ }[{if !$smarty.foreach.gtmRemovedItems.last}],[{/if}] [{/foreach}] ] - } + }[{if $oViewConf->isDebugModeOn()}], + 'debug_mode': 'true' + [{/if}] }); [{/strip}] [{/capture}] diff --git a/Application/views/ga4/view_item_list.tpl b/Application/views/ga4/view_item_list.tpl index 47b920e..78782e0 100644 --- a/Application/views/ga4/view_item_list.tpl +++ b/Application/views/ga4/view_item_list.tpl @@ -35,7 +35,9 @@ }[{if !$smarty.foreach.gtmProducts.last}],[{/if}] [{/foreach}] ] - } + }[{if $oViewConf->isDebugModeOn()}], + 'debug_mode': 'true' + [{/if}] }); [{/strip}] [{/capture}] diff --git a/Application/views/ga4/view_search_result.tpl b/Application/views/ga4/view_search_result.tpl index 326cee4..42e4c7b 100644 --- a/Application/views/ga4/view_search_result.tpl +++ b/Application/views/ga4/view_search_result.tpl @@ -9,7 +9,7 @@ dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ dataLayer.push({ 'event': 'view_search_result', - 'eventLabel':'view_search_result', + 'eventLabel':'view_search_result[{if $oViewConf->isDebugModeOn()}]_test[{/if}]', 'ecommerce': { 'search_term': '[{$searchparamforhtml}]', 'items': [ @@ -33,7 +33,9 @@ }[{if !$smarty.foreach.gtmProducts.last}],[{/if}] [{/foreach}] ] - } + }[{if $oViewConf->isDebugModeOn()}], + 'debug_mode': 'true' + [{/if}] }); [{/strip}] [{/capture}] diff --git a/Modules/Core/ViewConfig.php b/Modules/Core/ViewConfig.php index b40c232..0f96b8e 100644 --- a/Modules/Core/ViewConfig.php +++ b/Modules/Core/ViewConfig.php @@ -203,6 +203,11 @@ class ViewConfig extends ViewConfig_parent return json_encode([$dataLayer], JSON_PRETTY_PRINT); } + public function isDebugModeOn() :bool + { + return Registry::getConfig()->getConfigParam('d3_gtm_blEnableDebug'); + } + public function isPromotionList($listId) { $oConfig = Registry::getConfig(); From 1e479503a723712fe8d39eb79e106c95a5dbd314 Mon Sep 17 00:00:00 2001 From: MaxBUhe Date: Fri, 18 Aug 2023 14:07:53 +0200 Subject: [PATCH 07/11] [changed] 'an article has been removed from basket'-check --- .../Controller/BasketController.php | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/Modules/Application/Controller/BasketController.php b/Modules/Application/Controller/BasketController.php index 511f151..8e0bdff 100644 --- a/Modules/Application/Controller/BasketController.php +++ b/Modules/Application/Controller/BasketController.php @@ -52,7 +52,8 @@ class BasketController extends BasketController_parent $sBasketItemId = Registry::getRequest()->getRequestEscapedParameter('bindex'); - $aProducts[$sProductId] = ['am' => $dAmount, + $aProducts[$sProductId] = [ + 'am' => $dAmount, 'sel' => $aSel, 'persparam' => $aPersParam, 'basketitemid' => $sBasketItemId @@ -63,9 +64,7 @@ class BasketController extends BasketController_parent $toRemoveArticleIdList = []; $artIdOnArtAmountList = []; - if (Registry::getRequest()->getRequestEscapedParameter('removeBtn') !== null - or Registry::getRequest()->getRequestParameter('updateBtn') !== null) { - + if ($this->isArticleRemovedState($aProducts)) { //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) { @@ -100,4 +99,29 @@ class BasketController extends BasketController_parent $this->addTplParam('toRemoveArticles', $oArtList); } } + + /** + * @return bool + * + * checks, if we're in the short state of "an Article has been removed" + * We check by looking for the "'removeBtn' is not null", as a sign for it has been triggered/ clicked + * if that doesn't work, we check if there's an Article in the Products array, that has "'am' = 0" + * Which also shows we're in that state rn + */ + protected function isArticleRemovedState(array $productsArray) :bool + { + if (Registry::getRequest()->getRequestEscapedParameter('removeBtn') + or Registry::getRequest()->getRequestEscapedParameter('updateBtn') + ){ + return true; + }else{ + foreach ($productsArray as $aProduct) { + if (intval($aProduct['am']) === 0) { + return true; + } + } + } + + return false; + } } \ No newline at end of file From 84e3895db8b7f0e50e7f9a51b395f216b796a0e3 Mon Sep 17 00:00:00 2001 From: MarkusGaertner Date: Tue, 15 Aug 2023 11:52:46 +0200 Subject: [PATCH 08/11] extend Manufacturer --- Modules/Application/Model/Manufacturer.php | 44 ++++++++++++++++++++++ metadata.php | 3 ++ 2 files changed, 47 insertions(+) create mode 100644 Modules/Application/Model/Manufacturer.php diff --git a/Modules/Application/Model/Manufacturer.php b/Modules/Application/Model/Manufacturer.php new file mode 100644 index 0000000..8ecae9a --- /dev/null +++ b/Modules/Application/Model/Manufacturer.php @@ -0,0 +1,44 @@ + -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 + ) + ); + } +} \ No newline at end of file diff --git a/metadata.php b/metadata.php index b0191d8..d942312 100755 --- a/metadata.php +++ b/metadata.php @@ -3,10 +3,12 @@ use D3\GoogleAnalytics4\Modules\Application\Controller\BasketController; use D3\GoogleAnalytics4\Modules\Application\Model\Basket as Basket; use D3\GoogleAnalytics4\Modules\Application\Model\Category as Category; +use D3\GoogleAnalytics4\Modules\Application\Model\Manufacturer as Manufacturer; use D3\GoogleAnalytics4\Modules\Core\ViewConfig; use OxidEsales\Eshop\Application\Controller\BasketController as OEBasketController; use OxidEsales\Eshop\Application\Model\Basket as OEBasket; use OxidEsales\Eshop\Application\Model\Category as OECategory; +use OxidEsales\Eshop\Application\Model\Manufacturer as OEManufacturer; use OxidEsales\Eshop\Core\ViewConfig as OEViewConfig; $sMetadataVersion = '2.1'; @@ -31,6 +33,7 @@ $aModule = [ 'extend' => [ OEViewConfig::class => ViewConfig::class, OECategory::class => Category::class, + OEManufacturer::class => Manufacturer::class, OEBasket::class => Basket::class, OEBasketController::class => BasketController::class ], From 7c6b0215a52206c5cb3070398bb29212667df52a Mon Sep 17 00:00:00 2001 From: MaxBUhe Date: Wed, 23 Aug 2023 17:16:58 +0200 Subject: [PATCH 09/11] bump metadata && changelog --- CHANGELOG.md | 8 ++++++++ metadata.php | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b78f10..1bf16d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.11.0](https://git.d3data.de/D3Public/GoogleAnalytics4/compare/2.10.1...2.11.0) - 2023-08-23 +### Added +- manufacturer extension +- working debug_mode +### Changed +- check for 'article has been removed' +- general template cleanup + ## [2.10.1](https://git.d3data.de/D3Public/GoogleAnalytics4/compare/2.10.0...2.10.1) - 2023-08-03 ### Added - missing param to identify the event diff --git a/metadata.php b/metadata.php index d942312..54b809e 100755 --- a/metadata.php +++ b/metadata.php @@ -26,7 +26,7 @@ $aModule = [ Die Entwicklung basiert auf einem Fork von Marat Bedoev - Github-Link ", 'thumbnail' => 'thumbnail.png', - 'version' => '2.10.1', + 'version' => '2.11.0', 'author' => 'Data Development (Inh.: Thomas Dartsch)', 'email' => 'support@shopmodule.com', 'url' => 'https://www.oxidmodule.com/', From 565f47b1ff5136adfded6d1a8b1c98c4a75467a1 Mon Sep 17 00:00:00 2001 From: MaxBUhe Date: Thu, 7 Sep 2023 15:08:06 +0200 Subject: [PATCH 10/11] add cookiebot essentials --- Application/Model/ManagerTypes.php | 5 ++++- Application/views/admin/de/module_options.php | 1 + Modules/Core/ViewConfig.php | 5 +++++ metadata.php | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Application/Model/ManagerTypes.php b/Application/Model/ManagerTypes.php index 01c9db5..f12af76 100644 --- a/Application/Model/ManagerTypes.php +++ b/Application/Model/ManagerTypes.php @@ -36,6 +36,8 @@ class ManagerTypes const COOKIEFIRST = "COOKIEFIRST"; + const COOKIEBOT = "COOKIEBOT"; + /** * @return array */ @@ -48,7 +50,8 @@ class ManagerTypes "oxps_usercentrics" => self::USERCENTRICS_MODULE, "usercentrics" => self::USERCENTRICS_MANUALLY, "consentmanager" => self::CONSENTMANAGER, - "cookiefirst" => self::COOKIEFIRST + "cookiefirst" => self::COOKIEFIRST, + "cookiebot" => self::COOKIEBOT, ]; } diff --git a/Application/views/admin/de/module_options.php b/Application/views/admin/de/module_options.php index 76204bd..35694eb 100755 --- a/Application/views/admin/de/module_options.php +++ b/Application/views/admin/de/module_options.php @@ -43,5 +43,6 @@ $aLang = [ 'SHOP_MODULE_d3_gtm_settings_HAS_STD_MANAGER_CONSENTMANAGER' => 'consentmanager', 'SHOP_MODULE_d3_gtm_settings_HAS_STD_MANAGER_USERCENTRICS' => 'usercentrics', 'SHOP_MODULE_d3_gtm_settings_HAS_STD_MANAGER_COOKIEFIRST' => 'cookiefirst', + 'SHOP_MODULE_d3_gtm_settings_HAS_STD_MANAGER_COOKIEBOT' => 'Cookiebot', 'SHOP_MODULE_d3_gtm_settings_cookieName' => 'CookieID', ]; diff --git a/Modules/Core/ViewConfig.php b/Modules/Core/ViewConfig.php index 0f96b8e..8e22842 100644 --- a/Modules/Core/ViewConfig.php +++ b/Modules/Core/ViewConfig.php @@ -98,6 +98,7 @@ class ViewConfig extends ViewConfig_parent or $this->sCookieManagerType === ManagerTypes::USERCENTRICS_MANUALLY or $this->sCookieManagerType === ManagerTypes::CONSENTMANAGER or $this->sCookieManagerType === ManagerTypes::COOKIEFIRST + or $this->sCookieManagerType === ManagerTypes::COOKIEBOT or $this->sCookieManagerType === ManagerTypes::EXTERNAL_SERVICE ) { @@ -148,6 +149,10 @@ class ViewConfig extends ViewConfig_parent return 'type="text/plain" data-cookiefirst-category="' . $sCookieId .'"'; } + if ($this->sCookieManagerType === ManagerTypes::COOKIEBOT){ + return 'type="text/plain" data-cookieconsent="' . $sCookieId .'"'; + } + return ""; } diff --git a/metadata.php b/metadata.php index 54b809e..087e353 100755 --- a/metadata.php +++ b/metadata.php @@ -141,7 +141,7 @@ $aModule = [ 'name' => 'd3_gtm_settings_HAS_STD_MANAGER', 'type' => 'select', 'value' => 'none', - 'constraints' => 'NONE|CONSENTMANAGER|USERCENTRICS|COOKIEFIRST', + 'constraints' => 'NONE|CONSENTMANAGER|USERCENTRICS|COOKIEFIRST|COOKIEBOT', ], ] ]; \ No newline at end of file From 7d12dd68a78d0b81db161e052146233fb9c5cc1c Mon Sep 17 00:00:00 2001 From: MaxBUhe Date: Thu, 7 Sep 2023 15:11:04 +0200 Subject: [PATCH 11/11] bump metadata && changelog --- CHANGELOG.md | 4 ++++ Docs/README.md | 5 ++++- metadata.php | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bf16d0..d0dac6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ 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/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.12.0](https://git.d3data.de/D3Public/GoogleAnalytics4/compare/2.11.1...2.12.0) - 2023-09-07 +### Added +- cookiebot functionality + ## [2.11.0](https://git.d3data.de/D3Public/GoogleAnalytics4/compare/2.10.1...2.11.0) - 2023-08-23 ### Added - manufacturer extension diff --git a/Docs/README.md b/Docs/README.md index 9221f81..5cd715a 100644 --- a/Docs/README.md +++ b/Docs/README.md @@ -73,4 +73,7 @@ Aktivieren Sie anschließend diese Weiche. Setzen Sie den Haken bei "Eigenen Coo - 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 \ No newline at end of file + ```Einstell. > Cookie Manager Einstellungen > Cookie-ID``` eintragen + +- [Cookiebot](https://www.cookiebot.com) + - Nähere Informationen folgen bald! Bis dato, besuchen Sie bitte die offizielle Webseite. \ No newline at end of file diff --git a/metadata.php b/metadata.php index 087e353..bea66b4 100755 --- a/metadata.php +++ b/metadata.php @@ -26,7 +26,7 @@ $aModule = [ Die Entwicklung basiert auf einem Fork von Marat Bedoev - Github-Link ", 'thumbnail' => 'thumbnail.png', - 'version' => '2.11.0', + 'version' => '2.12.0', 'author' => 'Data Development (Inh.: Thomas Dartsch)', 'email' => 'support@shopmodule.com', 'url' => 'https://www.oxidmodule.com/',