Zend_Dojo-Data.xml 18 KB

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