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版在某时应该可以自动读取插件文件。&_&)