跟踪Magento“添加产品到购物车”动作
最近,我一直在忙一个关于第三方客户分析和定位服务的插件,考虑替换Google分析。其中一个要被实现的电商追踪功能是“添加产品到购物车”动作。由于这种追踪服务是使用JavaScript来触发它们的追踪代码,在Magento中何时何地嵌套追踪JavaScript是由我们决定的。有趣的是,“添加产品到购物车”动作不是你想执行JavaScript就执行的普通页面。
在Magento中,当你点击任何“添加产品到购物车”页面,通常会以像http://magentoce1800.loc/index.php/checkout/cart/add/uenc/aHR0…0bWw,/product/16/form_key/oTSbNJ4ZIUC46W0R/的链接结束。其中checkout/cart/add是最有趣的一部分,由于它指向Mage_Checkout模型,它的CartController和对应的addAction()。第二个有趣的部分是product/16,它告诉Magento,ID为16的产品被添加到了购物车。此外,addAction()方法里进行了很多事情。比较重要,需要你记住的是:当Magento中addAction()方法添加产品到购物车的时候,它指向它本身的购物车页面。也就是说,实际的checkout/cart/add页面从不呈现在浏览器,所以你无法在这个页面是执行任何JavaScript。
那么,我们要从哪里开始呢?好了,Magento一个比较炫酷的功能就是定义它的事件/监听系统。如果你仔细想想,每一个控制器动作支持controller_action_predispatch事件(定义在app/code/core/Mage/Core/Controller/Varien/Action.php 527行左右)。之后一些具体的时间匹配到它的模块前端名,控制器和动作。在这里,解析为前端事件controller_action_predispatch_checkout_cart_add。
考虑到这一点,这里有了个通过JavaScript追踪“添加产品到购物车”行动的简单想法。
- 为定义controller_action_predispatch_checkout_cart_add事件定义事件监听方法;
- 在事件监听方法中,当添加产品到购物车时做个记录。例如Mage::getModel(‘core/session’)->setProductToShoppingCart(…)这样的东西。
- 写个布局更新checkout_cart_index句柄,读取一个自定义的.phtml模版文件,你可以用core/template或者你自己的模块类来定义块的类型。
- 在自定义的.phtml文件中使用Mage::getModel(‘core/session’)->getProductToShoppingCart()来生成你的“添加产品到购物车”追踪点,获取刚刚添加到购物车的产品的信息。在完成这些之后,使用Mage::getModel(‘core/session’)->unsProductToShoppingCart()清除session。
下面是代码示例:
第一步中描述的 app/code/community/Alwayly/Test/etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<Alwayly_Test>
<version>1.0.0.0</version>
</Alwayly_Test>
</modules>
<<global>
<models>
<alwayly_test>
<class>Alwayly_Test_Model</class>
</alwayly_test>
</models>
</global>
<frontend>
<layout>
<updates>
<alwayly_test>
<file>alwayly_test.xml</file>
</alwayly_test>
</updates>
</layout>
<events>
<controller_action_predispatch_checkout_cart_add>
<observers>
<alwayly_test_log_cart_add>
<class>alwayly_test/observer</class>
<method>logCartAdd</method>
</alwayly_test_log_cart_add>
</observers>
</controller_action_predispatch_checkout_cart_add>
</events>
</frontend>
</config>
第二步中描述的:app/code/community/Alwayly/Test/Model/Observer.php
<?php
class Alwayly_Test_Model_Observer
{
public function logCartAdd() {
$product = Mage::getModel('catalog/product')
->load(Mage::app()->getRequest()->getParam('product', 0));
if (!$product->getId()) {
return;
}
$categories = $product->getCategoryIds();
Mage::getModel('core/session')->setProductToShoppingCart(
new Varien_Object(array(
'id' => $product->getId(),
'qty' => Mage::app()->getRequest()->getParam('qty', 1),
'name' => $product->getName(),
'price' => $product->getPrice(),
'category_name' => Mage::getModel('catalog/category')->load($categories[0])->getName(),
))
);
}
}
很显然,上面的代码比较基础。不包括Magento各种产品类型,因为它直接从产品模块获取产品价格。所以,当有捆绑或者批量销售产品时,你需要做一点扩展。你可以用产品id引到产品表,以此来找到子产品。
第三步所描述的:app/design/frontend/default/default/layout/alwayly_test.xml
<?xml version="1.0"?>
<layout version="0.1.0">
<checkout_cart_index>
<reference name="before_body_end">
<block type="alwayly_test/event_checkout_cart_index" name="alwayly_test_event_checkout_cart_index" template="alwayly/test/event/checkout/cart/index.phtml" />
</reference>
</checkout_cart_index>
</layout>
第四部所描述的:app/design/frontend/default/default/template/alwayly/test/event/checkout/cart/index.phtml
<?php $_product = Mage::getModel('core/session')->getProductToShoppingCart() ?>
<
getId()): ?>
<<script type="text/javascript">
//Some 3rd party JS tracking code
</script>
<?php Mage::getModel('core/session')->unsProductToShoppingCart(); ?>
<?php endif; ?>
这就是一个简单的为你的分析服务追踪“添加产品到购物车”动作的方式。
好处是:你不需要更改已有的.phtml文件增加JS点击事件或者类似的事情。
电商网站开发服务。