Zend_Dojo-Data.xml 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. <sect1 id="zend.dojo.data">
  2. <title>Zend_Dojo_Data: dojo.data Envelopes</title>
  3. <para>
  4. Dojo 通过它的 dojo.data 组件为 data-enabled 小部件提供数据抽象。
  5. 该组件提供附加数据存储的能力,提供一些关于身份字段和可选的标签字段的元数据以及
  6. 从数据存储查询、排序和获取记录和一组记录的 API。
  7. </para>
  8. <para>
  9. dojo.data 常和XmlHttpRequest一起使用来从服务器取出动态数据。
  10. 它的基本机制是扩展 QueryReadStore 来指向一个 URL 并指定查询信息,服务器端就用
  11. 下列 JSON 格式来返回数据:
  12. </para>
  13. <programlisting role="javascript"><![CDATA[
  14. {
  15. identifier: '<name>',
  16. <label: '<label>',>
  17. items: [
  18. { name: '...', label: '...', someKey: '...' },
  19. ...
  20. ]
  21. }
  22. ]]>
  23. </programlisting>
  24. <para>
  25. <code>Zend_Dojo_Data</code> 提供一个简单的接口通过程序来构造这样的结构,
  26. 交互并系列化成一个数组或 JSON。
  27. </para>
  28. <sect2 id="zend.dojo.data.usage">
  29. <title>Zend_Dojo_Data 用法</title>
  30. <para>
  31. 很简单,dojo.data 要求你在每个条目和一组条目(数据)中提供标识符字段的名字。
  32. 你可以通过构造函数或 mutators 来传递它们:
  33. </para>
  34. <example id="zend.dojo.data.usage.constructor">
  35. <title>通过构造函数初始化 Zend_Dojo_Data</title>
  36. <programlisting role="php"><![CDATA[
  37. $data = new Zend_Dojo_Data('id', $items);
  38. ]]>
  39. </programlisting>
  40. </example>
  41. <example id="zend.dojo.data.usage.mutators">
  42. <title>通过 mutators 初始化 Zend_Dojo_Data</title>
  43. <programlisting role="php"><![CDATA[
  44. $data = new Zend_Dojo_Data();
  45. $data->setIdentifier('id')
  46. ->addItems($items);
  47. ]]>
  48. </programlisting>
  49. </example>
  50. <para>
  51. 用 <code>addItem()</code> 和 <code>addItems()</code> 添加一个单个条目或追加多个条目。
  52. </para>
  53. <example id="zend.dojo.data.usage.append">
  54. <title>追加数据到 Zend_Dojo_Data</title>
  55. <programlisting role="php"><![CDATA[
  56. $data = new Zend_Dojo_Data($identifier, $items);
  57. $data->addItem($someItem);
  58. $data->addItems($someMoreItems);
  59. ]]>
  60. </programlisting>
  61. </example>
  62. <note>
  63. <title> 永远使用标识符!</title>
  64. <para>
  65. 每个 dojo.data 数据存储要求以元数据来提供标识符列,<code>Zend_Dojo_Data</code> 也一样。
  66. 实际上,如果不用标识符添加条目,将会抛出异常。
  67. </para>
  68. </note>
  69. <para>
  70. 条目可以是下列其中之一:
  71. </para>
  72. <itemizedlist>
  73. <listitem><para>
  74. 联合数组
  75. </para></listitem>
  76. <listitem><para>
  77. 实现 <code>toArray()</code> 方法的对象
  78. </para></listitem>
  79. <listitem><para>
  80. 任何其它对象(将通过 get_object_vars() 系列化 )
  81. </para></listitem>
  82. </itemizedlist>
  83. <para>
  84. 你可以通过 <code>addItems()</code> 或 <code>setItems()</code>(覆盖先前的条目) 附加上述条目的集合;
  85. 用的时候,你可以传递一个参数:
  86. </para>
  87. <itemizedlist>
  88. <listitem><para>
  89. 数组
  90. </para></listitem>
  91. <listitem><para>
  92. 实现<code>Traversable</code>接口的对象(包括 <code>Iterator</code> 和 <code>ArrayAccess</code> 接口)。
  93. </para></listitem>
  94. </itemizedlist>
  95. <para>
  96. 如果想为条目指定一个用作标签的字段,调用<code>setLabel()</code>:
  97. </para>
  98. <example id="zend.dojo.data.usage.label">
  99. <title>在 Zend_Dojo_Data 里指定一个标签字段 </title>
  100. <programlisting role="php"><![CDATA[
  101. $data->setLabel('name');
  102. ]]>
  103. </programlisting>
  104. </example>
  105. <para>
  106. 最后,你也可以用 <code>fromJson()</code> 方法从 dojo.data JSON 数组加载一个 <code>Zend_Dojo_Data</code> 条目,
  107. </para>
  108. <example id="zend.dojo.data.usage.populate">
  109. <title> 从 JSON 组装 Zend_Dojo_Data </title>
  110. <programlisting role="php"><![CDATA[
  111. $data->fromJson($json);
  112. ]]>
  113. </programlisting>
  114. </example>
  115. </sect2>
  116. <sect2 id="zend.dojo.data.advanced">
  117. <title>高级用例</title>
  118. <para>
  119. 除了可以作为可系列化的数据容器,<code>Zend_Dojo_Data</code> 也可以用各种各样的方法处理和疏导(traverse)数据。
  120. </para>
  121. <para>
  122. <code>Zend_Dojo_Data</code> 实现 <code>ArrayAccess</code>、 <code>Iterator</code> 和 <code>Countable</code> 的接口。
  123. 这意味着你可以使用数据集合几乎就像使用数组一样。
  124. </para>
  125. <para>
  126. 所有的条目通过标识符字段来引用。因为表示符必须是独一无二的,你可用它的值来取出每个记录。
  127. 有两个方法可以做这个:通过 <code>getItem()</code> 方法,或通过数组符号。
  128. </para>
  129. <programlisting role="php"><![CDATA[
  130. // Using getItem():
  131. $item = $data->getItem('foo');
  132. // Or use array notation:
  133. $item = $data['foo'];
  134. ]]>
  135. </programlisting>
  136. <para>
  137. 如果你知道标识符,你可以用它来读取、更新、删除、创建或测试条目:
  138. </para>
  139. <programlisting role="php"><![CDATA[
  140. // Update or create an item:
  141. $data['foo'] = array('title' => 'Foo', 'email' => 'foo@foo.com');
  142. // Delete an item:
  143. unset($data['foo']);
  144. // Test for an item:
  145. if (isset($data[foo])) {
  146. }
  147. ]]>
  148. </programlisting>
  149. <para>
  150. 你也可以遍历所有条目,在内部,所有的条目以数组形式存储。
  151. </para>
  152. <programlisting role="php"><![CDATA[
  153. foreach ($data as $item) {
  154. echo $item['title'] . ': ' . $item['description'] . "\n";
  155. }
  156. ]]>
  157. </programlisting>
  158. <para>
  159. 甚至还可以数出你有多少条目:
  160. </para>
  161. <programlisting role="php"><![CDATA[
  162. echo count($data), " items found!";
  163. ]]>
  164. </programlisting>
  165. <para>
  166. 最后,因为这个类实现 <code>__toString()</code>, 你也可以通过 echo 它把它传给 JSON 或 字符串:
  167. </para>
  168. <programlisting role="php"><![CDATA[
  169. echo $data; // echo as JSON string
  170. $json = (string) $data; // cast to string == cast to JSON
  171. ]]>
  172. </programlisting>
  173. <sect3 id="zend.dojo.data.advanced.methods">
  174. <title> 可用的方法 </title>
  175. <para>
  176. 除了上述实现接口必须的方法外,下列方法也可用。
  177. </para>
  178. <itemizedlist>
  179. <listitem><para>
  180. <code>setItems($items)</code>: 一次设置多个条目,覆盖在对象里先前的任何条目。
  181. <code>$items</code> 是一个数组或一个 <code>Traversable</code> 对象。
  182. </para></listitem>
  183. <listitem><para>
  184. <code>setItem($item, $id = null)</code>: 设置一个条目,可选地传递一个显式标识符。
  185. 如果有的话,覆盖先前在集合里的条目。有效的条目包括联合数组,实现 <code>toArray()</code> 的对象或任何有 public 属性的对象。
  186. </para></listitem>
  187. <listitem><para>
  188. <code>addItem($item, $id = null)</code>: 添加一个条目,可选地传递一个显式标识符。
  189. 如果在集合理已经存在该条目,将产生异常。有效的条目包括联合数组,实现 <code>toArray()</code> 的对象或任何有 public 属性的对象。
  190. </para></listitem>
  191. <listitem><para>
  192. <code>addItems($items)</code>: 一次添加多个条目,追加到任何当前条目。如果新条目的标识符在集合理已经存在,将产生异常。
  193. <code>$items</code> 是一个数组或一个 <code>Traversable</code> 对象。
  194. </para></listitem>
  195. <listitem><para>
  196. <code>getItems()</code>: 以数组的数组(array of arrays)的形式获取所有条目。
  197. </para></listitem>
  198. <listitem><para>
  199. <code>hasItem($id)</code>: 确定一个条目的标识符是否在集合理存在。
  200. </para></listitem>
  201. <listitem><para>
  202. <code>getItem($id)</code>: 从集合里按给定的标识符获取一个条目;返回一个联合数组。
  203. 如果没有条目匹配,返回 null。
  204. </para></listitem>
  205. <listitem><para>
  206. <code>removeItem($id)</code>: 从集合里按给定的标识符删除一个条目。
  207. </para></listitem>
  208. <listitem><para>
  209. <code>clearItems()</code>: 从集合里删除所有条目。
  210. </para></listitem>
  211. <listitem><para>
  212. <code>setIdentifier($identifier)</code>: 为集合里的每个条目设置表示独一无二的标识符的字段名。
  213. </para></listitem>
  214. <listitem><para>
  215. <code>getIdentifier()</code>: 获取标识符字段的名字。
  216. </para></listitem>
  217. <listitem><para>
  218. <code>setLabel($label)</code>: 设置用于为条目显示标签的字段的名字。
  219. </para></listitem>
  220. <listitem><para>
  221. <code>getLabel()</code>: 读取标签字段名。
  222. </para></listitem>
  223. <listitem><para>
  224. <code>toArray()</code>: 传递对象到一个数组。数组里最少包含键 'identifier' 和 'items',
  225. 如果在对象里设置了标签,也要包含 'label'。
  226. </para></listitem>
  227. <listitem><para>
  228. <code>toJson()</code>: 传递对象给一个JSON 表达。
  229. </para></listitem>
  230. </itemizedlist>
  231. </sect3>
  232. </sect2>
  233. </sect1>
  234. <!--
  235. vim:se ts=4 sw=4 et:
  236. -->