zen cart事件处理机制,即事件绑定,主要是通过绑定某个事件,然后处理该事件来达到事件响应,跟平常所说的事件绑定原理是一样的。
比如我们在header_php.php文件里面经常会看见,类似
$zco_notifier->notify(‘NOTIFY_SEARCH_ORDERBY_STRING’, $listing_sql);
$zco_notifier->notify(‘NOTIFY_HEADER_END_ADVANCED_SEARCH_RESULTS’, $keywords);
$zco_notifier->notify(‘NOTIFY_HEADER_START_ADVANCED_SEARCH_RESULTS’);
等等。有很多人都觉得奇怪,这个是干什么用的呢。
其实这个就是事件绑定,这个是zen cart非常好的一个地方之一,通过绑定某个事件,然后在其他地方对该事件的处理。从开发的角度来说,这个是很好的解决了模块之间耦合问题。这个对于zen cart系统的后期开发和维护都是非常重要的。特别是对于大的网站。知道了这个的好处,那就应该知道怎么去利用它的好处。
如何使用zencart的事件处理机制呢?
我们可以仿照系统本身存在的这些处理方式来做,第一在includes\classes\observers 目录下新建一个PHP类,这个来继承基类base,比如我们可以参考includes\classes\observers\class.products_viewed_counter.php 这个类
这个类主要是用来响应NOTIFY_PRODUCT_VIEWS_HIT_INCREMENTOR 这个事件,这个是商品浏览量计数 该类的代码如下

  1. class products_viewed_counter extends base {
  2.   function __construct() {
  3.     $this->attach($this, array(‘NOTIFY_PRODUCT_VIEWS_HIT_INCREMENTOR’));
  4.   }
  5.   function update(&$class, $eventID, $paramsArray = array())
  6.   {
  7.     if ($eventID == ‘NOTIFY_PRODUCT_VIEWS_HIT_INCREMENTOR’)
  8.     {
  9.       if (defined(‘LEGACY_PRODUCTS_VIEWED_COUNTER’) && LEGACY_PRODUCTS_VIEWED_COUNTER == ‘on’)
  10.       {
  11.         global $db;
  12.         $sql = “update ” . TABLE_PRODUCTS_DESCRIPTION . “
  13.                 set        products_viewed = products_viewed+1
  14.                 where      products_id = ‘” . (int)$paramsArray . “‘
  15.                 and        language_id = ‘” . (int)$_SESSION['languages_id'] . “‘”;
  16.         $res = $db->Execute($sql);
  17.       }
  18.     }
  19.   }
  20. }

该事件的通知代码在includes\modules\pages\product_info\main_template_vars.php 文件中:  $zco_notifier->notify(‘NOTIFY_PRODUCT_VIEWS_HIT_INCREMENTOR’, (int)$_GET['products_id']);
该类的对象在includes\auto_loaders\config.products_viewed_counter.php 文件中初始化
这个类里面只要重写基类的方法update和实现构造函数就可以了,其中构造函数主要就是绑定该类处理的事件。具体内容可以参考这个类的实现代码。思路大概就是这样,具体使用还得自己动手实现才能深刻的掌握。
简洁一点的说,要使用zencart事件响应机制
第一,要实现绑定该事件很处理该事件的一个类。
第二,系统初始化的时候初始化该类的对象。
第三,在需要响应事件的地方绑定该事件。
如果还不明白请回帖说明。