西部数码主机 | 阿里云主机| 虚拟主机 | 服务器 | 返回乐道官网
当前位置: 主页 > php教程 > zencart教程 >

从实现购物车快捷支付来探讨zen cart的ONS设计模式

时间:2016-01-19 10:20来源: 作者: 点击:
一切源于开源,最终服务于开源的,欢迎探讨,敬请尊重原创。 虽说zen cart更新慢,而且最新版中大量的代码还是面向过程的写法,只要少部分是采用OOP设计,然而其中至少也有引入一

一切源于开源,最终服务于开源的,欢迎探讨,敬请尊重原创。

虽说zen cart更新慢,而且最新版中大量的代码还是面向过程的写法,只要少部分是采用OOP设计,然而其中至少也有引入一些OOP开发中常用的设计模式,比如我们今天要谈的obserer/notifier system(ONS),我不太确定该什么翻译了,暂且称它为侦听者(也有人翻作侦听器,侦听事件,事件)设计模式。不要纠结这个了,我通常不翻,直接用英文说法,不然和别人沟通时会有问题。想要深入了解这个设计模式的可以去看一些关于设计模式的书。这个设计模式的应用很广泛了,在开源的PHP电商平台如WooCommerce里的HOOK,Magento里的observer/Event, opencart里的Front …

做了这么多年电商,发现一直在原地踏步。很多人总在想为什么转化率很低,也想了很多办法来提高转化率,换了一套又一套的模板,改了又改的下单流程,一个又一个的促销活动 …
如果说我们觉得自己的站的体验真的很差,那还是让用户早做决定,迅速购买,快速支付,我所指的快速支付是指在购物车页面保存一直快照,然后直接将用户带到第三方支付页面,舍弃掉zen cart站内的下单流程,只传递订单号,金额,货币,购物内容这几个参数给第三方支付网关,由支付网关负责收集用户的地址信息。这就是我这边要举的例子。以zen cart为实验平台,在产品展示页面或购物车页面显示快速支付按钮或链接,其实这方面paypal很早就做了,我这边只不过是举个例子来说明。

从zen cart 1.3以后的版本中,所有类都是继承base这个类,所以,首先,所有的zen cart核心类都具有侦听事件并在事件发生时做出相应动作的能力。由于zen cart目前仍然有大部分的代码是面向过程而非OOP的,所以,要在某个页面侦听事件并响应,就要借助zen cart的$zco_notifier全局变量。
首先我们来定义一个observer类,因为是要在购物车页面的checkout按钮前增加一个快捷支付的按钮,所以我把类名定为 express_checkout,继承base类,代码如下

includes/classes/observers/class.express.checkout.php


class express_checkout extends base {

function __construct() {
global $zco_notifier;
$zco_notifier->attach($this, array('NOTIFY_HEADER_END_SHOPPING_CART'));
}

function update(&$class, $eventID, $paramsArray = array())
{
error_log("\n" . date('Y-m-d H:i:s') . ' Class ' . get_class($class) . 'id' . $eventID , 3, 'log');
}
}

 

显然,在这个类的构造函数内就将这个类绑定到NOTIFY_HEADER_END_SHOPPING_CART事件。这个地方使用全局变量$zco_notifier的原因是我们要追踪的是shopping cart页面,这个事件将是在header_php.php中激活。

第二,定义好observer类后,我们来看看在header_php.php中如何激活这个observer呢?很简单,它是通过下面这行代码激活的:

$zco_notifier->notify('NOTIFY_HEADER_END_SHOPPING_CART');

而这个notify是在base类定义的:

function notify($eventID, $paramArray = array()) {
$observers = & base::getStaticObserver();
error_log("\n". print_r($observers,1), 3, 'log');
if (!is_null($observers))
{
foreach($observers as $key=>$obs) {
if ($obs['eventID'] == $eventID) {
$obs['obs']->update($this, $eventID, $paramArray);
}
}
}
}


第三,从base类notify我们能清楚我们的observer必需要定义一个update方法,并且正是通过这个方法实现当某个特定的侦听事件发生时,我们要做的动作,比如我们这个例子中我们要生成一个快捷支付的按钮,甚至保存一下快照,或者直接生成一个临时订单等…

第四步,我们写了这些个代码只是做了准备工作,这个代码还末进入到zen cart请求流程中去。也就是说我们只是定义了一个observer,并且zen cart确实有触发激活这个observer的事件。但是我们的observer还末向zen cart声明或注册。对,我们要让zen cart知道我们新定义的observer类,并让它初始化一个实例,这样才会将我们的observer通过类的构造函数绑定到对应的事件。而这个动作我们则需要通过zen cart的auto loader来实现,因为zen cart不会自动加载includes/classes/observers/这个目录下的observer类。那么我们需要在includes/auto_loaders定义一个auto loader文件,内容如下:

includes/auto_loaders/config.express.checkout.php

$autoLoadConfig[10][] = array('autoType'=>'class',
'loadFile'=>'observers/class.express.checkout.php');
$autoLoadConfig[90][] = array('autoType'=>'classInstantiate',
'className'=>'express_checkout',
'objectName'=>'express_checkout');


具体的实施我就不写了。不同的第三方支付有不同的参数要求。至于保存当前购物车快照或生成订单也很容易实现。从zen cart角度上说这也是除了利用zen cart重载机制(override)之外的另一种二次开发的方式,而不是直接去修改zen cart的源代码。

(责任编辑:好模板)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容