1 <sect2 id="zend.dojo.view.dijit">
2 <title>Dijit-Specific 视图助手 </title>
5 引用一下 Dojo 手册:“Dijit 是基于 dojo 之上的一个小部件系统”,Dijit 有
6 许多布局和表单小部件,用来提供访问、本地化和标准化(和可主题化)的观感。
10 Zend Framework 带有许多视图助手让你在视图脚本里解析和使用 dijits。有三个基本类型:
16 <emphasis>布局容器</emphasis>:
17 这些设计上在视图脚本理使用或由表单装饰器用于表单、子表单和显示组。
18 它们封装了 dijit.layout 提供的各种类。每个 dijit 布局视图助手有下面的参数:
23 <code>$id</code>: 容器名或 DOM ID。
27 <code>$content</code>: 在布局容器里封装的内容。
31 <code>$params</code> (optional): dijit-specific 参数。
32 基本上是任何非 HTML 属性,可用于配置 dijit 布局容器。
36 <code>$attribs</code> (可选):任何用于解析容器 div 的附加的 HTML 属性。
37 如果在这个数组里传递了键 'id',它将被用于表单元素 DOM id,并且 <code>$id</code>
43 如果不传递参数给 dijit 布局视图助手,那么助手将返回自己。
44 它允许你抓取内容,通常是更容易的传递内容给布局容器的方法。
51 <emphasis>Form Dijit</emphasis>: dijit.form.Form dijit,虽然对于使用 dijit
52 表单元素不是完全必要,但是它可以确保如果提交没有根据客户端校验而校验的表单时,
53 提交就被终止并且产生校验错误消息。该表单 dijit 视图助手可带有下列参数:
58 <code>$id</code>: 容器名或 DOM ID。
62 <code>$attribs</code> (可选):任何用于解析容器 div 的附加的 HTML 属性。
66 <code>$content</code> (可选):要封装到表单的内容。如果没有,将使用空的字符串。
71 为了和标准的 <code>form()</code> 视图助手保持兼容,参数顺序和其它 dijit 有些不同。
77 <emphasis> 表单元素 </emphasis>:设计上和 <code>Zend_Form</code> 一起使用,但也
78 可以在视图脚本中独立使用。每个 dijit 元素视图助手可以使用下列参数:
83 <code>$id</code>: 元素名或 DOM ID。
87 <code>$value</code> (可选):元素的当前值。
91 <code>$params</code> (可选): dijit-specific 参数。
92 基本上是任何用于配置 dijit 的非 HTML 属性。
96 <code>$attribs</code> (可选):任何用于解析 dijit的附加的 HTML 属性。
97 如果键 'id' 在这个数组中传递,它将被用于表单元素的 DOM id,
98 并且 <code>$id</code> 将被用于它的名字。
103 一些元素要求更多的参数,将在个别元素助手的描述中注明。
109 为了使用这些视图助手,你需要用视图对象来注册路径给 dojo 视图助手。
112 <example id="zend.dojo.view.dijit.prefixpath">
113 <title> 注册 Dojo 视图助手前缀路径 </title>
115 <programlisting role="php"><![CDATA[
116 $view->addHelperPath('Zend/Dojo/View/Helper', 'Zend_Dojo_View_Helper');
120 <sect3 id="zend.dojo.view.dijit.layout">
121 <title>Dijit 布局元素 </title>
124 dijit.layout 元素家族用来生成定制的、可预计的布局。任何关于用法的问题
126 url="http://dojotoolkit.org/book/dojo-book-0-9/part-2-dijit/layout">
131 所有的 dijit 布局元素都有签名 <code>string ($id = null, $content = '', array $params =
132 array(), array $attribs = array())</code>。
133 对于所有情况,如果不传递参数,就返回助手对象自己。
134 访问 <code>captureStart()</code> 和 <code>captureEnd()</code> 方法,它让你
141 <emphasis>AccordionContainer</emphasis>:dijit.layout.AccordionContainer。
142 垂直堆放所有的 pane ,点击一个 pane 的 titlebar 就会展开并显示特定的 pane。
145 <programlisting role="php"><![CDATA[
146 <?= $view->accordionContainer(
153 'style' => 'width: 200px; height: 300px;',
161 <emphasis>AccordionPane</emphasis>: dijit.layout.AccordionPane.
162 在 AccordionContainer 内使用。
165 <programlisting role="php"><![CDATA[
166 <?= $view->accordionPane(
170 'title' => 'Pane Title',
173 'style' => 'background-color: lightgray;',
181 <emphasis>BorderContainer</emphasis>:dijit.layout.BorderContainer。
182 用象传统程序中的可改变尺寸的 pane 来完成布局。
185 <programlisting role="php"><![CDATA[
186 <?= $view->borderContainer(
190 'design' => 'headline',
193 'style' => 'width: 100%; height: 100%',
201 <emphasis>ContentPane</emphasis>: dijit.layout.ContentPane。
202 用在除了 AccordionContainer 以外的任何容器内部。
205 <programlisting role="php"><![CDATA[
206 <?= $view->contentPane(
210 'title' => 'Pane Title',
214 'style' => 'width: 120px; background-color: lightgray;',
222 <emphasis>SplitContainer</emphasis>:dijit.layout.SplitContainer。
223 允许可变尺寸的内容 pane;在 Dojo 里废除转而使用 BorderContainer。
226 <programlisting role="php"><![CDATA[
227 <?= $view->splitContainer(
231 'orientation' => 'horizontal',
233 'activeSizing' => true,
236 'style' => 'width: 400px; height: 500px;',
244 <emphasis>StackContainer</emphasis>:dijit.layout.StackContainer。
245 所有在 StackContainer 里的 pane 放在一个堆栈里,生成按钮或功能一次显示一个。
248 <programlisting role="php"><![CDATA[
249 <?= $view->stackContainer(
254 'style' => 'width: 400px; height: 500px; border: 1px;',
262 <emphasis>TabContainer</emphasis>:dijit.layout.TabContainer。
263 所有在 TabContainer 里的 pane 放在一个堆栈里,并带有 tab 的位置,用于切换。
266 <programlisting role="php"><![CDATA[
267 <?= $view->stackContainer(
272 'style' => 'width: 400px; height: 500px; border: 1px;',
286 <code>captureStart($id, array $params = array(), array $attribs = array())</code>:
287 开始抓取内容到容器。<code>$params</code> 是和容器一起使用的 dijit 参数,
288 <code>$attribs</code> 指的是任何一般的 HTML 属性。
292 <emphasis> 只要 ids 没有重复 </emphasis>,容器在抓取的时候可以嵌套。
298 <code>captureEnd($id)</code>:
299 完成抓取内容到容器。<code>$id</code> 是指先前和 <code>captureStart()</code>
300 调用一起使用的 id。返回一个字符串表示容器和它的内容,就好像传递内容给助手自己。
305 <example id="zend.dojo.view.dijit.layout.borderexample">
306 <title>BorderContainer 布局 dijit 范例</title>
309 BorderContainers, 特别是当和抓取内容耦合时,对复杂的布局效果特别有用。
312 <programlisting role="php"><![CDATA[
313 $view->borderContainer()->captureStart('masterLayout', array('design' => 'headline'));
315 echo $view->contentPane(
317 'This is the menu pane',
318 array('region' => 'top'),
319 array('style' => 'background-color: darkblue;')
322 echo $view->contentPane(
324 'This is the navigation pane',
325 array('region' => 'left'),
326 array('style' => 'width: 200px; background-color: lightblue;')
329 echo $view->contentPane(
331 'This is the main content pane area',
332 array('region' => 'center'),
333 array('style' => 'background-color: white;')
336 echo $view->contentPane(
339 array('region' => 'bottom'),
340 array('style' => 'background-color: lightgray;')
343 echo $view->borderContainer()->captureEnd('masterLayout');
348 <sect3 id="zend.dojo.view.dijit.form">
349 <title>Dijit 表单元素 </title>
352 Dojo 的表单校验和输入 dijit 在 dijit.form 树中。
353 更多关于这些元素的一般用法和可接受的参数,请
355 url="http://dojotoolkit.org/book/dojo-book-0-9/part-2-dijit/form-validation-specialized-input">访问
356 dijit.form 文档</ulink>.
360 下列 dijit 表单元素在 Zend Framework 里可用。
361 除非注明,都有签名 <code>string ($id,
362 $value = '', array $params = array(), array $attribs =
369 <emphasis>Button</emphasis>: dijit.form.Button. 显示一个表单按钮
372 <programlisting role="php"><![CDATA[
376 array('iconClass' => 'myButtons'),
383 <emphasis>CheckBox</emphasis>:dijit.form.CheckBox.
384 显示一个 checkbox。接受可选的第五个参数,<code>$checkedOptions</code> 数组,
390 按顺序带两个值的索引数组,一个选中的值和一个未选中的值;或者
394 带键 'checkedValue' 和 'unCheckedValue'的联合数组。
399 如果没有提供 <code>$checkedOptions</code> 就假定为 1 和 0 。
402 <programlisting role="php"><![CDATA[
408 array('checkedValue' => 'foo', 'unCheckedValue' => 'bar')
415 <emphasis>ComboBox</emphasis>:dijit.layout.ComboBox.
416 组合框是一个混合体,包括选择框和带有自动完成的文字框。
417 关键是在列表里没有相应的选项的时候可以手工输入,而且是有效的。
418 它接受可选的第五个参数:联合数组 <code>$options</code>;如果提供
419 了该参数,ComboBox 就当作 <code>select</code> 被解析。也要注意
420 <code>$options</code> 数组的 <emphasis>标签值</emphasis> 在表单中返回,
425 另外,也可以传递关于和元素一起使用的 dojo.data 数据存储的信息。
426 如果提供该参数,ComboBox 就当作 <code>input</code> 被解析,
431 为了指定数据存储,请提供下列 <code>$params</code> 键组合之一:
437 键 'store',带有一个数组值;数组应包含下列键:
442 <emphasis>store</emphasis>:表示数据存储的 javascript 变量名
443 (this could be the name you would like for it to use)。
447 <emphasis>type</emphasis>:数据存储类型;例如:'dojo.data.ItemFileReadStore'。
451 <emphasis>params</emphasis> (可选):一个键/值对的联合数组,用来配置数据存储。
464 <emphasis>store</emphasis>:表示数据存储名的字符串。
468 <emphasis>storeType</emphasis>:表示数据存储 dojo.data 类型的字符传(例如 'dojo.data.ItemFileReadStore')。
472 <emphasis>storeParams</emphasis>:一个键/值对联合数组,用于配置数据存储。
478 <programlisting role="php"><![CDATA[
479 // As a select element:
480 echo $view->comboBox(
484 'autocomplete' => false,
494 // As a dojo.data-enabled element:
495 echo $view->comboBox(
499 'autocomplete' => false,
500 'store' => 'stateStore',
501 'storeType' => 'dojo.data.ItemFileReadStore',
502 'storeParams' => array('url' => '/js/states.json'),
510 <emphasis>CurrencyTextBox</emphasis>:dijit.form.CurrencyTextBox。
511 从 ValidationTextBox 继承,并提供货币的客户端校验。
512 它期望 dijit 参数 'currency' 的值是适当的三字符货币代码。
513 可以为 ValidationTextBox 和 TextBox 指定任何有效的 dijit 参数。
516 <programlisting role="php"><![CDATA[
517 echo $view->currencyTextBox(
520 array('currency' => 'USD'),
521 array('maxlength' => 20)
526 <title>Issues with Builds</title>
530 url="http://trac.dojotoolkit.org/ticket/7183">
531 和 build 层一起使用的 CurrencyTextBox 的已知问题
533 一个解决办法是确保文档的 Content-Type http-equiv meta tag 把字符集设置为 utf-8,
537 <programlisting role="php"><![CDATA[
538 $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=utf-8');
539 ?>]]></programlisting>
542 这当然意味着你需要确保 <code>headMeta()</code> 占位符在布局脚本中。
549 <emphasis>DateTextBox</emphasis>:dijit.form.DateTextBox.
550 从 ValidationTextBox 继承,提供客户端的日期校验和下拉式日历。
551 你可以指定任何 dijit 可用的参数给 ValidationTextBox 或 TextBox。
554 <programlisting role="php"><![CDATA[
555 echo $view->dateTextBox(
558 array('required' => true)
565 <emphasis>FilteringSelect</emphasis>:dijit.form.FilteringSelect。
566 和 ComboBox 类似,这是个选择/文字混合体,它可以从提供的选项列表
567 里读取或者从 dojo.data 数据存储里抓取。和 ComboBox 不一样的地方是
568 FilteringSelect 不允许输入不在列表里的选项。另外,它的操作和标准选择
569 一样,从选项值里选择而不是从标签里选择,当表单提交时返回它们。
573 请参考上述关于 ComboBox 范例和定义数据存储的可用选项的信息。
579 <emphasis>HorizontalSlider</emphasis> 和
580 <emphasis>VerticalSlider</emphasis>:
581 dijit.form.HorizontalSlider 和 dijit.form.VerticalSlider.
582 滑尺是 UI 小部件,用来在给定范围内选择数值的,这两个一个是水平的,一个是垂直的。
587 'minimum'、 'maximum' 和 'discreteValues',来定义值的范围。
593 'intermediateChanges' 用来表明当 handle 被拖的时候是否需要发出 onChange 事件。
597 'clickSelect' 用来允许在滑尺上点击来设置其值。
601 'pageIncrement' 通过 pageUp 和 pageDown 来增加/减少值。
605 'showButtons' 设置来允许在滑尺的一端显示按钮来操作数值。
610 Zend Framework 实现生成一个隐藏的元素来存储滑尺的数值。
614 你可以可选地为滑尺显示尺子或标签,可通过分配一个或多个 dijit 参数
615 'topDecoration' 和/或 'bottomDecoration'(水平滑尺) 或 'leftDecoration' 和/或
616 'rightDecoration' (垂直滑尺)来完成。它们有下列选项:
621 <emphasis>container</emphasis>:容器名称。
625 <emphasis>labels</emphasis> (可选):标签数组。
626 在滑尺的一端使用空字符串只为内部值提供标签。
627 当指定一个 'Labels' dijit 变量时必需。
631 <emphasis>dijit</emphasis> (可选):
632 HorizontalRule、HorizontalRuleLabels、 VerticalRule 或
633 VerticalRuleLabels 中的一个,缺省为尺子 dijits 之一。
638 <emphasis>params</emphasis> (可选):
639 配置尺子 dijit 的 dijit 参数,参数规范包括:
644 <emphasis>container</emphasis> (可选):
649 <emphasis>labels</emphasis> (可选):
656 <emphasis>attribs</emphasis> (可选):
657 和尺子/标签一起使用的 HTML 属性,遵循 <code>params</code> 选项格式并
658 且是一个带有键 'container' 和 'labels' 的联合数组。
662 <programlisting role="php"><![CDATA[
663 echo $view->horizontalSlider(
669 'discreteValues' => 11,
670 'intermediateChanges' => true,
671 'showButtons' => true,
672 'topDecoration' => array(
673 'container' => 'topContainer'
674 'dijit' => 'HorizontalRuleLabels',
684 'container' => array(
685 'style' => 'height:1.2em; font-size=75%;color:gray;',
688 'style' => 'height:1em; font-size=75%;color:gray;',
692 'bottomDecoration' => array(
693 'container' => 'bottomContainer'
700 'container' => array(
701 'style' => 'height:1.2em; font-size=75%;color:gray;',
704 'style' => 'height:1em; font-size=75%;color:gray;',
715 <emphasis>NumberSpinner</emphasis>:dijit.form.NumberSpinner。
720 期望用于 dijit 参数 'constraints' 的联合数值或者键 'min'、'max' 和 'places'
721 (这些也期望 constraints 参数的条目)。
722 'places' 可用于指示微调数的增加和减少的数值。
725 <programlisting role="php"><![CDATA[
726 echo $view->numberSpinner(
743 <emphasis>NumberTextBox</emphasis>:dijit.form.NumberTextBox。
744 NumberTextBox 可选地依靠给定的限制以本地化方式格式化和显示数字条目,同时也校验数字条目。
747 <programlisting role="php"><![CDATA[
748 echo $view->numberTextBox(
764 <emphasis>PasswordTextBox</emphasis>:
765 和密码输入相关的 dijit.form.ValidationTextBox。
766 PasswordTextBox 生成密码输入,并和当前的 dijit 主题匹配,同时也做客户端校验。
769 <programlisting role="php"><![CDATA[
770 echo $view->passwordTextBox(
785 <emphasis>RadioButton</emphasis>:dijit.form.RadioButton。
786 一组选项,但只能选一个,除了视觉上和其它 dijits 保持一致,
787 其它方面都和普通的单选(radio,也叫无线电按钮)元素一样。
791 RadioButton 接受可选的第五个参数,<code>$options</code>,
792 是个联合数组,值/标签对用作radio选项。
793 你可以以 <code>$attribs</code> 键 <code>options</code> 来传递。
796 <programlisting role="php"><![CDATA[
797 echo $view->radioButton(
813 <emphasis>SubmitButton</emphasis>:和提交元素相关的 dijit.form.Button。
814 参见按钮视图助手有更多的细节。主要的区别是这个按钮可以提交一个表单。
820 <emphasis>Textarea</emphasis>:dijit.form.Textarea.
821 除了有很多行以外,和普通的文本区域一样,它们按照用户类型来扩展。
825 <programlisting role="php"><![CDATA[
826 echo $view->textarea(
828 'Start writing here...',
830 array('style' => 'width: 300px;')
837 <emphasis>TextBox</emphasis>:dijit.form.TextBox。
838 该元素主要用来在不同的 dijit 元素之间提供一个通用的外观,
839 并对其它 TextBox 派生的类 (ValidationTextBox、 NumberTextBox、 CurrencyTextBox、
840 DateTextBox 和 TimeTextBox)提供基本功能。
844 普通的 dijit 参数标志包括 'lowercase' (转换成小写)、
846 'propercase' (转换成合适的大小写)和 trim (修剪引导和拖尾的空白字符);
847 它们都接受布尔值。另外,你可以指定参数 'size' 和 'maxLength'。
850 <programlisting role="php"><![CDATA[
856 'propercase' => true,
868 <emphasis>TimeTextBox</emphasis>: dijit.form.TimeTextBox。
869 也包含在 TextBox 家族,TimeTextBox 提供一个下拉式时间选择器。
870 Dijit 参数让你指定可用的时间增量以及有效的时间的可见范围。
873 <programlisting role="php"><![CDATA[
874 echo $view->timeTextBox(
879 'visibleIncrement' => 'T00:05:00', // 5-minute increments
880 'visibleRange' => 'T02:00:00', // show 2 hours of increments
892 <emphasis>ValidationTextBox</emphasis>:dijit.form.ValidateTextBox。
893 为文本元素提供客户端校验。从 TextBox 继承。
902 <emphasis>invalidMessage</emphasis>:当检测到一个无效的输入,就显示一条消息。
906 <emphasis>promptMessage</emphasis>:工具提示帮助信息。
910 <emphasis>regExp</emphasis>:用于校验文本的正则表达式,不需要边界记号。
914 <emphasis>required</emphasis>:确定元素是否必需。如果需要就把元素嵌入
915 dijit.form.Form,它将被标记为无效并防止提交。
919 <programlisting role="php"><![CDATA[
920 echo $view->validationTextBox(
926 'invalidMessage' => 'No spaces or non-word characters allowed',
927 'promptMessage' => 'Single word consisting of alphanumeric characters and underscores only',