Xajax 0.5:Zh: Tutorials: Writing Advanced Plugins






Xajax 0.5:Zh: Tutorials: Writing Advanced Plugins

编写自己的插件中我们变到了如何简单的扩展xajax来编写插件。在本文中,让我们来研究一些高级技术来加强我们的插件,并体验它如何影响你程序带宽使用的。

Contents

[edit] 基本插件设计

基本的xajax PHP插件扩展通过添加$objResponse->script(...)响应命令来实现。我想当你在构建越来越大的脚本时,每次都要将其传递给插件进行调用,很容易就看到这个带宽资源是如何被耗尽的。

[edit] 设计一个更“智能”的插件

不象原来你每次想使用JS时都需要将javascript通过连接传递出去,取而代之的是你可以在浏览器端创建函数,然后通过插件进行简单的调用即可:

首先,创建一个.js的文件,写入你的函数:

myFunction = function(arg1) {
    alert(arg1);
}

然后,在你的脚本中包含该文件:

<head>
    <link type='text/javascript' href='./scripts/myFunction.js'></link>
</head>

最后,设计插件调用你的函数:

class myPlugin extends xajaxResponsePlugin
{
    var $sCallName = "myPlugin";
    
    function myFunction($arg1) {
        $this->_objResponse->call('myFunction', arg1);
    }
}

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

[edit] 编写自定义响应命令

现在,你可以编写一个终极插件,在javascript端直接hook(译者注:hook:勾子,不说了吧,win32编程里面的hook api就这个) xajax命令。响应命令可以被缩减到几个参数就可以了,这样将带宽占用降低到最小。

在javascript文件中,可以象这样创建响应命令的处理器:

    xajax.commands['myPlug_001'] = function(args) {
        args.cmdFullName = 'myPlugin->001';
        args.objElement.style.backgroundColor = args.data;
        return false;
    }
    xajax.commands['myPlug_002'] = function(args) {
        args.cmdFullName = 'myPlugin->002';
        args.objElement.style.disabled = true;
        return false;
    }

注意:命令处理器返回false值是非常重要的!如果返回了true值,必须设置一个定时器重新启动xajax响应命令处理...否则,页面会显示“锁定(lockup)”消息,并且命令也不会被处理。

另外插件命令的ID值也必须是唯一的。我们推荐在使用此技术构建大型插件之前,您能够将你的命令ID计划帖到xajax论坛上。搜索xajax论坛确保其他人没有使用与你相同的计划,否则你的插件就不会兼容了(译者注:与其它插件ID冲突)。

现在,要调用插件处理器,需要象下面一样编写你的php插件函数:

class myPlugin extends xajaxResponsePlugin
{
    var $sCallName = "myPlugin";
    
    function function001($sTarget, $sBackgroundColor) {
        $this->_objResponse->addCommand(array('n'=>'myPlug_001','t'=>$sTarget),$sBackgroundColor);
        return $this;
    }
    function function002($sTarget) {
        $this->_objResponse->addCommand(array('n'=>'myPlug_002','t'=>$sTarget),'');
        return $this;
    }
}

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

[edit] 即将呈现

在xajax 0.5 beta 3(还没出来)中加入新功能,允许插件编写者即时安装javascript函数(如果需要的话,译者注:使用的时候,即时调用)。不使用的函数不安装,这将有助于减少浏览器端内存使用。当然,你得留意哪些函数已经被安装了...可能要放在$_SESSION变量中。

它大概如下工作:

class myPlugin extends xajaxResponsePlugin
{
    var $aInstalledFunctions = array();
    var $sCallName = "myPlugin";
    
    function function001($sTarget, $sBackgroundColor) {
        if (false === in_array('myPlug_001', $this->aInstalledFunctions)) {
            $script = 'args.cmdFullName = "myPlugin->001";';
            $script .= 'args.objElement.style.backgroundColor = args.data;';
            $script .= 'return false;';
            $this->_objResponse->setFunction('xajax.commands["myPlug_001"]', 'args', $script);
            $this->aInstalledFunctions[] = 'myPlug_001';
            saveState();
        }
        $this->_objResponse->addCommand(array('n'=>'myPlug_001','t'=>$sTarget),$sBackgroundColor);
        return $this;
    }
    function function002($sTarget) {
        if (false === in_array('myPlug_002', $this->aInstalledFunctions)) {
            $script = 'args.cmdFullName = "myPlugin->002";';
            $script .= 'args.objElement.style.disabled = true;';
            $script .= 'return false;';
            $this->_objResponse->setFunction('xajax.commands["myPlug_002"]', 'args', $script);
            $this->aInstalledFunctions[] = 'myPlug_002';
            saveState();
        }
        $this->_objResponse->addCommand(array('n'=>'myPlug_002','t'=>$sTarget),'');
        return $this;
    }

    function saveState() {
        $_SESSION['myPlugin_state'] = $this->aInstalledFunctions;
    }
    function loadState() {
        $this->aInstalledFunctions = $_SESSION['myPlugin_state'];
    }
}

$my_plugin = new myPlugin();
$my_plugin->loadState();

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

在记录了浏览器端安装了哪些函数后,于是你只需要安装你需要的函数即可,这样充分节省了浏览器端的内存使用...也就节省了带宽。

  • 作者:CtC - Joseph Woolley - 2007/03/27
  • 中文翻译:LiD@moshoo.com - 2007/06/14