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 >
* @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类,并写一个你要处理事件的方法。