最近,我一直在忙一个关于第三方客户分析和定位服务的插件,考虑替换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追踪“添加产品到购物车”行动的简单想法。

  1. 为定义controller_action_predispatch_checkout_cart_add事件定义事件监听方法;
  2. 在事件监听方法中,当添加产品到购物车时做个记录。例如Mage::getModel(‘core/session’)->setProductToShoppingCart(…)这样的东西。
  3. 写个布局更新checkout_cart_index句柄,读取一个自定义的.phtml模版文件,你可以用core/template或者你自己的模块类来定义块的类型。
  4. 在自定义的.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点击事件或者类似的事情。

360magento提供专业的基于magento系统的电商网站开发服务,如有需求或相关咨询,请与我们联系