Zend_Dojo-View-Dojo.xml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. <sect2 id="zend.dojo.view.dojo">
  2. <title>dojo() 视图助手</title>
  3. <para>
  4. <code>dojo()</code> 视图助手用来简化设置 Dojo 环境,包括下列职责:
  5. </para>
  6. <itemizedlist>
  7. <listitem><para>指定一个 CDN 或一个本地路径给 Dojo 安装。</para></listitem>
  8. <listitem><para>指定路径给定制的 Dojo 模块。</para></listitem>
  9. <listitem><para>指定 dojo.require 语句。</para></listitem>
  10. <listitem><para>指定 dijit 风格主题来使用。 </para></listitem>
  11. <listitem><para>指定 dojo.addOnLoad() 事件。</para></listitem>
  12. </itemizedlist>
  13. <para>
  14. <code>dojo()</code> 视图助手实现是占位符实现的一个范例;数据集在视图对象之间持久,
  15. 并可能从布局脚本被直接显示。
  16. </para>
  17. <example id="zend.dojo.view.dojo.usage">
  18. <title>dojo() 视图助手用法范例</title>
  19. <para>
  20. 对本范例,假设开发者将从本地路径使用 Dojo 表单,需要请求若干个 dijits,
  21. 并将使用 Tundra dijit 主题。
  22. </para>
  23. <para>
  24. 在许多页面上,开发者可能根本不使用 Dojo。所以,我们集中精力在需要 Dojo 的视图脚本上,
  25. 然后是布局脚本,在那里,我们将设置一个 Dojo 环境和解析它。
  26. </para>
  27. <para>
  28. 首先,我们需要告诉视图对象使用 Dojo 视图助手路径。这可以在引导文件里或早期运行的插件里做;
  29. 简单地抓取你的视图对象并执行下列代码:
  30. </para>
  31. <programlisting role="php"><![CDATA[
  32. $view->addHelperPath('Zend/Dojo/View/Helper/', 'Zend_Dojo_View_Helper');
  33. ]]></programlisting>
  34. <para>
  35. 接着是视图脚本。在本例中,我们打算指定使用 FilteringSelect - 它需要基于 QueryReadStore 的定制的存储,
  36. 我们将调用 'PairedStore' 并存储到我们的 'custom' 模块。
  37. </para>
  38. <programlisting role="php"><![CDATA[
  39. <? // setup data store for FilteringSelect ?>
  40. <div dojoType="custom.PairedStore" jsId="stateStore"
  41. url="/data/autocomplete/type/state/format/ajax"
  42. requestMethod="get"></div>
  43. <? // Input element: ?>
  44. State: <input id="state" dojoType="dijit.form.FilteringSelect"
  45. store="stateStore" pageSize="5" />
  46. <? // setup required dojo elements:
  47. $this->dojo()->enable()
  48. ->setDjConfigOption('parseOnLoad', true)
  49. ->registerModulePath('../custom/')
  50. ->requireModule('dijit.form.FilteringSelect')
  51. ->requireModule('custom.PairedStore');
  52. ]]></programlisting>
  53. <para>
  54. 在布局脚本中,我们接着检查是否开启了 Dojo,如果是,我们将做一些基本配置和组装:
  55. </para>
  56. <programlisting role="php"><![CDATA[
  57. <?= $this->doctype() ?>
  58. <html>
  59. <head>
  60. <?= $this->headTitle() ?>
  61. <?= $this->headMeta() ?>
  62. <?= $this->headLink() ?>
  63. <?= $this->headStyle() ?>
  64. <? if ($this->dojo()->isEnabled()):
  65. $this->dojo()->setLocalPath('/js/dojo/dojo.js')
  66. ->addStyleSheetModule('dijit.themes.tundra');
  67. echo $this->dojo();
  68. ?>
  69. <?= $this->headScript() ?>
  70. </head>
  71. <body class="tundra">
  72. <?= $this->layout()->content ?>
  73. <?= $this->inlineScript() ?>
  74. </body>
  75. </html>
  76. ]]></programlisting>
  77. <para>
  78. 在这点上,你只需要确保你的文件在正确的位置并且你已经为 FilteringSelect 创建了终点动作!
  79. </para>
  80. </example>
  81. <sect3 id="zend.dojo.view.dojo.declarative">
  82. <title> Dojo 的 Programmatic 和 Declarative 用法</title>
  83. <para>
  84. Dojo 在其许多功能上使用 <emphasis>declarative</emphasis> 和
  85. <emphasis>programmatic</emphasis>。
  86. <emphasis>Declarative</emphasis> 用法使用标准的带有当页面加载时解析的非标准属性的 HTML 元素。
  87. 虽然强大并且语法简单,对大多数开发者来说,它在页面校验时容易出问题。
  88. </para>
  89. <para>
  90. <emphasis>Programmatic</emphasis> 用法让开发者通过用ID或 CSS 选择器把它们来出来并解析
  91. 到合适的在 Dojo 里的对象构造器来装饰存在的元素。因为没有使用非标准 HTML 属性,页面可以继续校验。
  92. </para>
  93. <para>
  94. 在实践中,当禁止 javascript 或不能获取部分 Dojo 脚本资源,上述两个用例都考虑了完美的降级。
  95. 为提升标准和文档校验, Zend Framework 缺省使用 programmatic 用法,各种
  96. 视图助手将生成 javascript 并压到 <code>dojo()</code> 视图助手,在解析时包含。
  97. </para>
  98. <para>
  99. 用这个技术的开发者可能也想探索写自己的页面 programmatic 装饰器。
  100. 一个好处是可以指定 dijit 事件的句柄。
  101. </para>
  102. <para>
  103. 为使用此功能,同时也使用 declarative 语法,有许多静态方法可以全局使用。
  104. </para>
  105. <example id="zend.dojo.view.dojo.declarative.usage">
  106. <title>指定 Declarative 和 Programmatic Dojo 用法范例</title>
  107. <para>
  108. 为指定 declarative 用法,简单地调用静态方法
  109. <code>setUseDeclarative()</code>:
  110. </para>
  111. <programlisting role="php"><![CDATA[
  112. Zend_Dojo_View_Helper_Dojo::setUseDeclarative();
  113. ]]></programlisting>
  114. <para>
  115. 如果你决定使用 programmatic 用法,调用静态方法
  116. <code>setUseProgrammatic()</code>:
  117. </para>
  118. <programlisting role="php"><![CDATA[
  119. Zend_Dojo_View_Helper_Dojo::setUseProgrammatic();
  120. ]]></programlisting>
  121. <para>
  122. 最后,如果你想生成自己的 programmatic 规则,你应当指定 programmatic 用法,
  123. 但是传递值 '-1';在这种情况下,不生成用于装饰 dijit 的 javascript。
  124. </para>
  125. <programlisting role="php"><![CDATA[
  126. Zend_Dojo_View_Helper_Dojo::setUseProgrammatic(-1);
  127. ]]></programlisting>
  128. </example>
  129. </sect3>
  130. <sect3 id="zend.dojo.view.dojo.themes">
  131. <title>主题</title>
  132. <para>
  133. Dojo 允许为它的 dijits(小部件)生成主题。你可以通过传递模块路径来选择一个:
  134. </para>
  135. <programlisting role="php"><![CDATA[
  136. $view->dojo()->addStylesheetModule('dijit.themes.tundra');
  137. ]]></programlisting>
  138. <para>
  139. 模块路径通过使用字符 '.'作为目录分隔符和在主题目录里列表中最后的值作为CSS文件的名称来找出。
  140. 在上述例子中,Dojo 在 'dijit/themes/tundra/tundra.css' 中寻找主题。
  141. </para>
  142. <para>
  143. 当使用主题时,记住传递主题类很重要,至少,传递在你使用的 dijits 周围的容器;
  144. 最常用的用例是在 body 里传递它:
  145. </para>
  146. <programlisting role="html"><![CDATA[
  147. <body class="tundra">
  148. ]]></programlisting>
  149. </sect3>
  150. <sect3 id="zend.dojo.view.dojo.layers">
  151. <title>使用 Layers (定制)</title>
  152. <para>
  153. 缺省地,当你使用 dojo.require 语句,dojo 将请求服务器抓取适当的 javascript 文件。
  154. 如果你有许多 dijits ,将导致许多对服务器请求,- 这不是很理想。
  155. </para>
  156. <para>
  157. Dojo 的解决方案是提供生成 <emphasis>定制</emphasis> 的能力,定制做如下事情:
  158. </para>
  159. <itemizedlist>
  160. <listitem><para>
  161. 把请求文件集中到 <emphasis>layers</emphasis>,layer 把所有的请求
  162. 文件集中成一个单个的 JS 文件。(Hence the name of this section.)
  163. </para></listitem>
  164. <listitem><para>
  165. "Interns" non-javascript files used by dijits (typically,
  166. template files). These are also grouped in the same JS file as
  167. the layer.
  168. </para></listitem>
  169. <listitem><para>
  170. 通过 ShrinkSafe 传递文件,它剥离了空白字符和注释,还缩短了短变量名。
  171. </para></listitem>
  172. </itemizedlist>
  173. <para>
  174. 有些文件不能被 layered,但定制处理将生成一个特别的目录来放 layer 文件和其它所有文件。
  175. 这会对你的站点或应用需求减少发行定制。
  176. </para>
  177. <para>
  178. 为了使用 layer,<code>dojo()</code> 视图助手有一个
  179. <code>addLayer()</code> 方法来添加路径到请求 layers:
  180. </para>
  181. <programlisting role="html"><![CDATA[
  182. $view->dojo()->addLayer('/js/foo/foo.js');
  183. ]]></programlisting>
  184. <para>
  185. 更多关于生成定制的信息,请 <ulink
  186. url="http://dojotoolkit.org/book/dojo-book-0-9/part-4-meta-dojo/package-system-and-custom-builds">refer
  187. 参考 Dojo 构造文档</ulink>.
  188. </para>
  189. </sect3>
  190. <sect3 id="zend.dojo.view.dojo.methods">
  191. <title>可用方法</title>
  192. <para>
  193. <code>dojo()</code> 视图助手总返回 dojo 占位符容器的实例。
  194. 这容器对象有下列方法可用:
  195. </para>
  196. <itemizedlist>
  197. <listitem><para><code>setView(Zend_View_Interface $view)</code>:
  198. 在容器中设置一个视图实例。</para></listitem>
  199. <listitem><para><code>enable()</code>: 显式地开启 Dojo
  200. 集成。</para></listitem>
  201. <listitem><para><code>disable()</code>: 关闭 Dojo
  202. 集成。</para></listitem>
  203. <listitem><para><code>isEnabled()</code>: 确定是否
  204. Dojo 集成已经开启。</para></listitem>
  205. <listitem><para><code>requireModule($module)</code>: 设置一条
  206. <code>dojo.require</code> 语句。</para></listitem>
  207. <listitem><para><code>getModules()</code>: 确定模块
  208. 已经被请求。</para></listitem>
  209. <listitem><para><code>registerModulePath($module, $path)</code>:
  210. 注册一个定制的 Dojo 模块路径。</para></listitem>
  211. <listitem><para><code>getModulePaths()</code>:
  212. 获得已注册模块路径列表。</para></listitem>
  213. <listitem><para><code>addLayer($path)</code>: 添加一个 layer (定制)
  214. 路径。</para></listitem>
  215. <listitem><para><code>getLayers()</code>:
  216. 获得已注册的 layer 路径(定制)的列表。</para></listitem>
  217. <listitem><para><code>removeLayer($path)</code>:
  218. 从已注册的 layers (定制)列表里删除匹配 <code>$path</code> 的 layer。
  219. </para></listitem>
  220. <listitem><para><code>setCdnBase($url)</code>: 为 CDN 设置基础 URL;
  221. 一般地是
  222. <code>Zend_Dojo::CDN_BASE_AOL</code> 或
  223. <code>Zend_Dojo::CDN_BASE_GOOGLE</code> 其中之一,
  224. 但它只需要在版本号之前的 URL 字符串。
  225. </para></listitem>
  226. <listitem><para><code>getCdnBase()</code>: 获取基础 CDN url
  227. </para></listitem>
  228. <listitem><para><code>setCdnVersion($version = null)</code>:
  229. 从 CDN 设置 Dojo 的版本。
  230. </para></listitem>
  231. <listitem><para><code>getCdnVersion()</code>:
  232. 从将要用的 CDN 获取 Dojo 的版本。
  233. </para></listitem>
  234. <listitem><para><code>setCdnDojoPath($path)</code>:
  235. 在一个 CDN 中设置 dojo.js 或 dojo.xd.js 文件的相对路径 ;
  236. 一般地是 <code>Zend_Dojo::CDN_DOJO_PATH_AOL</code> 或
  237. <code>Zend_Dojo::CDN_DOJO_PATH_GOOGLE</code> 其中之一,但
  238. 它只需要是带版本号的路径字符串。
  239. </para></listitem>
  240. <listitem><para><code>getCdnDojoPath()</code>:
  241. 获取最后的 CDN url 指向 dojo.js文件的路径段。
  242. </para></listitem>
  243. <listitem><para><code>useCdn()</code>:
  244. 告诉容器使用 CDN;显式地开启集成。
  245. </para></listitem>
  246. <listitem><para><code>setLocalPath($path)</code>:
  247. 告诉容器指向本地 Dojo 安装(和服务器相关的路径,包括 dojo.js 文件自己)
  248. 的路径。显式地开启集成。
  249. </para></listitem>
  250. <listitem><para><code>getLocalPath()</code>:
  251. 确定使用哪个本地 Dojo 路径。
  252. </para></listitem>
  253. <listitem><para><code>useLocalPath()</code>:
  254. 是否集成使用 Dojo 本地路径?
  255. </para></listitem>
  256. <listitem><para><code>setDjConfig(array $config)</code>:
  257. 设置 dojo/dijit 配置值(需要联合数组)。
  258. </para></listitem>
  259. <listitem><para><code>setDjConfigOption($option, $value)</code>:
  260. 设置一单个的 dojo/dijit 配置值。
  261. </para></listitem>
  262. <listitem><para><code>getDjConfig()</code>:
  263. 获取所有的 dojo/dijit 配置值。
  264. </para></listitem>
  265. <listitem><para><code>getDjConfigOption($option, $default =
  266. null)</code>:
  267. 获取一单个的 dojo/dijit 配置值。
  268. </para></listitem>
  269. <listitem><para><code>addStylesheetModule($module)</code>:
  270. 基于模块主题添加风格。
  271. </para></listitem>
  272. <listitem><para><code>getStylesheetModules()</code>:
  273. 获取注册为模块主题的风格。
  274. </para></listitem>
  275. <listitem><para><code>addStylesheet($path)</code>:
  276. 添加一个本地风格来和 Dojo 一起使用。
  277. </para></listitem>
  278. <listitem><para><code>getStylesheets()</code>:
  279. 获取本地 Dojo 风格。
  280. </para></listitem>
  281. <listitem><para><code>addOnLoad($spec, $function = null)</code>:
  282. 为 dojo.onLoad 添加一个 lambda 来调用。如果传递一个参数,那就是
  283. 函数名或一个 javascript closure。如果传递两个参数,第一参数是
  284. 对象实例变量的名字,第二个参数是该对象的方法名或使用这个对象的
  285. 一个 closure。
  286. </para></listitem>
  287. <listitem><para><code>getOnLoadActions()</code>:
  288. 获取所有用容器注册的 dojo.onLoad 动作,将是一个数组的数组。
  289. </para></listitem>
  290. <listitem><para><code>onLoadCaptureStart($obj = null)</code>:
  291. 为 dojo.onLoad() 抓取用做 lambda 的数据。如果提供了 $obj,
  292. 那么 JS 抓取代码被认为是一个和 Javascript 对象一起使用的 closure 。
  293. </para></listitem>
  294. <listitem><para><code>onLoadCaptureEnd($obj = null)</code>:
  295. 停止为使用 dojo.onLoad() 抓取数据。
  296. </para></listitem>
  297. <listitem><para><code>javascriptCaptureStart()</code>:
  298. 抓取任意的 javascript 包含到 Dojo JS (onLoad、 require 等语句)。
  299. </para></listitem>
  300. <listitem><para><code>javascriptCaptureEnd()</code>:
  301. 停止抓取 javascript。
  302. </para></listitem>
  303. <listitem><para><code>__toString()</code>:
  304. 转换容器为字符串;解析所有的 HTMl 风格和脚本元素。
  305. </para></listitem>
  306. </itemizedlist>
  307. </sect3>
  308. </sect2>
  309. <!--
  310. vim:se ts=4 sw=4 et:
  311. -->