Zend_Dojo-Data.xml 16 KB

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