Xajax 0.5:Zh: Tutorials: Writing Custom Plugins






Xajax 0.5:Zh: Tutorials: Writing Custom Plugins

编写自定义插件 适用于xajax 0.5


首先,你需要声明你自己的插件类作为xajaxResponsePlugin类的继承类;添加自己的函数;然后注册该插件。

开始

在运行下面的代码片段之前,请确认你安装了prototype以及scriptaculous并且能够正常运行。

让我们先以一个简单的插件开始,后面再逐渐扩展其功能。将下面的插件代码添加到你的index.php文件顶部(如果你仅使用一个文件)或index.server.php文件顶部(如果你使用一个index文件,一个common文件和一个服务器设置文件)。

class scriptaculous extends xajaxResponsePlugin
{
    var $sCallName "scriptaculous";
    
    function fade($id) {
        $this->_objResponse->script("new Effect.Fade(\"{$id}\");");
    }
    function appear($id) {
        $this->_objResponse->script("new Effect.Appear(\"{$id}\")");
    }
}

$pluginManager = &xajaxPluginManager::getInstance();
$pluginManager->registerResponsePlugin(new scriptaculous());

然后,在你的php代码中使用该插件,如:

function myPHPFunction() {
    $objResponse = new xajaxResponse();

    //PHP4 or PHP5 Plugin Syntax
    $objResponse->plugin("scriptaculous""fade""myDivID");

    return $objResponse;
}

上面的语法可以兼容在PHP5下正常运行,下面一段代码只能运行于PHP5语法下,它更加直观和易读:

function myPHPFunction() {
    $objResponse = new xajaxResponse();

    //PHP5 ONLY Plugin Syntax
    $objResponse->scriptaculous->fade("myDivID");

    return $objResponse;
}

另外

这时候,你可能不满足于这个简单得不行的版本了,考虑的是如何加入更高级的各种功能选项。。。so,这儿有个示例告诉你如何扩展插件支持更多的scriptaculous选项(译者注:scriptaculous: script.aculo.us,一个JS类库,和Prototype类似)

让我们来扩展一下这个插件:

class scriptaculous extends xajaxResponsePlugin
{
    var $sCallName "scriptaculous";

    function processParameters(&$aParams) {
        $comma false;
        $params ", {";
        if (isset($aParams["duration"])) {
            if ($comma)
                $params .= ", ";
            $params .= "duration: ";
            $params .= $aParams["duration"];
            $comma true;
        }
        if (isset($aParams["queue"])) {
            if ($comma)
                $params .= ", ";
            $params .= "queue: '";
            $params .= $aParams["queue"];
            $params .= "'";
            $comma true;
        }
        $params .= "}";
        if (", {}" == $params)
            $params "";
        return $params;
    }        
    function fade($id$aParams = array()) {
        $params $this->processParameters($aParams);
        $this->_objResponse->script("new Effect.Fade(\"{$id}\"{$params});");
    }
    function appear($id$aParams = array()) {
        $params $this->processParameters($aParams);
        $this->_objResponse->script("new Effect.Appear(\"{$id}\"{$params})");
    }
}    

$pluginManager = &xajaxPluginManager::getInstance();
$pluginManager->registerResponsePlugin(new scriptaculous());

于是乎,你可以使用额外的参数来使用这个插件:

function myPHPFunction() {
    $objResponse = new xajaxResponse();

    //PHP4 or PHP5 Plugin Syntax
    $objResponse->plugin("scriptaculous""fade""myDivID", array("duration"=>".3"));
    $objResponse->plugin("scriptaculous""appear""myDivID", array("queue"=>"end"));

    return $objResponse;
}

或使用PHP5 Only语法:

function myPHPFunction() {
    $objResponse = new xajaxResponse();

    //PHP5 ONLY Plugin Syntax
    $objResponse->scriptaculous->fade("myDivID", array("duration"=>".3""queue"=>"end"));
    $objResponse->scriptaculous->appear("myDivID", array("duration"=>".8""queue"=>"end"));

    return $objResponse;
}

加入附加函数后,将上面的函数作为模板使用,将会更直观。

参见随xajax 0.5一起打包的basticPluginTest.php文件。

TODO

某些时候,插件最好写在独立的文件中;xajax 0.5 MS可以读取指定目录的插件文件。我回头查一下再说。(Jared说:在Beta 1版中我还没有实现,但0.5版在某时应该可以自动读取插件文件。&_&)