Joomla插件开发规范

概述:JPlugin Joomla 1.5的新功能

为了更好使Joomla符合面向对象的框架,引入了JPlugin。Plugins是依附于全局事件分派系统的观察者类。这就意味无论是Joomla核心,还是第三方组件,模块都能触发一个或多个JPlugins来执行一些功能。这与mambot并不完全相同。虽然mambot与plugin都是事件触发并执行代码,但是mammot需要全局范围的声明,而JPlugin是一个类,事件处理函数能有自己的变量和私有的helper方法,这是整个事件处理系统更加清晰。


2. 实现

JPlugin系统的实现是一个观察者模式。有两部分,一部分是观察者(JPlugin),另一部分是被观察者(JEventDispatcher)


2.1 JPlugin 类

部分代码如下:

/**
 * JPlugin Class
 *
 * @author Louis Landry < louis@webimagery.net 为防备电子邮件地址收集器,这个 E-mail 地址被隐藏,你的浏览器必须支持 Javascript 才可看到这个邮件地址 >
 * @package Joomla.Framework
 * @subpackage Application
 * @since 1.5
 */
class JPlugin extends JObserver {

 /**
  * Constructor
  *
  * For php4 compatability we must not use the __constructor as a constructor for plugins
  * because func_get_args ( void ) returns a copy of all passed arguments NOT references.
  * This causes problems with cross-referencing necessary for the observer design pattern.
  *
  * @param object $subject The object to observe
  * @since 1.5
  */
 function JPlugin(& $subject) {
  parent::__construct($subject);
 }

 /**
  * Method to map events to handler methods
  *
  * @access public
  * @param array Arguments
  * @return mixed Routine return value
  * @since 1.1
  */
 function update(& $args) {
  /*
   * First lets get the event from the argument array.  Next we will unset the
   * event argument as it has no bearing on the method to handle the event.
   */
  $event = $args['event'];
  unset($args['event']);
  
  /*
   * If the method to handle an event exists, call it and return its return
   * value.  If it does not exist, return a boolean true.
   */
  if (method_exists($this, $event)) {
   return call_user_func_array(array($this, $event), $args);
  } else {
   return true;
  }
 }
}

2.1.1 详细设计

两个重要的部分使这个类得以运行

一个是构造器,在构造函数中做了以下操作:

// 注册观察者
$subject->attach($this);
//设置观察目标
$this->_subject = & $subject;

这样就将JPlugin与被观察者建立了联系,所有的plugin都观察JEventDispatcher对象

第二个重要的就是update方法,这个方法传递给触发器一个数组,数组有两个参数,事件和参数。一旦update方法接收到数组,那么它 提出事件,并清除数组.接下来调用数组传递来的 ‘event’ 方法,返回结果。


3. 第三方使用

例程:

<?php
/**
 * @version $Id: $
 * @package
 * @subpackage
 * @copyright
 * @license
 */

jimport('joomla.plugin');


/**
 * Example Plugin
 *
 * @author
 * @package
 * @subpackage
 * @since
 */
class ExamplePlugin extends JPlugin {

 /**
  * Constructor
  *
  * @param object $subject The object to observe
  * @since 1.1
  */
 function ExamplePlugin(& $subject) {
  parent::__construct($subject);
 }

 /**
  * This method handles the onIncrement event.  It takes an integer input and
  * increments its value.
  *
  * @access public
  * @param int $input An integer to increment
  * @return int Incremented integer
  * @since 1.1
  */
 function onIncrement($input) {
  
  return $input++;
 }
}
?>

如你所见,创建JPlugin非常简单,就是继承JPlugin类,并写一个你要处理事件的方法。

posted on 2009-12-20 14:15  14的路  阅读(612)  评论(0编辑  收藏  举报

导航

友情链接:源码下载