Zend_Dojo-Data.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15103 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.dojo.data">
  5. <title>Zend_Dojo_Data: Envolturas de dojo.data</title>
  6. <para>
  7. Dojo proporciona abstracción de datos para los widgets de datos
  8. habilitados a través de su componente dojo.data. Este componente
  9. proporciona la capacidad de adjuntar un datastore, ofrecer algunos
  10. metadatos relativos al campo identidad, opcionalmente una etiqueta de
  11. campo, y una API para efectuar consultas, clasificación, recuperación
  12. de archivos y conjuntos de registros del datastore.
  13. </para>
  14. <para>
  15. dojo.data se utiliza a menudo con XmlHttpRequest para traer dinámicamente
  16. datos desde el servidor. El principal mecanismo para esto es extender
  17. el QueryReadStore para que apunte a una URL y especificar la información
  18. a consultar. El lado del servidor después devuelve los datos con el
  19. siguiente formato JSON:
  20. </para>
  21. <programlisting language="javascript"><![CDATA[
  22. {
  23. identifier: '<name>',
  24. <label: '<label>',>
  25. items: [
  26. { name: '...', label: '...', someKey: '...' },
  27. ...
  28. ]
  29. }
  30. ]]></programlisting>
  31. <para>
  32. <classname>Zend_Dojo_Data</classname> ofrece una interfaz simple para la
  33. construcción de estas estructuras programáticamente, interactuando
  34. con ellos, y serializándolos a un array o a JSON.
  35. </para>
  36. <sect2 id="zend.dojo.data.usage">
  37. <title>Uso de Zend_Dojo_Data</title>
  38. <para>
  39. En su forma más simple, dojo.data requiere que se proporcione el
  40. nombre del campo identificador en cada item, y un conjunto de
  41. items (datos). Puede pasarlos tanto via el constructor, o via mutators:
  42. </para>
  43. <example id="zend.dojo.data.usage.constructor">
  44. <title>Inicialización de Zend_Dojo_Data via constructor</title>
  45. <programlisting language="php"><![CDATA[
  46. $data = new Zend_Dojo_Data('id', $items);
  47. ]]></programlisting>
  48. </example>
  49. <example id="zend.dojo.data.usage.mutators">
  50. <title>Inicialización de Zend_Dojo_Data via mutators</title>
  51. <programlisting language="php"><![CDATA[
  52. $data = new Zend_Dojo_Data();
  53. $data->setIdentifier('id')
  54. ->addItems($items);
  55. ]]></programlisting>
  56. </example>
  57. <para>
  58. También puede añadir un solo item a la vez, o agregar items utilizando
  59. <methodname>addItem()</methodname> y <methodname>addItems()</methodname>.
  60. </para>
  61. <example id="zend.dojo.data.usage.append">
  62. <title>Agregando datos a <classname>Zend_Dojo_Data</classname></title>
  63. <programlisting language="php"><![CDATA[
  64. $data = new Zend_Dojo_Data($identifier, $items);
  65. $data->addItem($someItem);
  66. $data->addItems($someMoreItems);
  67. ]]></programlisting>
  68. </example>
  69. <note>
  70. <title>Siempre use un identificador!</title>
  71. <para>
  72. Cada datastore de dojo.data requiere que la columna identificadora
  73. se proporcione como metadatos, incluyendo
  74. <classname>Zend_Dojo_Data</classname>.
  75. De hecho, si intenta añadir items sin un identificador, se
  76. generará una excepción.
  77. </para>
  78. </note>
  79. <para>
  80. Los items individuales pueden ser uno de los siguientes:
  81. </para>
  82. <itemizedlist>
  83. <listitem><para>
  84. Arrays asociativos
  85. </para></listitem>
  86. <listitem><para>
  87. Objectos implementando un método <methodname>toArray()</methodname>
  88. </para></listitem>
  89. <listitem><para>
  90. Cualquiera de los otros objetos (se serializarán via get_object_vars())
  91. </para></listitem>
  92. </itemizedlist>
  93. <para>
  94. Puede adjuntar colecciones de los items anteriores via
  95. <methodname>addItems()</methodname> o <methodname>setItems()</methodname>
  96. (sobreescribe todos los items previamente establecidos); cuando lo
  97. haga, puede pasar un solo argumento:
  98. </para>
  99. <itemizedlist>
  100. <listitem><para>
  101. Arrays
  102. </para></listitem>
  103. <listitem><para>
  104. Objectos implementando la interfaz <methodname>Traversable</methodname>,
  105. que incluye las interfaces <methodname>Iterator</methodname> y
  106. <methodname>ArrayAccess</methodname>.
  107. </para></listitem>
  108. </itemizedlist>
  109. <para>
  110. Si quiere especificar un campo que actuará como una etiqueta para
  111. el item, llame a <methodname>setLabel()</methodname>:
  112. </para>
  113. <example id="zend.dojo.data.usage.label">
  114. <title>Especificando la etiqueta de un campo en
  115. <classname>Zend_Dojo_Data</classname></title>
  116. <programlisting language="php"><![CDATA[
  117. $data->setLabel('name');
  118. ]]></programlisting>
  119. </example>
  120. <para>
  121. Por último, también puede cargar un item
  122. <classname>Zend_Dojo_Data</classname>
  123. de un array JSON dojo.data, utilizando el método
  124. <methodname>fromJson()</methodname>.
  125. </para>
  126. <example id="zend.dojo.data.usage.populate">
  127. <title>Alimentando <classname>Zend_Dojo_Data</classname> desde JSON</title>
  128. <programlisting language="php"><![CDATA[
  129. $data->fromJson($json);
  130. ]]></programlisting>
  131. </example>
  132. </sect2>
  133. <sect2 id="zend.dojo.data.metadata">
  134. <title>Agregando metadatos a sus contenedores</title>
  135. <para>
  136. Algunos componentes de Dojo requieren metadatos adicionales junto
  137. al conjunto de datos de dojo.data.
  138. Como ejemplo, <methodname>dojox.grid.Grid</methodname> puede tirar datos
  139. dinámicamente desde un <methodname>dojox.data.QueryReadStore</methodname>.
  140. Para que la paginación funcione correctamente, cada conjunto de datos
  141. de regreso debería contener una clave <methodname>numRows</methodname> con el
  142. número total de filas que podrían ser devueltas por la consulta.
  143. Con estos datos, la plantilla sabe cuando seguir haciendo pequeños
  144. pedidos de subconjuntos de datos al servidor y cuando dejar de
  145. hacer más peticiones (es decir, ha llegado a la última página de
  146. datos). Esta técnica es útil para despachar grandes conjuntos de
  147. datos en sus plantillas sin cargar todo el conjunto de una sola vez.
  148. </para>
  149. <para>
  150. <classname>Zend_Dojo_Data</classname> permite asignar propiedades
  151. a los metadatos como al objeto. Lo siguiente ilustra su uso:
  152. </para>
  153. <programlisting language="php"><![CDATA[
  154. // Establece el "numRows" a 100
  155. $data->setMetadata('numRows', 100);
  156. // Establece varios items a la vez:
  157. $data->setMetadata(array(
  158. 'numRows' => 100,
  159. 'sort' => 'name',
  160. ));
  161. // Inspecciona un único valor de metadatos:
  162. $numRows = $data->getMetadata('numRows');
  163. // Inspecciona todos los metadatos:
  164. $metadata = $data->getMetadata();
  165. // Elimina un item de metadatos:
  166. $data->clearMetadata('numRows');
  167. // Elimina todos los metadatos:
  168. $data->clearMetadata();
  169. ]]></programlisting>
  170. </sect2>
  171. <sect2 id="zend.dojo.data.advanced">
  172. <title>Casos Avanzados de Uso</title>
  173. <para>
  174. Además de actuar como un contenedor de datos serializable,
  175. <classname>Zend_Dojo_Data</classname> también ofrece la posibilidad
  176. de manipular y recorrer los datos en una variedad de formas.
  177. </para>
  178. <para>
  179. <classname>Zend_Dojo_Data</classname> implementa las interfaces
  180. <methodname>ArrayAccess</methodname>, <methodname>Iterator</methodname>, y
  181. <methodname>Countable</methodname>. Por lo tanto, puede usar la recopilación de
  182. datos casi como si fuera un array.
  183. </para>
  184. <para>
  185. Todos los items son referenciados por el identificador de campo.
  186. Dado que los identificadores deben ser únicos, puede usar los
  187. valores de este campo para sacar los registros individuales.
  188. Hay dos maneras de hacer esto: con el método <methodname>getItem()</methodname>,
  189. o via notación de array.
  190. </para>
  191. <programlisting language="php"><![CDATA[
  192. // Usando getItem():
  193. $item = $data->getItem('foo');
  194. // O usando notación de array:
  195. $item = $data['foo'];
  196. ]]></programlisting>
  197. <para>
  198. Si conoce el identificador, puede utilizarlo para recuperar un item,
  199. actualizarlo, borrarlo, crearlo, o probarlo:
  200. </para>
  201. <programlisting language="php"><![CDATA[
  202. // Actualizar o crear un item:
  203. $data['foo'] = array('title' => 'Foo', 'email' => 'foo@foo.com');
  204. // Borrar un item:
  205. unset($data['foo']);
  206. // Efectuar una prueba para un item:
  207. if (isset($data[foo])) {
  208. }
  209. ]]></programlisting>
  210. <para>
  211. También puede hacer un loop sobre todos los items.
  212. Internamente, todos los items se almacenan como arrays.
  213. </para>
  214. <programlisting language="php"><![CDATA[
  215. foreach ($data as $item) {
  216. echo $item['title'] . ': ' . $item['description'] . "\n";
  217. }
  218. ]]></programlisting>
  219. <para>
  220. O inclusive contar para ver cuántos ítems tiene:
  221. </para>
  222. <programlisting language="php"><![CDATA[
  223. echo count($data), " items encontrados!";
  224. ]]></programlisting>
  225. <para>
  226. Por último, como la clase implementa <methodname>__toString()</methodname>,
  227. también puede convertirlo a JSON simplemente con "echo" de PHP o
  228. convertirlo a string:
  229. </para>
  230. <programlisting language="php"><![CDATA[
  231. echo $data; // echo como un string JSON
  232. $json = (string) $data; // conversión a string == conversión a JSON
  233. ]]></programlisting>
  234. <sect3 id="zend.dojo.data.advanced.methods">
  235. <title>Métodos Disponibles</title>
  236. <para>
  237. Además de los métodos necesarios para aplicar las interfaces
  238. enumeradas anteriormente, están disponibles los siguientes métodos.
  239. </para>
  240. <itemizedlist>
  241. <listitem><para>
  242. <methodname>setItems($items)</methodname>: establece varios items a la
  243. vez, sobrescribiendo cualquier item que figurase anteriormente
  244. en el objeto. <methodname>$items</methodname> debe ser un array o un
  245. objeto <methodname>Traversable</methodname>.
  246. </para></listitem>
  247. <listitem><para>
  248. <methodname>setItem($item, $id = null)</methodname>: establece un
  249. item individual, opcionalmente puede pasar un identificador
  250. explícito. Sobreescribe el item si ya existe en la colección.
  251. Los items válidos incluyen a arrays asociativos, objetos
  252. implementando <methodname>toArray()</methodname>, o cualquier objeto
  253. con propiedades públicas.
  254. </para></listitem>
  255. <listitem><para>
  256. <methodname>addItem($item, $id = null)</methodname>: añade un item
  257. individual, opcionalmente puede pasar un identificador
  258. explícito.
  259. Generará una excepción si el item ya existe en la colección.
  260. Los items válidos incluyen a arrays asociativos, objetos
  261. implementando <methodname>toArray()</methodname>, o cualquier objeto
  262. con propiedades públicas.
  263. </para></listitem>
  264. <listitem><para>
  265. <methodname>addItems($items)</methodname>: agrega múltiples items a la
  266. vez, añadiendolos a cualquiera de los items actuales.
  267. Generará una excepción si alguno de los nuevos items tiene
  268. un identificador concordante a un identificador ya existente
  269. en la colección. <methodname>$items</methodname> debe ser un array o un
  270. objeto <methodname>Traversable</methodname>.
  271. </para></listitem>
  272. <listitem><para>
  273. <methodname>getItems()</methodname>: recupera todos los items como un
  274. array de arrays.
  275. </para></listitem>
  276. <listitem><para>
  277. <methodname>hasItem($id)</methodname>: determina si un item con el
  278. identificador dado existe en la colección.
  279. </para></listitem>
  280. <listitem><para>
  281. <methodname>getItem($id)</methodname>: recupera un item con el
  282. identificador dado de la colección; el item retornado será
  283. un array asociativo. Si ningún item coincide, se devolverá
  284. un valor null.
  285. </para></listitem>
  286. <listitem><para>
  287. <methodname>removeItem($id)</methodname>: elimina de la colección un
  288. item con el identificador dado.
  289. </para></listitem>
  290. <listitem><para>
  291. <methodname>clearItems()</methodname>: elimina todos los items de la
  292. colección.
  293. </para></listitem>
  294. <listitem><para>
  295. <methodname>setIdentifier($identifier)</methodname>: establece el
  296. nombre del campo que representa el identificador único para
  297. cada item en la colección.
  298. </para></listitem>
  299. <listitem><para>
  300. <methodname>getIdentifier()</methodname>: recupera el nombre del campo
  301. identificador.
  302. </para></listitem>
  303. <listitem><para>
  304. <methodname>setLabel($label)</methodname>: establece el nombre de un
  305. campo para ser utilizado como la etiqueta a mostrar para
  306. un item.
  307. </para></listitem>
  308. <listitem><para>
  309. <methodname>getLabel()</methodname>: recupera la etiqueta del nombre
  310. del campo.
  311. </para></listitem>
  312. <listitem><para>
  313. <methodname>toArray()</methodname>: enviar el objeto a un array.
  314. Como mínimo, el array contendrá las claves 'identifier',
  315. 'items', y 'label' si una etiqueta de campo ha sido
  316. establecida en el objeto.
  317. </para></listitem>
  318. <listitem><para>
  319. <methodname>toJson()</methodname>: enviar el objeto a una representación JSON.
  320. </para></listitem>
  321. </itemizedlist>
  322. </sect3>
  323. </sect2>
  324. </sect1>
  325. <!--
  326. vim:se ts=4 sw=4 et:
  327. -->