我很高兴地宣布,ZendFramework将与DojoToolkit合作,为在ZendFramework中开发的站点提供开箱即用的Ajax和丰富的用户界面。
首先,对于那些使用其他Javascript工具包的ZF用户:ZendFramework将继续基本上与JS工具包无关。您仍然可以在ZF应用程序中使用您想要的任何工具包。ZF将简单地提供Dojo,以便用户在默认情况下拥有一个工具包。已经定义了几个集成点,我希望这些可以用作与其他javascript框架相关的社区贡献的蓝图。与此同时,选择使用Dojo的开发人员将拥有一组丰富的组件和集成点。
我们为初始版本定义的集成点如下:
-
JSON-RPC服务器:我们正在重新开发
Zend_Json_Server
,它一直在我们的孵化器中,哦,什么?0.2.0?并且从未发布以实际遵循规范:JSON-RPC。这将允许它与Dojo以及其他具有JSON-RPC客户端实现的工具包无缝协作。我实际上已经完成了这方面的工作,尽管该提案正在等待批准;如果你想检查它,你可以在ZFsvn中找到它。原来的
Zend_Json_Server
实现将被放弃。它从未经过全面测试或完整记录,这阻碍了它的发布。此外,由于它实现了自己的临时标准,它没有提供真正的JSON-RPC服务器实现将提供的互操作性类型。我很高兴我们最终能够提供符合标准的通用解决方案。最后一点:目前有两种不同的JSON-RPC规范,1.0和2.0。目前,我一直在做的实现会根据请求切换payload格式,并且可以适当地传递不同的SMD格式。
-
dojo()ViewHelper:为页面启用Dojo通常并不像加载
dojo.js
脚本那么简单——您可以选择从AOLCDN或本地路径加载它,并且可能想要或需要加载额外的dojo、dijit或dojox模块,指定自定义模块和路径,指定要在onLoad()
上运行的代码,并指定装饰dijit的样式表。最重要的是,此信息可能会随着页面的不同而变化,并且可能只需要部分页面。dojo()
视图助手将充当占位符实现,并促进上述所有任务,并负责呈现必要的样式
和脚本
页面中的元素。 -
表单元素实现:开发人员真正利用javascript和ajax工具包的一个领域是表单。特别是,许多类型的表单输入可以受益于只有javascript才能提供的高级和丰富的用户界面:日历选择器、时间选择器等。此外,许多人喜欢使用客户端验证来向用户提供即时验证反馈(而不是要求往返服务器)。我们将确定一小组我们认为可以解决最相关用例的表单元素,并编写可与
Zend_Form
一起使用的特定于Dojo的版本。(需要注意的一件事:Zend_Form
的设计已经与Dojo配合得很好,允许通过简单地设置适当的元素属性来创建许多小部件和客户端验证。) -
dojo.data兼容性:
dojo.data
定义了一个标准的存储接口;以这种格式提供数据的服务可以被各种Dojo设施使用,从而为您的用户界面提供高度灵活和动态的内容。我们将构建一个组件,该组件将创建与dojo.data
兼容的负载,以响应XmlHttpRequest
;您只需要传入数据,并提供有关它的元数据。
所以,一些例子是有序的。首先,Zend_Json_Server
像所有ZF的服务器组件一样运行:if遵循SoapServerAPI。这允许您将任意类和函数附加到服务器组件。此外,它可以构建服务映射描述(SMD),Dojo可以使用它来发现有效的方法和签名。作为一个例子,在服务器端你可以有以下内容:
// /json-rpc.php // Assumes you have a class 'Foo' with methods 'bar' and 'baz': $server = new Zend_Json_Server(); $server->setClass('Foo') ->setTarget('/json-rpc.php') ->setEnvelope('JSON-RPC-1.0') ->setDojoCompatible(true); // For GET requests, simply return the service map if ('GET' == $_SERVER['REQUEST_METHOD']) { $smd = $server->getServiceMap(); header('Content-Type: application/json'); echo $smd; exit; } $server->handle();
在您的视图脚本端,您可以执行以下操作:
<h2>Dojo JSON-RPC Demo</h2> <input name=\"foo\" type=\"button\" value=\"Demo\" onClick=\"demoRpc()\"/> <? $this->dojo()->setLocalPath('/js/dojo/dojo.js') ->addStyleSheetModule('dijit.themes.tundra') ->requireModule('dojo.rpc.JsonService'); $this->headScript()->captureStart(); ?> function demoRpc() { var myObject = new dojo.rpc.JsonService('/json-rpc.php'); console.log(myObject.bar()); } <? $this->headScript()->captureEnd() ?>
最后,在您的布局脚本中,您可能具有以下内容:
<?= $this->doctype() ?> <html> <head> <title>...</title> <?= $this->dojo() ?> <?= $this->headScript() ?> </head> <body class=\"tundra\"> <?= $this->layout()->content ?> </body> </html>
该示例并没有做太多事情——它只是将JSON-RPC调用的结果记录到控制台——但它演示了很多事情:
- dojo()ViewHelper:该示例展示了从相对于服务器文档根目录的本地路径使用dojo;使用Dojo附带的“Tundra”样式表并将其附加到布局;捕获所需的模块(
dojo.rpc.JsonService
);并在布局中呈现必要的Dojo样式表和脚本。 - JSON-RPC客户端:Dojo要求您将JsonService指向提供服务映射描述的端点;在此示例中,我使用任何GET请求返回SMD。一旦检索到SMD,任何公开的方法都可用于Javascript对象,就好像它们是内部方法一样——因此
myObject.bar()
。Dojo的当前实现将所有其他请求作为POST请求执行,通过原始POST正文传递数据。
未来还会有更多内容,随着我收到更多提案并将代码写入存储库,我将在博客中介绍开发情况。总而言之,这是一次非常激动人心的合作,应该有助于为ZF开发人员提供快速创建具有丰富动态用户界面的Web应用程序的能力。
更新:Andi发布了关于我们集成的常见问题解答。