当前位置:首页 > zencart完整的API开发参考手册 - 图文
ONS 的关键点是开发者可以写代码,等待一定的事件发生,然后当发生的时候,执行他们自己的代码。
那么,事件是如何定义,它们在哪被触发?
事件由添加到 v1.3 核心的代码触发。在任何一个我们想通知一个事件发生的类中,我们添加:
下面的例子可能有用:
在购物车类,当一件商品被添加到购物车后,这个事件触发了:
在 Zen Cart v1.3 版
本中许多事件都拥有通知者,这个是清单 。 这些通知很好,那么如何帮助开发者呢?
1.2.4 观察和壮大
为了利用通知者,开发者需要写一些代码来观察它们。观察者需要被写成一个类。有一个好的目录,includes/classes/observers,开发者可以在这放置这些类。
让我们看一个例子。使用上面提到的通知者(NOTIFIER_CART_ADD_CART_END),我如何写一个类来观察那个事件?
正如你看到的,我们已经定义了一个新的名为 myObserver 的类,在它的构造函数(function myObserver)已经把 myObserver 这个类附加到 NOTIFIER_CART_ADD_CART_END 这个事件中。 “不错,”我听到你说,“但是我怎么样才能做点有用的事情?”
OK,问得好。当一个事件发生的时候,基类会查看,是否有任意的其它观察者类在观察这个事件。如果有,那么基类会执行那个观察者类中的一个方法。还 记得上面提到的 $this-
>notify('EVENT_NAME')吗?好的,当那个事件发生,基类会调用所有观察者的 update 方法。让我们看更多的代码:
现在,当 NOTIFIER_CART_ADD_CART_END 发生的时候,我们的 myOberserv::update 方法将会被执行。注意 attach() 可能会被作任何你想监听的类的一个方法被调用
($_SESSION['cart'],在本例中)或者被类的内部变量 $this 调用。两者都可行,因为它们都是基类的一部分,attach 方法存在的地方。 关于参数需要注意。attach 方法有两个参数:
&$observer - 观察者类的引用,用来为一个新的监听者产生一个独一无二的 ID $eventIDArray - 一个通知者数组,这些通知者正在被这个观察者监听 update 方法可以传递三个参数,它们是:
&$callingClass - 这是对类的一个引用,事件在这些类中发生,允许你访问那个类的变量 $notifier - 触发 update 的通知者名字(观察多个通知者是明显可行的) $paramsArray - 还未使用(将来或许会用到)
注意!观察者/通知者系统是为一个面向对象的应用程序而写的, 因为观察者被期待附加到一个在它的方法内拥有通知者的类中。然而,在 Zen Cart 中许多的代码仍然面向过程的,不包括在一个类中。
为了正常运转,我们添加了“stub”通知者类。所以如果你想为在过程代码中的一个通知者创建一个观察者(例如在页面头部),你应该这样把通知者添加到你的 myObserver 类中:
1.2.5 在你的
代码中包括进观察者
请注意 includes/classes/observers 目录不是一个自动加载目录,所以你将需要安排
application_top.php 来自动加载你的观察者类,如同上面所述(在 auto_loaders 目录中添加一个新的 config.xxxxx.php 文件,诸如此类)。让我们假设你正在使用 freeProduct 类(看下面的例子),你已经把它保存到
includes/classes/observers/class.freeProduct.php 文件。
你现在需要为这个类安排从而加载和实例化它。为了达到这个目的,你需要使用 appliction_top.php 自动加载系统。
在 includes/auto_loaders 创建一个名为 config.freeProduct.php 的文件,包含以下内容:
注意:已经选择10来引发这个观察者类在 session 开始之前加载的。注意:已经选择90作为从观察者需要附加到 $_SESSION['cart'] 类的偏移量(见下面的 freeProduct 例子),而 $_SESSION['cart'] 被实例化的位置是80。 把这些组合起来,让我们看一下真实的例子。
1.2.6 一个真实的例子
被要求众多的一个特性是:当客户消费超过一定金额的时候,商店可以自动添加一件免费赠品。
这个代码应该是智能的:它不仅可以在客户消费达到一定金额的时候添加免费赠品,同时也可以在客户改变购物车内容,消费金额在标准之下的时候,移除免费赠品。
传统的,虽然这个代码不是特别困难,它却意味要在 shoppingCart 类中的许多地方需要破解。通过 ONS,这将通过一个十分小的定制类来完成,同时不会造成任何的破坏。 以下是代码:
共分享92篇相关文档