如上篇文章所述,magento|GTM代码及谷歌电子商务代码安装说明,安装电子商务代码的时候,需要在head里面获取到订单信息。那么如何在head中获取订单id并进一步获取订单的所有信息就成为一个难题。还好系统默认集成了一个叫做Mage_GoogleAnalytics的模块,该模块默认引入位置在head里面,也原生支持analytics的输出,所以只需要在此模块上另外增加需要的方法即可。
牵扯到的文件有以下几个:
模板输出文件:app\design\frontend\base\default\template\googleanalytics\ga.phtml
默认的成功页支付方法:app\code\core\Mage\Checkout\controllers\OnepageController.php
Block传值文件:app\code\core\Mage\GoogleAnalytics\Block\Ga.php
监听方法:app\code\core\Mage\GoogleAnalytics\Model\Observer.php
监听配置:app\code\core\Mage\GoogleAnalytics\etc\config.xml
流程如下:
1、OnepageController.php的275行中的success方法,启用监听事件,传递从session里面获取的最后一个订单id,监听事件名字为checkout_onepage_controller_success_action。
Mage::dispatchEvent('checkout_onepage_controller_success_action', array('order_ids' => array($lastOrderId)));
2、app\code\core\Mage\GoogleAnalytics\etc\config.xml配置文件中定义监听侦测事件,并定义处理监听事件的observer方法
<events>
<checkout_onepage_controller_success_action>
<observers>
<googleanalytics_order_success>
<class>googleanalytics/observer</class>
<method>setGoogleAnalyticsOnOrderSuccessPageView</method>
</googleanalytics_order_success>
</observers>
</checkout_onepage_controller_success_action>
<checkout_multishipping_controller_success_action>
<observers>
<googleanalytics_order_success>
<class>googleanalytics/observer</class>
<method>setGoogleAnalyticsOnOrderSuccessPageView</method>
</googleanalytics_order_success>
</observers>
</checkout_multishipping_controller_success_action>
</events>
3、app\code\core\Mage\GoogleAnalytics\Model\Observer.php中setGoogleAnalyticsOnOrderSuccessPageView获取传递过来的订单id,并使用block的方法传递orderIds到block。
$orderIds = $observer->getEvent()->getOrderIds();
if (empty($orderIds) || !is_array($orderIds)) {
return;
}
$block = Mage::app()->getFrontController()->getAction()->getLayout()->getBlock('google_analytics');
if ($block) {
$block->setOrderIds($orderIds);
}
4、在block中获取orderIds,并根据orderId获取到订单的金额,订单号及订单中的产品每一项数据:
$orderIds = $this->getOrderIds();
5、在app\design\frontend\base\default\template\googleanalytics\ga.phtml中调用block的方法,输出电子商务统计的代码即可:
<script type="text/javascript">
dataLayer = [{
<?php echo $this->_getOrdersTrackingCodeUniversalGtm();?>
}];
</script>