diff --git a/Application/views/blocks/add_payment_info.tpl b/Application/views/blocks/add_payment_info.tpl new file mode 100644 index 0000000..e6a2f18 --- /dev/null +++ b/Application/views/blocks/add_payment_info.tpl @@ -0,0 +1,3 @@ +[{$smarty.block.parent}] + +[{include file="event/add_payment_info.tpl"}] \ No newline at end of file diff --git a/Application/views/event/add_payment_info.tpl b/Application/views/event/add_payment_info.tpl index e69de29..f79bddb 100644 --- a/Application/views/event/add_payment_info.tpl +++ b/Application/views/event/add_payment_info.tpl @@ -0,0 +1,53 @@ +[{*$oxcmp_basket|get_class_methods|dumpvar*}] + +[{assign var="gtmBasketPrice" value=$oxcmp_basket->getPrice()}] +[{assign var="gtmBasketObject" value=$oxcmp_basket}] +[{assign var='gtmCartArticles' value=$gtmBasketObject->getBasketArticles()}] +[{assign var="gtmPaymentObject" value=$oView->getPayment()}] + +[{block name="gtm_ga4_add_payment_info_block"}] + [{capture name="gtm_ga4_add_payment_info"}] + [{strip}] + dataLayer.push({"event": null, "eventLabel": null, "ecommerce": null}); /* Clear the previous ecommerce object. */ + dataLayer.push({ + 'event': 'add_payment_info', + 'eventLabel':'Checkout - Payment info', + 'payment_type':'[{$gtmPaymentObject->gtmGetSelectedPaymentName()}]', + 'ecommerce': + { + 'actionField': "Payment-Info", + 'currency': "[{$currency->name}]", + 'value': [{$gtmBasketPrice->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="gtmItemPriceObject" 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, true)}]', + 'item_category_2': '[{$gtmBasketItemCategory->getSplitCategoryArray(1, true)}]', + 'item_category_3': '[{$gtmBasketItemCategory->getSplitCategoryArray(2, true)}]', + 'item_category_4': '[{$gtmBasketItemCategory->getSplitCategoryArray(3, true)}]', + 'item_list_name': '[{$gtmBasketItemCategory->getSplitCategoryArray()}]', + [{/if}] + 'price': [{$gtmItemPriceObject->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}] + ] + }[{if $oViewConf->isDebugModeOn()}], + 'debug_mode': 'true' + [{/if}] + }); + [{/strip}] + [{/capture}] + [{oxscript add=$smarty.capture.gtm_ga4_add_payment_info}] + [{/block}] \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ee449a..d98d45d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [2.20.0](https://git.d3data.de/D3Public/GoogleAnalytics4/compare/2.19.0...2.20.0) - 2024-08-20 ### Added - new event "begin_checkout" +- new event "add_payment_info" ## [2.19.0](https://git.d3data.de/D3Public/GoogleAnalytics4/compare/2.18.2...2.19.0) - 2024-08-10 ### Fixed diff --git a/IntelliSenseHelper.php b/IntelliSenseHelper.php index 4666e9e..5b71e72 100644 --- a/IntelliSenseHelper.php +++ b/IntelliSenseHelper.php @@ -18,9 +18,14 @@ namespace D3\GoogleAnalytics4\Modules\Core{ } namespace D3\GoogleAnalytics4\Modules\Application\Model{ + + use OxidEsales\Eshop\Application\Model\Payment; + class Category_parent extends \OxidEsales\Eshop\Application\Model\Category {} class Basket_parent extends \OxidEsales\Eshop\Application\Model\Basket {} class Manufacturer_parent extends \OxidEsales\Eshop\Application\Model\Manufacturer {} + + class gtmPayment_parent extends Payment {} } namespace D3\GoogleAnalytics4\Modules\Application\Controller{ diff --git a/Modules/Application/Model/gtmPayment.php b/Modules/Application/Model/gtmPayment.php new file mode 100644 index 0000000..b2baa61 --- /dev/null +++ b/Modules/Application/Model/gtmPayment.php @@ -0,0 +1,20 @@ +getFieldData('oxpayments__oxdesc')?: 'No payment name available'; + } +} \ No newline at end of file diff --git a/metadata.php b/metadata.php index b1cfeb3..aeced8b 100755 --- a/metadata.php +++ b/metadata.php @@ -16,6 +16,7 @@ use D3\GoogleAnalytics4\Modules\Application\Controller\d3GtmStartController; use D3\GoogleAnalytics4\Modules\Application\Controller\ThankYouController; use D3\GoogleAnalytics4\Modules\Application\Model\Basket as Basket; use D3\GoogleAnalytics4\Modules\Application\Model\Category as Category; +use D3\GoogleAnalytics4\Modules\Application\Model\gtmPayment as gtmPayment; use D3\GoogleAnalytics4\Modules\Application\Model\Manufacturer as Manufacturer; use D3\GoogleAnalytics4\Modules\Core\ViewConfig; use OxidEsales\Eshop\Application\Component\BasketComponent as OEBasketComponent; @@ -33,12 +34,13 @@ use OxidEsales\Eshop\Application\Controller\ThankYouController as OEThankYouCont 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\Application\Model\Payment as OEPayment; use OxidEsales\Eshop\Core\ViewConfig as OEViewConfig; $sMetadataVersion = '2.1'; -$aModule = [ - 'id' => Constants::OXID_MODULE_ID, - 'title' => 'Google Analytics 4', +$aModule = [ + 'id' => Constants::OXID_MODULE_ID, + 'title' => 'Google Analytics 4', 'description' => "Dieses Modul bietet die Möglichkeit in Ihrem OXID eShop (6.x) die neue 'Property' Google Analytics 4 (GA4) von Google zu integrieren.
Hierfür stehen Ihnen verschiedene 'templates' zur verfügung, @@ -49,144 +51,155 @@ $aModule = [
Die Entwicklung basiert auf einem Fork von Marat Bedoev - Github-Link ", - 'thumbnail' => 'thumbnail.png', - 'version' => 'DEV-2.20.0', - 'author' => 'Data Development (Inh.: Thomas Dartsch)', - 'email' => 'support@shopmodule.com', - 'url' => 'https://www.oxidmodule.com/', + 'thumbnail' => 'thumbnail.png', + 'version' => 'DEV-2.20.0', + 'author' => 'Data Development (Inh.: Thomas Dartsch)', + 'email' => 'support@shopmodule.com', + 'url' => 'https://www.oxidmodule.com/', 'controllers' => [ 'd3googleanalytics4_main' => GA4AdminUserInterfaceMainController::class ], - 'extend' => [ + 'extend' => [ // Core - OEViewConfig::class => ViewConfig::class, + OEViewConfig::class => ViewConfig::class, // Model - OECategory::class => Category::class, - OEBasket::class => Basket::class, - OEManufacturer::class => Manufacturer::class, + OECategory::class => Category::class, + OEBasket::class => Basket::class, + OEManufacturer::class => Manufacturer::class, + OEPayment::class => gtmPayment::class, // Controller - OEBasketController::class => BasketController::class, - OEThankYouController::class => ThankYouController::class, - OEArticleListController::class => ArticleListController_AddToCartHelpMethods::class, - OEArticleDetailsController::class => ArticleDetailsController::class, - OEAccountNoticeListController::class => d3GtmAccountNoticeListController::class, - OEAccountRecommlistController::class => d3GtmAccountRecommlistController::class, - OEAccountWishlistController::class => d3GtmAccountWishlistController::class, - OEStartController::class => d3GtmStartController::class, - OESearchController::class => d3GtmSearchController::class, - OEManufacturerListController::class => d3GtmManufacturerListController::class, + OEBasketController::class => BasketController::class, + OEThankYouController::class => ThankYouController::class, + OEArticleListController::class => ArticleListController_AddToCartHelpMethods::class, + OEArticleDetailsController::class => ArticleDetailsController::class, + OEAccountNoticeListController::class => d3GtmAccountNoticeListController::class, + OEAccountRecommlistController::class => d3GtmAccountRecommlistController::class, + OEAccountWishlistController::class => d3GtmAccountWishlistController::class, + OEStartController::class => d3GtmStartController::class, + OESearchController::class => d3GtmSearchController::class, + OEManufacturerListController::class => d3GtmManufacturerListController::class, // Component - OEArticleDetails::class => d3GtmWidgetArticleDetails::class, - OEBasketComponent::class => d3GtmBasketComponentExtension::class, + OEArticleDetails::class => d3GtmWidgetArticleDetails::class, + OEBasketComponent::class => d3GtmBasketComponentExtension::class, ], - 'templates' => [ + 'templates' => [ // Event files that store the GA4 Event-Information - 'event/add_to_cart.tpl' => 'd3/googleanalytics4/Application/views/event/add_to_cart.tpl', - 'event/view_item.tpl' => 'd3/googleanalytics4/Application/views/event/view_item.tpl', - 'event/view_item.tpl' => 'd3/googleanalytics4/Application/views/event/view_item.tpl', - 'event/begin_checkout.tpl' => 'd3/googleanalytics4/Application/views/event/begin_checkout.tpl', - 'event/purchase.tpl' => 'd3/googleanalytics4/Application/views/event/purchase.tpl', - 'event/view_item_list.tpl' => 'd3/googleanalytics4/Application/views/event/view_item_list.tpl', - 'event/view_search_result.tpl' => 'd3/googleanalytics4/Application/views/event/view_search_result.tpl', - 'event/remove_from_cart.tpl' => 'd3/googleanalytics4/Application/views/event/remove_from_cart.tpl', + 'event/add_to_cart.tpl' => 'd3/googleanalytics4/Application/views/event/add_to_cart.tpl', + 'event/view_item.tpl' => 'd3/googleanalytics4/Application/views/event/view_item.tpl', + 'event/view_item.tpl' => 'd3/googleanalytics4/Application/views/event/view_item.tpl', + 'event/begin_checkout.tpl' => 'd3/googleanalytics4/Application/views/event/begin_checkout.tpl', + 'event/add_payment_info.tpl' => 'd3/googleanalytics4/Application/views/event/add_payment_info.tpl', + 'event/purchase.tpl' => 'd3/googleanalytics4/Application/views/event/purchase.tpl', + 'event/view_item_list.tpl' => 'd3/googleanalytics4/Application/views/event/view_item_list.tpl', + 'event/view_search_result.tpl' => 'd3/googleanalytics4/Application/views/event/view_search_result.tpl', + 'event/remove_from_cart.tpl' => 'd3/googleanalytics4/Application/views/event/remove_from_cart.tpl', // complete overwritten file of OXID-Originals // the path of the template-name is the original path to the file in OXID-context from tpl/-> - 'page/account/d3gtmnoticelist.tpl' => 'd3/googleanalytics4/Application/views/tpl/page/account/d3gtmnoticelist.tpl', - 'page/account/d3gtmrecommendationlist.tpl' => 'd3/googleanalytics4/Application/views/tpl/page/account/d3gtmrecommendationlist.tpl', - 'page/account/d3gtmwishlist.tpl' => 'd3/googleanalytics4/Application/views/tpl/page/account/d3gtmwishlist.tpl', + 'page/account/d3gtmnoticelist.tpl' => 'd3/googleanalytics4/Application/views/tpl/page/account/d3gtmnoticelist.tpl', + 'page/account/d3gtmrecommendationlist.tpl' => 'd3/googleanalytics4/Application/views/tpl/page/account/d3gtmrecommendationlist.tpl', + 'page/account/d3gtmwishlist.tpl' => 'd3/googleanalytics4/Application/views/tpl/page/account/d3gtmwishlist.tpl', // Admin Templates - 'ga4/admin/d3ga4uimain.tpl' => 'd3/googleanalytics4/Application/views/admin/tpl/d3googleanalytics4_main.tpl', - 'ga4/admin/d3ga4uiheaditem.tpl' => 'd3/googleanalytics4/Application/views/admin/tpl/d3googleanalytics4_headitem.tpl', + 'ga4/admin/d3ga4uimain.tpl' => 'd3/googleanalytics4/Application/views/admin/tpl/d3googleanalytics4_main.tpl', + 'ga4/admin/d3ga4uiheaditem.tpl' => 'd3/googleanalytics4/Application/views/admin/tpl/d3googleanalytics4_headitem.tpl', ], - 'blocks' => [ + 'blocks' => [ // tag manager js [ 'template' => 'layout/base.tpl', - 'block' => 'head_meta_robots', - 'file' => '/Application/views/blocks/_gtm_js.tpl', + 'block' => 'head_meta_robots', + 'file' => '/Application/views/blocks/_gtm_js.tpl', 'position' => 150 ], // tag manager nojs [ 'template' => 'layout/base.tpl', - 'block' => 'theme_svg_icons', - 'file' => '/Application/views/blocks/_gtm_nojs.tpl' + 'block' => 'theme_svg_icons', + 'file' => '/Application/views/blocks/_gtm_nojs.tpl' ], // details [ 'template' => 'page/details/inc/productmain.tpl', - 'block' => 'details_productmain_title', - 'file' => '/Application/views/blocks/view_item.tpl', + 'block' => 'details_productmain_title', + 'file' => '/Application/views/blocks/view_item.tpl', 'position' => 150 ], // View Cart [ 'template' => 'page/checkout/basket.tpl', - 'block' => 'checkout_basket_main', - 'file' => '/Application/views/blocks/view_cart.tpl' + 'block' => 'checkout_basket_main', + 'file' => '/Application/views/blocks/view_cart.tpl' ], // add_to_cart [ 'template' => 'page/details/inc/productmain.tpl', - 'block' => 'details_productmain_tobasket', - 'file' => '/Application/views/blocks/details_productmain_tobasket.tpl', + 'block' => 'details_productmain_tobasket', + 'file' => '/Application/views/blocks/details_productmain_tobasket.tpl', 'position' => 150 ], // remove_from_cart [ 'template' => 'page/checkout/basket.tpl', - 'block' => 'checkout_basket_main', - 'file' => '/Application/views/blocks/remove_from_cart.tpl', + 'block' => 'checkout_basket_main', + 'file' => '/Application/views/blocks/remove_from_cart.tpl', 'position' => 150 ], [ 'template' => 'page/checkout/thankyou.tpl', - 'block' => 'checkout_thankyou_main', - 'file' => '/Application/views/blocks/purchase.tpl' + 'block' => 'checkout_thankyou_main', + 'file' => '/Application/views/blocks/purchase.tpl' ], // Lists // view_item_list [ 'template' => 'page/list/list.tpl', - 'block' => 'page_list_productlist', - 'file' => '/Application/views/blocks/view_item_list.tpl', + 'block' => 'page_list_productlist', + 'file' => '/Application/views/blocks/view_item_list.tpl', 'position' => 150 ], // view_search_result [ 'template' => 'page/search/search.tpl', - 'block' => 'search_results', - 'file' => '/Application/views/blocks/view_search_result.tpl', + 'block' => 'search_results', + 'file' => '/Application/views/blocks/view_search_result.tpl', 'position' => 150 ], [ 'template' => 'page/list/list.tpl', - 'block' => 'page_list_listbody', - 'file' => '/Application/views/blocks/page_list_listbody.tpl', + 'block' => 'page_list_listbody', + 'file' => '/Application/views/blocks/page_list_listbody.tpl', 'position' => 150 ], [ 'template' => 'page/shop/start.tpl', - 'block' => 'start_welcome_text', - 'file' => '/Application/views/blocks/start_welcome_text.tpl', + 'block' => 'start_welcome_text', + 'file' => '/Application/views/blocks/start_welcome_text.tpl', 'position' => 150 ], // Checkout process // Begin CHeckout [ 'template' => 'page/checkout/user.tpl', - 'block' => 'checkout_user_main', - 'file' => '/Application/views/blocks/begin_checkout.tpl', + 'block' => 'checkout_user_main', + 'file' => '/Application/views/blocks/begin_checkout.tpl', + 'position' => 150 + ], + // Add payment info + // We add it into checkout_order_main ( checkout/order.tpl ) to make sure a payment is actually added; + // we'll also do it like that in the future for add_shipping_info ( not planed yet ) + [ + 'template' => 'page/checkout/order.tpl', + 'block' => 'checkout_order_main', + 'file' => '/Application/views/blocks/add_payment_info.tpl', 'position' => 150 ], ], - 'events' => [ - 'onActivate' => '\D3\GoogleAnalytics4\Setup\Events::onActivate', - 'onDeactivate' => '\D3\GoogleAnalytics4\Setup\Events::onDeactivate', + 'events' => [ + 'onActivate' => '\D3\GoogleAnalytics4\Setup\Events::onActivate', + 'onDeactivate' => '\D3\GoogleAnalytics4\Setup\Events::onDeactivate', ], ]; \ No newline at end of file