Zend_Form-Elements.xml 77 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 19554 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.form.elements">
  5. <title>Creando elementos de formulario usando Zend_Form_Element</title>
  6. <para>
  7. Un formulario esta compuesto de elementos, que normalmente
  8. corresponden al elemento HTML
  9. input.
  10. <classname>Zend_Form_Element</classname>
  11. encapsula elementos de
  12. formulario individualmente, con las siguientes áreas de
  13. responsabilidad:
  14. </para>
  15. <itemizedlist>
  16. <listitem>
  17. <para>validación (¿los datos enviados son válidos?)</para>
  18. <itemizedlist>
  19. <listitem>
  20. <para>captura de códigos y mensajes de error</para>
  21. </listitem>
  22. </itemizedlist>
  23. </listitem>
  24. <listitem>
  25. <para>filtrado (¿cómo es escapado y normalizado el elemento para su
  26. validación y/o
  27. salida?</para>
  28. </listitem>
  29. <listitem>
  30. <para>generación (¿cómo es mostrado el elemento?)</para>
  31. </listitem>
  32. <listitem>
  33. <para>metadatos y atributos (¿qué información amplía la definición
  34. del elemento?)</para>
  35. </listitem>
  36. </itemizedlist>
  37. <para>
  38. La clase base,
  39. <classname>Zend_Form_Element</classname>
  40. , funciona por
  41. defecto para varios casos, pero es mejor extender la clase para
  42. elementos con
  43. fines especiales de uso común. Adicionalmente, Zend
  44. Framework contiene un número de elementos
  45. <acronym>XHTML</acronym>
  46. estándar; puede leer de ellos
  47. <link linkend="zend.form.standardElements">en el capítulo Elementos Estándares</link>
  48. </para>
  49. <sect2 id="zend.form.elements.loaders">
  50. <title>Cargadores de Plugin</title>
  51. <para>
  52. <classname>Zend_Form_Element</classname>
  53. hace uso de
  54. <link linkend="zend.loader.pluginloader">Zend_Loader_PluginLoader</link>
  55. para permitir a los
  56. desarrolladores especificar ubicaciones de validadores, filtros y
  57. decoradores alternos. Cada uno tiene su propio cargador de plugin
  58. asociado a él y métodos
  59. de acceso generales usados para su
  60. recuperación y modificación.
  61. </para>
  62. <para>Los siguientes tipos de cargadores son usados con los varios
  63. métodos del cargador de
  64. plugin: 'validate', 'filter', y 'decorator'.
  65. Los nombres son sensibles a mayúsculas y
  66. minúsculas.</para>
  67. <para>Los métodos usados para interactuar con los cargadores de plugin
  68. son los siguientes:</para>
  69. <itemizedlist>
  70. <listitem>
  71. <para>
  72. <methodname>setPluginLoader($loader, $type)</methodname>
  73. :
  74. <varname>$loader</varname>
  75. es el propio objeto cargador,
  76. mientras
  77. <varname>$type</varname>
  78. es uno de los tipos arriba
  79. mencionados. Esto establece el cargador de plugin para
  80. el
  81. tipo dado en el objeto cargador recién especificado.
  82. </para>
  83. </listitem>
  84. <listitem>
  85. <para>
  86. <methodname>getPluginLoader($type)</methodname>
  87. : obtiene el
  88. cargador de plugin asociado con
  89. <varname>$type</varname>
  90. .
  91. </para>
  92. </listitem>
  93. <listitem>
  94. <para>
  95. <methodname>addPrefixPath($prefix, $path, $type =
  96. null)</methodname>
  97. : agrega una asociación prefijo/ruta
  98. para el cargador especificado por
  99. <varname>$type</varname>
  100. .
  101. Si
  102. <varname>$type</varname>
  103. es null, se intentará agregar la
  104. ruta a todos los cargadores, añadiendo el
  105. prefijo a cada
  106. "_Validate", "_Filter" y "_Decorator"; y agregandole
  107. "Validate/",
  108. "Filter/" y "Decorator/" a la ruta. Si tiene
  109. todas sus clases extras para
  110. elementos de formulario dentro
  111. de una jerarquía común, este método es conveniente
  112. para
  113. establecer el prefijo para todas ellas.
  114. </para>
  115. </listitem>
  116. <listitem>
  117. <para>
  118. <methodname>addPrefixPaths(array $spec)</methodname>
  119. : le
  120. permite añadir varias rutas de una sola vez a uno o más
  121. cargadores de plugin.
  122. Se espera cada elemento de la matriz
  123. sea un array con claves 'path', 'prefix', y
  124. 'type'.
  125. </para>
  126. </listitem>
  127. </itemizedlist>
  128. <para>Validadores, filtros y decoradores personalizados son una manera
  129. simple de compartir
  130. funcionalidad entre formularios y encapsular
  131. funcionalidad personalizada.</para>
  132. <example id="zend.form.elements.loaders.customLabel">
  133. <title>Etiqueta personalizada</title>
  134. <para>Un uso común de los plugins es proveer reemplazos para las
  135. clases estándares. Por
  136. ejemplo, si desea proveer una
  137. implementación diferente del decorador 'Label' -- por
  138. ejemplo,
  139. para añadir siempre dos puntos -- puede crear su propio
  140. decorador 'Label' con
  141. su propio prefijo de clase, y entonces
  142. añadirlo a su prefijo de ruta.</para>
  143. <para>Comencemos con un decorador de etiqueta personalizado. Le
  144. daremos el prefijo
  145. "My_Decorator", y la clase estará en el
  146. archivo "My/Decorator/Label.php".</para>
  147. <programlisting language="php"><![CDATA[
  148. class My_Decorator_Label extends Zend_Form_Decorator_Abstract
  149. {
  150. protected $_placement = 'PREPEND';
  151. public function render($content)
  152. {
  153. if (null === ($element = $this->getElement())) {
  154. return $content;
  155. }
  156. if (!method_exists($element, 'getLabel')) {
  157. return $content;
  158. }
  159. $label = $element->getLabel() . ':';
  160. if (null === ($view = $element->getView())) {
  161. return $this->renderLabel($content, $label);
  162. }
  163. $label = $view->formLabel($element->getName(), $label);
  164. return $this->renderLabel($content, $label);
  165. }
  166. public function renderLabel($content, $label)
  167. {
  168. $placement = $this->getPlacement();
  169. $separator = $this->getSeparator();
  170. switch ($placement) {
  171. case 'APPEND':
  172. return $content . $separator . $label;
  173. case 'PREPEND':
  174. default:
  175. return $label . $separator . $content;
  176. }
  177. }
  178. }
  179. ]]></programlisting>
  180. <para>Ahora diremos al elemento que use esta ruta cuando busque por
  181. decoradores:</para>
  182. <programlisting language="php"><![CDATA[
  183. $element->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');
  184. ]]></programlisting>
  185. <para>Alternativamente, podemos hacerlo en el formulario para
  186. asegurar que todos los
  187. decoradores usen esta ruta:</para>
  188. <programlisting language="php"><![CDATA[
  189. $form->addElementPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');
  190. ]]></programlisting>
  191. <para>Con esta ruta añadida, cuando agregue un decorador, la ruta
  192. 'My/Decorator' será
  193. consultada primero en búsqueda de la
  194. existencia del decorador en este lugar. Como
  195. resultado,
  196. 'My_Decorator_Label' ahora será utilizado cuando el decorador
  197. 'Label' sea
  198. requerido.</para>
  199. </example>
  200. </sect2>
  201. <sect2 id="zend.form.elements.filters">
  202. <title>Filters</title>
  203. <para>
  204. A menudo es útil y/o necesario realizar alguna normalización en
  205. la entrada antes de la
  206. validación – por ejemplo, puede querer
  207. eliminar todo el
  208. <acronym>HTML</acronym>
  209. , pero realizar las
  210. validaciones sobre lo restante para asegurarse que el envío es
  211. válido. O puede eliminar los espacios en blanco al inicio o fin de
  212. la entrada para
  213. asegurarse de que un validador StringLenth (longitud
  214. de la cadena) no regrese un positivo
  215. falso. Estas operaciones pueden
  216. realizarse usando
  217. <classname>Zend_Filter</classname>
  218. , y
  219. <classname>Zend_Form_Element</classname>
  220. que soportan cadenas de
  221. filtros, permitiéndole especificar múltiples filtros secuenciales
  222. a
  223. utilizar. El filtrado sucede tanto en la validación como cuando
  224. recupera el valor del
  225. elemento vía
  226. <methodname>getValue()</methodname>
  227. :
  228. </para>
  229. <programlisting language="php"><![CDATA[
  230. $filtered = $element->getValue();
  231. ]]></programlisting>
  232. <para>Los filtros pueden ser agregados a la pila de dos maneras:</para>
  233. <itemizedlist>
  234. <listitem>
  235. <para>pasándolo en una instancia de filtro específica</para>
  236. </listitem>
  237. <listitem>
  238. <para>proveyendo un nombre de filtro – el correspondiente
  239. nombre corto o completo de
  240. la clase</para>
  241. </listitem>
  242. </itemizedlist>
  243. <para>Veamos algunos ejemplos:</para>
  244. <programlisting language="php"><![CDATA[
  245. // Instancia específica del filtro
  246. $element->addFilter(new Zend_Filter_Alnum());
  247. // El correspondiente nombre completo de la clase:
  248. $element->addFilter('Zend_Filter_Alnum');
  249. // Nombre corto del filtro:
  250. $element->addFilter('Alnum');
  251. $element->addFilter('alnum');
  252. ]]></programlisting>
  253. <para>Los nombres cortos son típicamente el nombre del filtro sin el
  254. prefijo. En el caso
  255. predeterminado, esto se refiere a sin el prefijo
  256. 'Zend_Filter_'. Además, la primera letra
  257. no necesita estar en
  258. mayúscula.</para>
  259. <note>
  260. <title>Usando clases de filtros personalizados</title>
  261. <para>
  262. Si tiene su propio conjunto de clases de filtro, puede
  263. informarle de ellas a
  264. <classname>Zend_Form_Element</classname>
  265. usando
  266. <methodname>addPrefixPath()</methodname>
  267. . Por ejemplo, si
  268. tiene filtros con el prefijo 'My_Filter', puede indicárselo a
  269. <classname>Zend_Form_Element</classname>
  270. de la siguiente
  271. manera:
  272. </para>
  273. <programlisting language="php"><![CDATA[
  274. $element->addPrefixPath('My_Filter', 'My/Filter/', 'filter');
  275. ]]></programlisting>
  276. <para>(Recuerde que el tercer argumento indica el cargador de
  277. plugin sobre el cual ha de
  278. ejecutarse la acción.)</para>
  279. </note>
  280. <para>
  281. Si en algún momento necesita un valor no filtrado, use el método
  282. <methodname>getUnfilteredValue()</methodname>
  283. :
  284. </para>
  285. <programlisting language="php"><![CDATA[
  286. $unfiltered = $element->getUnfilteredValue();
  287. ]]></programlisting>
  288. <para>
  289. Para mayor información sobre filtros, vea la
  290. <link linkend="zend.filter.introduction">documentación de
  291. Zend_Filter</link>
  292. .
  293. </para>
  294. <para>Métodos asociados con filtros incluyen:</para>
  295. <itemizedlist>
  296. <listitem>
  297. <para>
  298. <methodname>addFilter($nameOfFilter, array $options =
  299. null)</methodname>
  300. </para>
  301. </listitem>
  302. <listitem>
  303. <para>
  304. <methodname>addFilters(array $filters)</methodname>
  305. </para>
  306. </listitem>
  307. <listitem>
  308. <para>
  309. <methodname>setFilters(array $filters)</methodname>
  310. (sobreescribe todos los filtros)
  311. </para>
  312. </listitem>
  313. <listitem>
  314. <para>
  315. <methodname>getFilter($name)</methodname>
  316. (recupera un
  317. objeto filtro por su nombre)
  318. </para>
  319. </listitem>
  320. <listitem>
  321. <para>
  322. <methodname>getFilters()</methodname>
  323. (recupera todos los
  324. filtros)
  325. </para>
  326. </listitem>
  327. <listitem>
  328. <para>
  329. <methodname>removeFilter($name)</methodname>
  330. (elimina un
  331. filtro por su nombre)
  332. </para>
  333. </listitem>
  334. <listitem>
  335. <para>
  336. <methodname>clearFilters()</methodname>
  337. (elimina todos los
  338. filtros)
  339. </para>
  340. </listitem>
  341. </itemizedlist>
  342. </sect2>
  343. <sect2 id="zend.form.elements.validators">
  344. <title>Validadores</title>
  345. <para>
  346. Si sigue el mantra de seguridad "filtrar la entrada, escapar la
  347. salida" querrá validar
  348. ("filtrar la entrada") los datos de los
  349. formularios. En
  350. <classname>Zend_Form</classname>
  351. cada elemento
  352. contiene su propia cadena de validadores, consistente en validadores
  353. <methodname>Zend_Validate_*</methodname>
  354. .
  355. </para>
  356. <para>Los validadores pueden ser agregados de dos maneras:</para>
  357. <itemizedlist>
  358. <listitem>
  359. <para>pasándolo en una instancia de validador específica
  360. </para>
  361. </listitem>
  362. <listitem>
  363. <para>proveyendo un nombre de validador – el correspondiente
  364. nombre corto o completo
  365. de clase</para>
  366. </listitem>
  367. </itemizedlist>
  368. <para>Veamos algunos ejemplos:</para>
  369. <programlisting language="php"><![CDATA[
  370. // Instancia específica del validador:
  371. $element->addValidator(new Zend_Validate_Alnum());
  372. // El correspondiente nombre completo de la clase:
  373. $element->addValidator('Zend_Validate_Alnum');
  374. // Nombre corto del validador:
  375. $element->addValidator('Alnum');
  376. $element->addValidator('alnum');
  377. ]]></programlisting>
  378. <para>Los nombres cortos son típicamente el nombre del validador sin el
  379. prefijo. En el caso
  380. predeterminado, esto se refiere a sin el prefijo
  381. 'Zend_Validate_'. Además, la primera
  382. letra no necesita estar en
  383. mayúscula.</para>
  384. <note>
  385. <title>Usando clases de validación personalizadas</title>
  386. <para>
  387. Si tiene su propio conjunto de clases de validación, puede
  388. informarle de ellas a
  389. <classname>Zend_Form_Element</classname>
  390. usando
  391. <methodname>addPrefixPath()</methodname>
  392. . Por ejemplo, si
  393. tiene validadores con el prefijo 'My_Validator', puede
  394. indicárselo a
  395. <classname>Zend_Form_Element</classname>
  396. de la
  397. siguiente manera:
  398. </para>
  399. <programlisting language="php"><![CDATA[
  400. $element->addPrefixPath('My_Validator', 'My/Validator/', 'validate');
  401. ]]></programlisting>
  402. <para>(Recuerde que el tercer argumento indica el cargador de
  403. plugin sobre el cual ha de
  404. ejecutarse la acción.)</para>
  405. </note>
  406. <para>
  407. Si el fallo de un validador debe evitar validaciones posteriores,
  408. pase el boleano
  409. <constant>TRUE</constant>
  410. como segundo parámetro:
  411. </para>
  412. <programlisting language="php"><![CDATA[
  413. $element->addValidator('alnum', true);
  414. ]]></programlisting>
  415. <para>
  416. Si está usando la cadena nombre para añadir el validador, y la
  417. clase del validador acepta
  418. argumentos para su constructor, puede
  419. pasarlos a el tercer parámetro de
  420. <methodname>addValidator()</methodname>
  421. como un array:
  422. </para>
  423. <programlisting language="php"><![CDATA[
  424. $element->addValidator('StringLength', false, array(6, 20));
  425. ]]></programlisting>
  426. <para>
  427. Los argumentos pasados de esta manera deben estar en el orden en
  428. el cual son definidos en
  429. el constructor. El ejemplo de arriba
  430. instanciará la clase
  431. <classname>Zend_Validate_StringLenth</classname>
  432. con los
  433. parámetros
  434. <varname>$min</varname>
  435. y
  436. <varname>$max</varname>
  437. :
  438. </para>
  439. <programlisting language="php"><![CDATA[
  440. $validator = new Zend_Validate_StringLength(6, 20);
  441. ]]></programlisting>
  442. <note>
  443. <title>Estipulando mensajes de error de validación
  444. personalizados</title>
  445. <para>
  446. Algunos desarrolladores querrán estipular mensajes de error
  447. personalizados para un
  448. validador. El argumento
  449. <varname>$options</varname>
  450. de
  451. <methodname>Zend_Form_Element::addValidator()</methodname>
  452. le permite hacerlo proporcionando la clave 'messages' y
  453. estableciendolos en un array
  454. de pares clave/valor para
  455. especificar las plantillas de mensaje. Necesitará conocer
  456. los
  457. códigos de error de los diferentes tipos de error de un
  458. validador en particular.
  459. </para>
  460. <para>
  461. Una opción mejor es usar
  462. <classname>Zend_Translate_Adapter</classname>
  463. con su
  464. formulario. Los códigos de error son automáticamente pasados al
  465. adaptador por
  466. el decorador Errors por defecto; puede especificar
  467. su propias cadenas de mensaje de
  468. error mediante la creación de
  469. traducciones para los varios códigos de error de sus
  470. validadores.
  471. </para>
  472. </note>
  473. <para>
  474. Puede también establecer varios validadores a la vez, usando
  475. <methodname>addValidators()</methodname>
  476. . Su uso básico es pasar
  477. una matriz de arrays, donde cada array contenga de 1 a 3
  478. valores,
  479. correspondientes al constructor de
  480. <methodname>addValidator()</methodname>
  481. :
  482. </para>
  483. <programlisting language="php"><![CDATA[
  484. $element->addValidators(array(
  485. array('NotEmpty', true),
  486. array('alnum'),
  487. array('stringLength', false, array(6, 20)),
  488. ));
  489. ]]></programlisting>
  490. <para>Si quiere ser más detallado o explícito, puede utilizar las
  491. claves 'validator',
  492. 'breakChainOnFailure', y 'options' en el array:</para>
  493. <programlisting language="php"><![CDATA[
  494. $element->addValidators(array(
  495. array(
  496. 'validator' => 'NotEmpty',
  497. 'breakChainOnFailure' => true),
  498. array('validator' => 'alnum'),
  499. array(
  500. 'validator' => 'stringLength',
  501. 'options' => array(6, 20)),
  502. ));
  503. ]]></programlisting>
  504. <para>Este uso es bueno para ilustrar cómo puede configurar validadores
  505. en un archivo de
  506. configuración:</para>
  507. <programlisting language="ini"><![CDATA[
  508. element.validators.notempty.validator = "NotEmpty"
  509. element.validators.notempty.breakChainOnFailure = true
  510. element.validators.alnum.validator = "Alnum"
  511. element.validators.strlen.validator = "StringLength"
  512. element.validators.strlen.options.min = 6
  513. element.validators.strlen.options.max = 20
  514. ]]></programlisting>
  515. <para>Note que cada elemento tiene una clave, la necesite o no; esta es
  516. una limitación del
  517. uso de archivos de configuración -- pero también
  518. ayuda a hacer más explicito el para qué
  519. son usados los argumentos.
  520. Sólo recuerde que cualesquiera opciones del validador deben
  521. ser
  522. especificadas en orden.</para>
  523. <para>
  524. Para validar un elemento, pase el valor a
  525. <methodname>isValid()</methodname>
  526. :
  527. </para>
  528. <programlisting language="php"><![CDATA[
  529. if ($element->isValid($value)) {
  530. // válido
  531. } else {
  532. // no válido
  533. }
  534. ]]></programlisting>
  535. <note>
  536. <title>Validación operando en valores filtrados</title>
  537. <para>
  538. <methodname>Zend_Form_Element::isValid()</methodname>
  539. > siempre
  540. filtra los valores antes de la validación a través de la cadena
  541. de filtros.
  542. Vea
  543. <link linkend="zend.form.elements.filters">la
  544. sección de filtros</link>
  545. para más información.
  546. </para>
  547. </note>
  548. <note>
  549. <title>Contexto de validación</title>
  550. <para>
  551. <methodname>Zend_Form_Element::isValid()</methodname>
  552. > soporta
  553. un argumento adicional,
  554. <varname>$context</varname>
  555. .
  556. <methodname>Zend_Form::isValid()</methodname>
  557. pasa todo el
  558. conjunto de datos procesados a
  559. <varname>$context</varname>
  560. cuando valida un formulario, y
  561. <methodname>Zend_Form_Element::isValid()</methodname>
  562. >, a su
  563. vez, lo pasa a cada validador. Esto significa que puede escribir
  564. validadores
  565. que son conscientes de los datos pasados a otros
  566. elementos del formulario. Como
  567. ejemplo, considere un formulario
  568. de registro estándar que tiene campos para la
  569. contraseña y la
  570. confirmación de la contraseña; una validación sería que los dos
  571. campos coincidan. Este validador puede tener un aspecto como el
  572. siguiente:
  573. </para>
  574. <programlisting language="php"><![CDATA[
  575. class My_Validate_PasswordConfirmation extends Zend_Validate_Abstract
  576. {
  577. const NOT_MATCH = 'notMatch';
  578. protected $_messageTemplates = array(
  579. self::NOT_MATCH => 'Password confirmation does not match'
  580. );
  581. public function isValid($value, $context = null)
  582. {
  583. $value = (string) $value;
  584. $this->_setValue($value);
  585. if (is_array($context)) {
  586. if (isset($context['password_confirm'])
  587. && ($value == $context['password_confirm']))
  588. {
  589. return true;
  590. }
  591. } elseif (is_string($context) && ($value == $context)) {
  592. return true;
  593. }
  594. $this->_error(self::NOT_MATCH);
  595. return false;
  596. }
  597. }
  598. ]]></programlisting>
  599. </note>
  600. <para>
  601. Los validadores son procesados en orden. Cada validador es
  602. procesado, a menos que un
  603. validador creado con un valor true para
  604. <methodname>breakChainOnFailure</methodname>
  605. falle su
  606. validación. Asegúrese de especificar sus validadores en un orden
  607. razonable.
  608. </para>
  609. <para>Después de una validación fallida, puede recuperar los códigos y
  610. mensajes de error de
  611. la cadena del validador:</para>
  612. <programlisting language="php"><![CDATA[
  613. $errors = $element->getErrors();
  614. $messages = $element->getMessages();
  615. ]]></programlisting>
  616. <para>(Nota: los mensajes de error retornados son un array asociativo
  617. de pares código /
  618. mensaje de error.)</para>
  619. <para>
  620. En adición a los validadores, puede especificar que un elemento
  621. es necesario, usando
  622. <methodname>setRequired(true)</methodname>
  623. . Por
  624. defecto, esta bandera es
  625. <constant>FALSE</constant>
  626. , lo que
  627. significa que pasará su cadena de validadores si ningún valor es
  628. pasado a
  629. <methodname>isValid()</methodname>
  630. . Puede modificar este
  631. comportamiento en un número de maneras:
  632. </para>
  633. <itemizedlist>
  634. <listitem>
  635. <para>
  636. Por defecto, cuando un elemento es requerido, una
  637. bandera, 'allowEmpty', también
  638. es true. Esto quiere decir
  639. que si un valor empty es evaluado pasándolo a
  640. <methodname>isValid()</methodname>
  641. , los validadores
  642. serán saltados. Puede intercalar esta bandera usando el
  643. método
  644. de acceso
  645. <methodname>setAllowEmpty($flag)</methodname>
  646. ; cuando la
  647. bandera es false, si un valor es pasado, los validadores
  648. seguirán
  649. ejecutándose.
  650. </para>
  651. </listitem>
  652. <listitem>
  653. <para>
  654. Por defecto, si un elemento es requerido, pero no
  655. contiene un validador
  656. 'NotEmpty',
  657. <methodname>isValid()</methodname>
  658. añadirá uno en la
  659. cima de la pila, con la bandera
  660. <methodname>breakChainOnFailure</methodname>
  661. establecido. Esto hace que la bandera requerida tenga un
  662. significado semántico:
  663. si ningún valor es pasado,
  664. inmediatamente invalidamos el envío y se le notifica
  665. al
  666. usuario, e impedimos que otros validadores se ejecuten en lo
  667. que ya sabemos son
  668. datos inválidos.
  669. </para>
  670. <para>
  671. Si no quiere este comportamiento, puede desactivarlo
  672. pasando un valor false a
  673. <methodname>setAutoInsertNotEmptyValidator($flag)</methodname>
  674. ;
  675. esto prevendrá a
  676. <methodname>isValid()</methodname>
  677. de
  678. colocar un validador 'NotEmpty' en la cadena de
  679. validaciones.
  680. </para>
  681. </listitem>
  682. </itemizedlist>
  683. <para>
  684. Para mayor información sobre validadores, vea la
  685. <link linkend="zend.validate.introduction">documentación de
  686. Zend_Validate</link>
  687. .
  688. </para>
  689. <note>
  690. <title>Usando Zend_Form_Elements como validador de propósito
  691. general</title>
  692. <para>
  693. <classname>Zend_Form_Element</classname>
  694. implementa
  695. <classname>Zend_Validate_Interface</classname>
  696. , significando
  697. un elemento puede también usarse como un validador en otro,
  698. cadenas de
  699. validación no relacionadas al formulario.
  700. </para>
  701. </note>
  702. <para>Métodos asociados con validación incluyen:</para>
  703. <itemizedlist>
  704. <listitem>
  705. <para>
  706. <methodname>setRequired($flag)</methodname>
  707. y
  708. <methodname>isRequired()</methodname>
  709. permiten
  710. establecer y recuperar el estado de la bandera 'required'.
  711. Cuando se le
  712. asigna un booleano
  713. <constant>TRUE</constant>
  714. ,
  715. esta bandera requiere que el elemento esté presente en la
  716. información procesada
  717. por
  718. <classname>Zend_Form</classname>
  719. .
  720. </para>
  721. </listitem>
  722. <listitem>
  723. <para>
  724. <methodname>setAllowEmpty($flag)</methodname>
  725. y
  726. <methodname>getAllowEmpty()</methodname>
  727. permiten
  728. modificar el comportamiento de elementos opcionales (p.e.,
  729. elementos
  730. donde la bandera required es false). Cuando la
  731. bandera 'allow empty' es
  732. <constant>TRUE</constant>
  733. , valores
  734. vacíos no pasarán la cadena de validadores.
  735. </para>
  736. </listitem>
  737. <listitem>
  738. <para>
  739. <methodname>setAutoInsertNotEmptyValidator($flag)</methodname>
  740. permite especificar si realmente un validador 'NotEmpty'
  741. será añadido el inicio
  742. de la cadena de validaciones cuando
  743. un elemento es requerido. Por defecto, esta
  744. bandera es
  745. <constant>TRUE</constant>
  746. .
  747. </para>
  748. </listitem>
  749. <listitem>
  750. <para>
  751. <methodname>addValidator($nameOrValidator,
  752. $breakChainOnFailure = false, array
  753. $options =
  754. null)</methodname>
  755. </para>
  756. </listitem>
  757. <listitem>
  758. <para>
  759. <methodname>addValidators(array $validators)</methodname>
  760. </para>
  761. </listitem>
  762. <listitem>
  763. <para>
  764. <methodname>setValidators(array $validators)</methodname>
  765. (sobreescribe todos los validadores)
  766. </para>
  767. </listitem>
  768. <listitem>
  769. <para>
  770. <methodname>getValidator($name)</methodname>
  771. (recupera un
  772. objeto validador por nombre)
  773. </para>
  774. </listitem>
  775. <listitem>
  776. <para>
  777. <methodname>getValidators()</methodname>
  778. (recupera todos los
  779. validadores)
  780. </para>
  781. </listitem>
  782. <listitem>
  783. <para>
  784. <methodname>removeValidator($name)</methodname>
  785. (elimina un
  786. validador por nombre)
  787. </para>
  788. </listitem>
  789. <listitem>
  790. <para>
  791. <methodname>clearValidators()</methodname>
  792. (elimina todos
  793. los validadores)
  794. </para>
  795. </listitem>
  796. </itemizedlist>
  797. <sect3 id="zend.form.elements.validators.errors">
  798. <title>Errores de mensaje personalizados</title>
  799. <para>Alguna veces, querrá especificar uno o más mensajes de error
  800. para usarlos en lugar
  801. de los mensajes de error generados por los
  802. validadores adjuntos a los elementos.
  803. Adicionalmente, algunas
  804. veces usted mismo querrá marcar al elemento como inválido. A
  805. partir de 1.6.0, esta funcionalidad es posible vía los
  806. siguientes métodos.</para>
  807. <itemizedlist>
  808. <listitem>
  809. <para>
  810. <methodname>addErrorMessage($message)</methodname>
  811. :
  812. añade un mensaje de error para mostrarlos en forma de
  813. errores de validación.
  814. Puede llamarlo más de una vez, y
  815. los nuevos mensajes nuevos son añadidos a la
  816. pila.
  817. </para>
  818. </listitem>
  819. <listitem>
  820. <para>
  821. <methodname>addErrorMessages(array
  822. $messages)</methodname>
  823. : añade múltiples mensajes de
  824. error para mostrarlos en forma de errores de
  825. validación.
  826. </para>
  827. </listitem>
  828. <listitem>
  829. <para>
  830. <methodname>setErrorMessages(array
  831. $messages)</methodname>
  832. : añade múltiples mensajes de
  833. error para mostrarlos en forma de errores de
  834. validación,
  835. sobreescribiendo todos los mensajes de error previamente
  836. establecidos.
  837. </para>
  838. </listitem>
  839. <listitem>
  840. <para>
  841. <methodname>getErrorMessages()</methodname>
  842. : recupera la
  843. lista de mensajes de error personalizados que fueron
  844. definidos.
  845. </para>
  846. </listitem>
  847. <listitem>
  848. <para>
  849. <methodname>clearErrorMessages()</methodname>
  850. : remueve
  851. todos los mensajes de error personalizados que hayan
  852. sido definidos.
  853. </para>
  854. </listitem>
  855. <listitem>
  856. <para>
  857. <methodname>markAsError()</methodname>
  858. : marca al
  859. elemento como que falló la validación.
  860. </para>
  861. </listitem>
  862. <listitem>
  863. <para>
  864. <methodname>hasErrors()</methodname>
  865. : determina si el
  866. elemento ha fallado la validación o ha sido marcado como
  867. inválido.
  868. </para>
  869. </listitem>
  870. <listitem>
  871. <para>
  872. <methodname>addError($message)</methodname>
  873. : añade un
  874. mensaje a la pila de mensaje de error personalizados y
  875. marca al
  876. elemento como inválido.
  877. </para>
  878. </listitem>
  879. <listitem>
  880. <para>
  881. <methodname>addErrors(array $messages)</methodname>
  882. :
  883. añade varios mensajes a la pila de mensajes de error
  884. personalizados y marca
  885. al elemento como inválido.
  886. </para>
  887. </listitem>
  888. <listitem>
  889. <para>
  890. <methodname>setErrors(array $messages)</methodname>
  891. :
  892. sobreescribe el mensaje de error personalizado en la
  893. pila con los mensajes
  894. previstos y marca al elemento como
  895. inválido.
  896. </para>
  897. </listitem>
  898. </itemizedlist>
  899. <para>Todos los errores establecidos de este modo pueden ser
  900. traducidos. Adicionalmente,
  901. puede insertar el marcador "%value%"
  902. para representar el valor del elemento; este
  903. valor actual del
  904. elemento será sustituido cuando el mensaje de error sea
  905. recuperado.</para>
  906. </sect3>
  907. </sect2>
  908. <sect2 id="zend.form.elements.decorators">
  909. <title>Decoradores</title>
  910. <para>
  911. Una dolencia particular para muchos desarrolladores web es la
  912. creación del
  913. <acronym>XHTML</acronym>
  914. para formularios por ellos
  915. mismos. Para cada elemento, el desarrollador necesita crear la
  916. marcación para el elemento mismo, comúnmente una etiqueta (label),
  917. y, si son amables con
  918. sus usuarios, la marcación para mostrar
  919. mensajes de errores de validación. Cuanto más
  920. elementos en una
  921. página, menos trivial se convierte esta tarea.
  922. </para>
  923. <para>
  924. <classname>Zend_Form_Element</classname>
  925. intenta resolver este
  926. problema mediante el uso de "decoradores". Los decoradores son
  927. clases simples que tienen métodos de acceso al elemento y métodos
  928. para generar el
  929. contenido. Para obtener mayor información sobre cómo
  930. trabajan los decoradores, consulte
  931. por favor la sección sobre
  932. <link linkend="zend.form.decorators">Zend_Form_Decorator</link>
  933. .
  934. </para>
  935. <para>
  936. Los decoradores usados por defecto por
  937. <classname>Zend_Form_Element</classname>
  938. son:
  939. </para>
  940. <itemizedlist>
  941. <listitem>
  942. <para>
  943. <emphasis>ViewHelper</emphasis>
  944. : especifica un view helper
  945. que usar para general el elemento. El atributo
  946. 'helper' del
  947. elemento puede usarse para especificar qué auxiliar vista
  948. usar. Por
  949. defecto,
  950. <classname>Zend_Form_Element</classname>
  951. especifica el auxiliar vista 'formText', pero cada subclase
  952. especifica diferentes
  953. auxiliares.
  954. </para>
  955. </listitem>
  956. <listitem>
  957. <para>
  958. <emphasis>Errors</emphasis>
  959. : añade mensajes de error al
  960. elemento usando
  961. <classname>Zend_View_Helper_FormErrors</classname>
  962. . Si
  963. no está presente, no se añade nada.
  964. </para>
  965. </listitem>
  966. <listitem>
  967. <para>
  968. <emphasis>Description</emphasis>:
  969. añade la descripción del
  970. elemento. Si no está presente, no se añade nada. Por
  971. defecto, la descripción es generada dentro de una etiqueta
  972. &lt;p&gt; con un class
  973. 'description'.
  974. </para>
  975. </listitem>
  976. <listitem>
  977. <para>
  978. <emphasis>HtmlTag</emphasis>:
  979. envuelve el elemento y los
  980. errores en una etiqueta HTML &lt;dd&gt;.
  981. </para>
  982. </listitem>
  983. <listitem>
  984. <para>
  985. <emphasis>Label</emphasis>
  986. : añade al comienzo una etiqueta
  987. al elemento usando
  988. <classname>Zend_View_Helper_FormLabel</classname>,
  989. y
  990. envolviéndola en una etiqueta &lt;dt&gt;. Si ninguna
  991. etiqueta es provista, solo
  992. la etiqueta de la definición es
  993. generada.
  994. </para>
  995. </listitem>
  996. </itemizedlist>
  997. <note>
  998. <title>Decoradores por defecto no necesitan ser cargados</title>
  999. <para>Por defecto, los decoradores por defecto son cargados durante
  1000. la inicialización del
  1001. objeto. Puede deshabilitar esto pasando la
  1002. opción 'disableLoadDefaultDecorators' al
  1003. constructor:</para>
  1004. <programlisting language="php"><![CDATA[
  1005. $element = new Zend_Form_Element('foo',
  1006. array('disableLoadDefaultDecorators' =>
  1007. true)
  1008. );
  1009. ]]></programlisting>
  1010. <para>
  1011. Esta opción puede ser combinada junto con cualquier otra
  1012. opción que pase, ya sea como
  1013. un array de opciones o en un objeto
  1014. <classname>Zend_Config</classname>
  1015. .
  1016. </para>
  1017. </note>
  1018. <para>Ya que el orden en el cual los decoradores son registrados
  1019. importa -- el primer
  1020. decorador registrado es ejecutado primero --
  1021. necesitará estar seguro de registrar sus
  1022. decoradores en el orden
  1023. apropiado, o asegurarse de que estableció las opciones de
  1024. colocación
  1025. en el modo apropiado. Por dar un ejemplo, aquí esta el código que
  1026. registran los
  1027. decoradores por defecto:</para>
  1028. <programlisting language="php"><![CDATA[
  1029. $this->addDecorators(array(
  1030. array('ViewHelper'),
  1031. array('Errors'),
  1032. array('Description', array('tag' => 'p', 'class' => 'description')),
  1033. array('HtmlTag', array('tag' => 'dd')),
  1034. array('Label', array('tag' => 'dt')),
  1035. ));
  1036. ]]></programlisting>
  1037. <para>El contenido inicial es creado por el decorador 'ViewHelper', que
  1038. crea el propio
  1039. elemento. En seguida, el decorador 'Errors' consulta
  1040. los mensajes de error del elemento,
  1041. y, si hay alguno presente, los
  1042. pasa al auxiliar vista 'FormErrors' para mostrarlos. Si
  1043. una
  1044. descripción está presente, el decorador 'Description' añadirá un
  1045. párrafo con class
  1046. 'description' conteniendo el texto descriptivo
  1047. para el contenido agregado. El siguiente
  1048. decorador, 'HtmlTag',
  1049. envuelve al elemento, los errores, y la descripción en una etiqueta
  1050. HTML &lt;dd&gt;. Finalmente, el último decorador, 'label',
  1051. recupera la etiqueta del
  1052. elemento y la pasa al auxiliar vista
  1053. 'FormLabel', envolviéndolo en una etiqueta
  1054. &lt;dt&gt;; por
  1055. default el valor es añadido al inicio del contenido. El resultado de
  1056. la
  1057. salida básicamente se ve así:</para>
  1058. <programlisting language="html"><![CDATA[
  1059. <dt><label for="foo" class="optional">Foo</label></dt>
  1060. <dd>
  1061. <input type="text" name="foo" id="foo" value="123" />
  1062. <ul class="errors">
  1063. <li>"123" is not an alphanumeric value</li>
  1064. </ul>
  1065. <p class="description">
  1066. This is some descriptive text regarding the element.
  1067. </p>
  1068. </dd>
  1069. ]]></programlisting>
  1070. <para>
  1071. Para más información sobre decoradores, lea la
  1072. <link linkend="zend.form.decorators"> sección de
  1073. Zend_Form_Decorator</link>
  1074. .
  1075. </para>
  1076. <note>
  1077. <title>Usando múltiples decoradores al mismo tiempo</title>
  1078. <para>
  1079. Internamente,
  1080. <classname>Zend_Form_Element</classname>
  1081. utiliza una clase decorador como mecanismo de búsqueda para la
  1082. recuperación de
  1083. decoradores. Como resultado, no puede registrar
  1084. múltiples decoradores del mismo tipo;
  1085. decoradores subsecuentes
  1086. simplemente sobreescribirán aquellos que ya existían.
  1087. </para>
  1088. <para>
  1089. Para evitar esto, puede usar
  1090. <emphasis>alias</emphasis>
  1091. . En
  1092. lugar de pasar un decorador o nombre de decorador como primer
  1093. argumento a
  1094. <methodname>addDecorator()</methodname>
  1095. , pase una
  1096. matriz con un solo elemento, con el alias apuntando al nombre o
  1097. objeto
  1098. decorador:
  1099. </para>
  1100. <programlisting language="php"><![CDATA[
  1101. // Alias a 'FooBar':
  1102. $element->addDecorator(array('FooBar' => 'HtmlTag'),
  1103. array('tag' => 'div'));
  1104. // Y recuperandolo posteriormente:
  1105. $decorator = $element->getDecorator('FooBar');
  1106. ]]></programlisting>
  1107. <para>
  1108. En los métodos
  1109. <methodname>addDecorators()</methodname>
  1110. y
  1111. <methodname>setDecorators()</methodname>
  1112. , necesitará pasar
  1113. la opción 'decorator' en la matriz representando el decorador:
  1114. </para>
  1115. <programlisting language="php"><![CDATA[
  1116. // Y dos decoradores 'HtmlTag', 'FooBar' como alias:
  1117. $element->addDecorators(
  1118. array('HtmlTag', array('tag' => 'div')),
  1119. array(
  1120. 'decorator' => array('FooBar' => 'HtmlTag'),
  1121. 'options' => array('tag' => 'dd')
  1122. ),
  1123. );
  1124. // Y recuperándolos posteriormente:
  1125. $htmlTag = $element->getDecorator('HtmlTag');
  1126. $fooBar = $element->getDecorator('FooBar');
  1127. ]]></programlisting>
  1128. </note>
  1129. <para>Métodos asociados con decoradores incluyen:</para>
  1130. <itemizedlist>
  1131. <listitem>
  1132. <para>
  1133. <methodname>addDecorator($nameOrDecorator, array $options =
  1134. null)</methodname>
  1135. </para>
  1136. </listitem>
  1137. <listitem>
  1138. <para>
  1139. <methodname>addDecorators(array $decorators)</methodname>
  1140. </para>
  1141. </listitem>
  1142. <listitem>
  1143. <para>
  1144. <methodname>setDecorators(array $decorators)</methodname>
  1145. (sobreescribe todos los decoradores)
  1146. </para>
  1147. </listitem>
  1148. <listitem>
  1149. <para>
  1150. <methodname>getDecorator($name)</methodname>
  1151. (recupera un
  1152. objeto decorador por su nombre)
  1153. </para>
  1154. </listitem>
  1155. <listitem>
  1156. <para>
  1157. <methodname>getDecorators()</methodname>
  1158. (recupera todos los
  1159. decoradores)
  1160. </para>
  1161. </listitem>
  1162. <listitem>
  1163. <para>
  1164. <methodname>removeDecorator($name)</methodname>
  1165. (elimina un
  1166. decorador por su nombre)
  1167. </para>
  1168. </listitem>
  1169. <listitem>
  1170. <para>
  1171. <methodname>clearDecorators()</methodname>
  1172. (elimina todos
  1173. los decoradores)
  1174. </para>
  1175. </listitem>
  1176. </itemizedlist>
  1177. <para>
  1178. <classname>Zend_Form_Element</classname>
  1179. también utiliza la
  1180. sobrecarga para permitir generar decoradores específicos.
  1181. <methodname>__call()</methodname>
  1182. interceptará métodos que
  1183. comiencen con el texto 'render' y utilizará el resto del nombre
  1184. del
  1185. método para buscar un decorador; si se encuentra, entonces será
  1186. generado
  1187. <emphasis>sólo ese</emphasis>
  1188. decorador. Cualquier
  1189. argumento pasado al llamado del método será usado como contenido
  1190. para pasar al método
  1191. <methodname>render()</methodname>
  1192. del
  1193. decorador. Como ejemplo:
  1194. </para>
  1195. <programlisting language="php"><![CDATA[
  1196. // Genera solo el decorador ViewHelper:
  1197. echo $element->renderViewHelper();
  1198. // Genera solo el decorador HtmlTag, pasándole contenido:
  1199. echo $element->renderHtmlTag("This is the html tag content");
  1200. ]]></programlisting>
  1201. <para>Si el decorador no existe, una excepción es lanzada.</para>
  1202. </sect2>
  1203. <sect2 id="zend.form.elements.metadata">
  1204. <title>Metadatos y atributos</title>
  1205. <para>
  1206. <classname>Zend_Form_Element</classname>
  1207. manipula una variedad de
  1208. atributos y medatados del elemento. Atributos básicos incluyen:
  1209. </para>
  1210. <itemizedlist>
  1211. <listitem>
  1212. <para>
  1213. <emphasis>name</emphasis>
  1214. : el nombre del elemento. Emplea
  1215. los métodos de acceso
  1216. <methodname>setName()</methodname>
  1217. y
  1218. <methodname>getName()</methodname>
  1219. .
  1220. </para>
  1221. </listitem>
  1222. <listitem>
  1223. <para>
  1224. <emphasis>label</emphasis>
  1225. : la etiqueta del elemento. Emplea
  1226. los métodos de acceso
  1227. <methodname>setLabel()</methodname>
  1228. y
  1229. <methodname>getLabel()</methodname>
  1230. .
  1231. </para>
  1232. </listitem>
  1233. <listitem>
  1234. <para>
  1235. <emphasis>order</emphasis>
  1236. : el índice en el cual los
  1237. elementos deben ir mostrándose en el formulario.
  1238. Emplea los
  1239. métodos de acceso
  1240. <methodname>setOrder()</methodname>
  1241. y
  1242. <methodname>getOrder()</methodname>
  1243. .
  1244. </para>
  1245. </listitem>
  1246. <listitem>
  1247. <para>
  1248. <emphasis>value</emphasis>
  1249. : El valor del elemento actual.
  1250. Emplea los métodos de acceso
  1251. <methodname>setValue()</methodname>
  1252. y
  1253. <methodname>getValue()</methodname>
  1254. .
  1255. </para>
  1256. </listitem>
  1257. <listitem>
  1258. <para>
  1259. <emphasis>description</emphasis>
  1260. : una descripción del
  1261. elemento; a menudo utilizada para proveer un tooltip o
  1262. ayuda
  1263. contextual con javascript describiendo el propósito del
  1264. elemento. Emplea los
  1265. métodos de acceso
  1266. <methodname>setDescription()</methodname>
  1267. y
  1268. <methodname>getDescription()</methodname>
  1269. .
  1270. </para>
  1271. </listitem>
  1272. <listitem>
  1273. <para>
  1274. <emphasis>required</emphasis>
  1275. : bandera que indica si un
  1276. elemento es requerido o no cuando se efectúa la
  1277. validación
  1278. del formulario. Emplea los métodos de acceso
  1279. <methodname>setRequired()</methodname>
  1280. y
  1281. <methodname>getRequired()</methodname>
  1282. . Esta bandera es
  1283. <constant>FALSE</constant>
  1284. por defecto.
  1285. </para>
  1286. </listitem>
  1287. <listitem>
  1288. <para>
  1289. <emphasis>allowEmpty</emphasis>
  1290. : bandera indicando si un
  1291. elemento no-requerido (opcional) debe intentar validar
  1292. o no
  1293. valores vacíos. Cuando es
  1294. <constant>TRUE</constant>
  1295. , y la
  1296. bandera required es
  1297. <constant>FALSE</constant>
  1298. , valores
  1299. vacíos no pasarán la cadena de validación, y se supone
  1300. verdadero. Emplea
  1301. los métodos de acceso
  1302. <methodname>setAllowEmpty()</methodname>
  1303. y
  1304. <methodname>getAllowEmpty()</methodname>
  1305. . Esta bandera
  1306. es
  1307. <constant>TRUE</constant>
  1308. por defecto.
  1309. </para>
  1310. </listitem>
  1311. <listitem>
  1312. <para>
  1313. <emphasis>autoInsertNotEmptyValidator</emphasis>
  1314. : bandera
  1315. indicando insertar o no un validador 'NotEmpty' cuando un
  1316. elemento es
  1317. requerido. Por defecto, esta bandera es
  1318. <constant>TRUE</constant>
  1319. . Establezca la bandera con
  1320. <methodname>setAutoInsertNotEmptyValidator($flag)</methodname>
  1321. y determine el valor con
  1322. <methodname>autoInsertNotEmptyValidator()</methodname>
  1323. .
  1324. </para>
  1325. </listitem>
  1326. </itemizedlist>
  1327. <para>
  1328. Los elementos del formulario pueden requerir metainformación
  1329. adicional. Para elementos
  1330. <acronym>XHTML</acronym>
  1331. del formuladio,
  1332. por ejemplo, puede querer especificar atributos como el class o id.
  1333. Para
  1334. facilitar esto hay un conjunto de métodos de acceso:
  1335. </para>
  1336. <itemizedlist>
  1337. <listitem>
  1338. <para>
  1339. <emphasis>setAttrib($name, $value)</emphasis>
  1340. : añade un
  1341. atributo
  1342. </para>
  1343. </listitem>
  1344. <listitem>
  1345. <para>
  1346. <emphasis>setAttribs(array $attribs)</emphasis>
  1347. : como
  1348. addAttribs(), pero sobreescribiendo
  1349. </para>
  1350. </listitem>
  1351. <listitem>
  1352. <para>
  1353. <emphasis>getAttrib($name)</emphasis>
  1354. : recupera el valor de
  1355. solo un atributo
  1356. </para>
  1357. </listitem>
  1358. <listitem>
  1359. <para>
  1360. <emphasis>getAttribs()</emphasis>
  1361. : recupera todos los
  1362. atributos como pares clave/valor
  1363. </para>
  1364. </listitem>
  1365. </itemizedlist>
  1366. <para>
  1367. La mayoría de las veces, como sea, puede simplemente acceder a
  1368. ellos como propiedades de
  1369. objeto, ya que
  1370. <classname>Zend_Form_Element</classname>
  1371. utiliza la sobrecarga
  1372. para facilitar el acceso a ellos:
  1373. </para>
  1374. <programlisting language="php"><![CDATA[
  1375. // Equivalente a $element->setAttrib('class', 'text'):
  1376. $element->class = 'text;
  1377. ]]></programlisting>
  1378. <para>Por defecto, todos los atributos son pasados al auxiliar vista
  1379. usado por el elemento
  1380. durante la generación, y generados como
  1381. atributos de la etiqueta del elemento.</para>
  1382. </sect2>
  1383. <sect2 id="zend.form.elements.standard">
  1384. <title>Elementos Estándar</title>
  1385. <para>
  1386. <classname>Zend_Form</classname>
  1387. contiene un buen número de
  1388. elementos estándar; por favor lea el capítulo
  1389. <link linkend="zend.form.standardElements">Elementos Estándar</link>
  1390. para todos los detalles.
  1391. </para>
  1392. </sect2>
  1393. <sect2 id="zend.form.elements.methods">
  1394. <title>Métodos de Zend_Form_Element</title>
  1395. <para>
  1396. <classname>Zend_Form_Element</classname>
  1397. tiene muchos, muchos
  1398. métodos. Lo que sigue es un sumario de sus funciones, agrupados por
  1399. tipo:
  1400. </para>
  1401. <itemizedlist>
  1402. <listitem>
  1403. <para>Configuración:</para>
  1404. <itemizedlist>
  1405. <listitem>
  1406. <para>
  1407. <methodname>setOptions(array $options)</methodname>
  1408. </para>
  1409. </listitem>
  1410. <listitem>
  1411. <para>
  1412. <methodname>setConfig(Zend_Config
  1413. $config)</methodname>
  1414. </para>
  1415. </listitem>
  1416. </itemizedlist>
  1417. </listitem>
  1418. <listitem>
  1419. <para>I18n:</para>
  1420. <itemizedlist>
  1421. <listitem>
  1422. <para>
  1423. <methodname>setTranslator(Zend_Translate_Adapter
  1424. $translator = null)</methodname>
  1425. </para>
  1426. </listitem>
  1427. <listitem>
  1428. <para>
  1429. <methodname>getTranslator()</methodname>
  1430. </para>
  1431. </listitem>
  1432. <listitem>
  1433. <para>
  1434. <methodname>setDisableTranslator($flag)</methodname>
  1435. </para>
  1436. </listitem>
  1437. <listitem>
  1438. <para>
  1439. <methodname>translatorIsDisabled()</methodname>
  1440. </para>
  1441. </listitem>
  1442. </itemizedlist>
  1443. </listitem>
  1444. <listitem>
  1445. <para>Propiedades:</para>
  1446. <itemizedlist>
  1447. <listitem>
  1448. <para>
  1449. <methodname>setName($name)</methodname>
  1450. </para>
  1451. </listitem>
  1452. <listitem>
  1453. <para>
  1454. <methodname>getName()</methodname>
  1455. </para>
  1456. </listitem>
  1457. <listitem>
  1458. <para>
  1459. <methodname>setValue($value)</methodname>
  1460. </para>
  1461. </listitem>
  1462. <listitem>
  1463. <para>
  1464. <methodname>getValue()</methodname>
  1465. </para>
  1466. </listitem>
  1467. <listitem>
  1468. <para>
  1469. <methodname>getUnfilteredValue()</methodname>
  1470. </para>
  1471. </listitem>
  1472. <listitem>
  1473. <para>
  1474. <methodname>setLabel($label)</methodname>
  1475. </para>
  1476. </listitem>
  1477. <listitem>
  1478. <para>
  1479. <methodname>getLabel()</methodname>
  1480. </para>
  1481. </listitem>
  1482. <listitem>
  1483. <para>
  1484. <methodname>setDescription($description)</methodname>
  1485. </para>
  1486. </listitem>
  1487. <listitem>
  1488. <para>
  1489. <methodname>getDescription()</methodname>
  1490. </para>
  1491. </listitem>
  1492. <listitem>
  1493. <para>
  1494. <methodname>setOrder($order)</methodname>
  1495. </para>
  1496. </listitem>
  1497. <listitem>
  1498. <para>
  1499. <methodname>getOrder()</methodname>
  1500. </para>
  1501. </listitem>
  1502. <listitem>
  1503. <para>
  1504. <methodname>setRequired($flag)</methodname>
  1505. </para>
  1506. </listitem>
  1507. <listitem>
  1508. <para>
  1509. <methodname>getRequired()</methodname>
  1510. </para>
  1511. </listitem>
  1512. <listitem>
  1513. <para>
  1514. <methodname>setAllowEmpty($flag)</methodname>
  1515. </para>
  1516. </listitem>
  1517. <listitem>
  1518. <para>
  1519. <methodname>getAllowEmpty()</methodname>
  1520. </para>
  1521. </listitem>
  1522. <listitem>
  1523. <para>
  1524. <methodname>setAutoInsertNotEmptyValidator($flag)</methodname>
  1525. </para>
  1526. </listitem>
  1527. <listitem>
  1528. <para>
  1529. <methodname>autoInsertNotEmptyValidator()</methodname>
  1530. </para>
  1531. </listitem>
  1532. <listitem>
  1533. <para>
  1534. <methodname>setIgnore($flag)</methodname>
  1535. </para>
  1536. </listitem>
  1537. <listitem>
  1538. <para>
  1539. <methodname>getIgnore()</methodname>
  1540. </para>
  1541. </listitem>
  1542. <listitem>
  1543. <para>
  1544. <methodname>getType()</methodname>
  1545. </para>
  1546. </listitem>
  1547. <listitem>
  1548. <para>
  1549. <methodname>setAttrib($name, $value)</methodname>
  1550. </para>
  1551. </listitem>
  1552. <listitem>
  1553. <para>
  1554. <methodname>setAttribs(array $attribs)</methodname>
  1555. </para>
  1556. </listitem>
  1557. <listitem>
  1558. <para>
  1559. <methodname>getAttrib($name)</methodname>
  1560. </para>
  1561. </listitem>
  1562. <listitem>
  1563. <para>
  1564. <methodname>getAttribs()</methodname>
  1565. </para>
  1566. </listitem>
  1567. </itemizedlist>
  1568. </listitem>
  1569. <listitem>
  1570. <para>Cargadores y rutas de plugin:</para>
  1571. <itemizedlist>
  1572. <listitem>
  1573. <para>
  1574. <methodname>setPluginLoader(Zend_Loader_PluginLoader_Interface
  1575. $loader,
  1576. $type)</methodname>
  1577. </para>
  1578. </listitem>
  1579. <listitem>
  1580. <para>
  1581. <methodname>getPluginLoader($type)</methodname>
  1582. </para>
  1583. </listitem>
  1584. <listitem>
  1585. <para>
  1586. <methodname>addPrefixPath($prefix, $path, $type =
  1587. null)</methodname>
  1588. </para>
  1589. </listitem>
  1590. <listitem>
  1591. <para>
  1592. <methodname>addPrefixPaths(array $spec)</methodname>
  1593. </para>
  1594. </listitem>
  1595. </itemizedlist>
  1596. </listitem>
  1597. <listitem>
  1598. <para>Validación:</para>
  1599. <itemizedlist>
  1600. <listitem>
  1601. <para>
  1602. <methodname>addValidator($validator,
  1603. $breakChainOnFailure = false,
  1604. $options =
  1605. array())</methodname>
  1606. </para>
  1607. </listitem>
  1608. <listitem>
  1609. <para>
  1610. <methodname>addValidators(array
  1611. $validators)</methodname>
  1612. </para>
  1613. </listitem>
  1614. <listitem>
  1615. <para>
  1616. <methodname>setValidators(array
  1617. $validators)</methodname>
  1618. </para>
  1619. </listitem>
  1620. <listitem>
  1621. <para>
  1622. <methodname>getValidator($name)</methodname>
  1623. </para>
  1624. </listitem>
  1625. <listitem>
  1626. <para>
  1627. <methodname>getValidators()</methodname>
  1628. </para>
  1629. </listitem>
  1630. <listitem>
  1631. <para>
  1632. <methodname>removeValidator($name)</methodname>
  1633. </para>
  1634. </listitem>
  1635. <listitem>
  1636. <para>
  1637. <methodname>clearValidators()</methodname>
  1638. </para>
  1639. </listitem>
  1640. <listitem>
  1641. <para>
  1642. <methodname>isValid($value, $context =
  1643. null)</methodname>
  1644. </para>
  1645. </listitem>
  1646. <listitem>
  1647. <para>
  1648. <methodname>getErrors()</methodname>
  1649. </para>
  1650. </listitem>
  1651. <listitem>
  1652. <para>
  1653. <methodname>getMessages()</methodname>
  1654. </para>
  1655. </listitem>
  1656. </itemizedlist>
  1657. </listitem>
  1658. <listitem>
  1659. <para>Filtros:</para>
  1660. <itemizedlist>
  1661. <listitem>
  1662. <para>
  1663. <methodname>addFilter($filter, $options =
  1664. array())</methodname>
  1665. </para>
  1666. </listitem>
  1667. <listitem>
  1668. <para>
  1669. <methodname>addFilters(array $filters)</methodname>
  1670. </para>
  1671. </listitem>
  1672. <listitem>
  1673. <para>
  1674. <methodname>setFilters(array $filters)</methodname>
  1675. </para>
  1676. </listitem>
  1677. <listitem>
  1678. <para>
  1679. <methodname>getFilter($name)</methodname>
  1680. </para>
  1681. </listitem>
  1682. <listitem>
  1683. <para>
  1684. <methodname>getFilters()</methodname>
  1685. </para>
  1686. </listitem>
  1687. <listitem>
  1688. <para>
  1689. <methodname>removeFilter($name)</methodname>
  1690. </para>
  1691. </listitem>
  1692. <listitem>
  1693. <para>
  1694. <methodname>clearFilters()</methodname>
  1695. </para>
  1696. </listitem>
  1697. </itemizedlist>
  1698. </listitem>
  1699. <listitem>
  1700. <para>Generación:</para>
  1701. <itemizedlist>
  1702. <listitem>
  1703. <para>
  1704. <methodname>setView(Zend_View_Interface $view =
  1705. null)</methodname>
  1706. </para>
  1707. </listitem>
  1708. <listitem>
  1709. <para>
  1710. <methodname>getView()</methodname>
  1711. </para>
  1712. </listitem>
  1713. <listitem>
  1714. <para>
  1715. <methodname>addDecorator($decorator, $options =
  1716. null)</methodname>
  1717. </para>
  1718. </listitem>
  1719. <listitem>
  1720. <para>
  1721. <methodname>addDecorators(array
  1722. $decorators)</methodname>
  1723. </para>
  1724. </listitem>
  1725. <listitem>
  1726. <para>
  1727. <methodname>setDecorators(array
  1728. $decorators)</methodname>
  1729. </para>
  1730. </listitem>
  1731. <listitem>
  1732. <para>
  1733. <methodname>getDecorator($name)</methodname>
  1734. </para>
  1735. </listitem>
  1736. <listitem>
  1737. <para>
  1738. <methodname>getDecorators()</methodname>
  1739. </para>
  1740. </listitem>
  1741. <listitem>
  1742. <para>
  1743. <methodname>removeDecorator($name)</methodname>
  1744. </para>
  1745. </listitem>
  1746. <listitem>
  1747. <para>
  1748. <methodname>clearDecorators()</methodname>
  1749. </para>
  1750. </listitem>
  1751. <listitem>
  1752. <para>
  1753. <methodname>render(Zend_View_Interface $view =
  1754. null)</methodname>
  1755. </para>
  1756. </listitem>
  1757. </itemizedlist>
  1758. </listitem>
  1759. </itemizedlist>
  1760. </sect2>
  1761. <sect2 id="zend.form.elements.config">
  1762. <title>Configuración</title>
  1763. <para>
  1764. El constructor de
  1765. <classname>Zend_Form_Element</classname>
  1766. acepta
  1767. tanto una matriz de opciones como un objeto
  1768. <classname>Zend_Config</classname>
  1769. conteniendo opciones, y
  1770. esto puede configurarse usando
  1771. <methodname>setOptions()</methodname>
  1772. o
  1773. <methodname>setConfig()</methodname>
  1774. . Hablando de manera general,
  1775. las claves son nombradas de la siguiente manera:
  1776. </para>
  1777. <itemizedlist>
  1778. <listitem>
  1779. <para>
  1780. Si 'set' + clave se refiere a un método de
  1781. <classname>Zend_Form_Element</classname>
  1782. , entonces el
  1783. valor provisto será pasado a el método.
  1784. </para>
  1785. </listitem>
  1786. <listitem>
  1787. <para>De otra manera, el valor será usado para establecer un
  1788. atributo.</para>
  1789. </listitem>
  1790. </itemizedlist>
  1791. <para>Excepciones a la regla incluyen las siguientes:</para>
  1792. <itemizedlist>
  1793. <listitem>
  1794. <para>
  1795. <methodname>prefixPath</methodname>
  1796. será pasado a
  1797. <methodname>addPrefixPaths()</methodname>
  1798. </para>
  1799. </listitem>
  1800. <listitem>
  1801. <para>Los siguientes setters no pueden establecerse de esta
  1802. manera:</para>
  1803. <itemizedlist>
  1804. <listitem>
  1805. <para>
  1806. <methodname>setAttrib</methodname>
  1807. (aunque
  1808. <methodname>setAttribs</methodname>
  1809. <emphasis>funcionará</emphasis>
  1810. </para>
  1811. </listitem>
  1812. <listitem>
  1813. <para>
  1814. <methodname>setConfig</methodname>
  1815. </para>
  1816. </listitem>
  1817. <listitem>
  1818. <para>
  1819. <methodname>setOptions</methodname>
  1820. </para>
  1821. </listitem>
  1822. <listitem>
  1823. <para>
  1824. <methodname>setPluginLoader</methodname>
  1825. </para>
  1826. </listitem>
  1827. <listitem>
  1828. <para>
  1829. <methodname>setTranslator</methodname>
  1830. </para>
  1831. </listitem>
  1832. <listitem>
  1833. <para>
  1834. <methodname>setView</methodname>
  1835. </para>
  1836. </listitem>
  1837. </itemizedlist>
  1838. </listitem>
  1839. </itemizedlist>
  1840. <para>Como ejemplo, aquí esta un archivo de configuración pasado para
  1841. cada tipo de dato
  1842. configurable:</para>
  1843. <programlisting language="ini"><![CDATA[
  1844. [element]
  1845. name = "foo"
  1846. value = "foobar"
  1847. label = "Foo:"
  1848. order = 10
  1849. required = true
  1850. allowEmpty = false
  1851. autoInsertNotEmptyValidator = true
  1852. description = "Foo elements are for examples"
  1853. ignore = false
  1854. attribs.id = "foo"
  1855. attribs.class = "element"
  1856. ; sets 'onclick' attribute
  1857. onclick = "autoComplete(this, '/form/autocomplete/element')"
  1858. prefixPaths.decorator.prefix = "My_Decorator"
  1859. prefixPaths.decorator.path = "My/Decorator/"
  1860. disableTranslator = 0
  1861. validators.required.validator = "NotEmpty"
  1862. validators.required.breakChainOnFailure = true
  1863. validators.alpha.validator = "alpha"
  1864. validators.regex.validator = "regex"
  1865. validators.regex.options.pattern = "/^[A-F].*/$"
  1866. filters.ucase.filter = "StringToUpper"
  1867. decorators.element.decorator = "ViewHelper"
  1868. decorators.element.options.helper = "FormText"
  1869. decorators.label.decorator = "Label"
  1870. ]]></programlisting>
  1871. </sect2>
  1872. <sect2 id="zend.form.elements.custom">
  1873. <title>Elementos personalizados</title>
  1874. <para>
  1875. Usted puede crear sus propios elementos personalizados
  1876. simplemente extendiendo la clase
  1877. <classname>Zend_Form_Element</classname>
  1878. . Las razones comunes
  1879. para hacer esto incluyen:
  1880. </para>
  1881. <itemizedlist>
  1882. <listitem>
  1883. <para>Elementos que comparten validadores y/o filtros comunes
  1884. </para>
  1885. </listitem>
  1886. <listitem>
  1887. <para>Elementos que tienen decoradores con funcionalidad
  1888. personalizada</para>
  1889. </listitem>
  1890. </itemizedlist>
  1891. <para>
  1892. Hay dos métodos típicamente usados para extender un elemento:
  1893. <methodname>init()</methodname>
  1894. , el cual puede usarse para
  1895. añadir una lógica de inicialización personalizada a su
  1896. elemento, y
  1897. <methodname>loadDefaultDecorators()</methodname>
  1898. , el cual puede
  1899. usarse para establecer una lista de decoradores usados por su
  1900. elemento de
  1901. manera predeterminada.
  1902. </para>
  1903. <para>
  1904. Como un ejemplo, digamos que todos los elementos de tipo texto en
  1905. un formulario que está
  1906. creando, necesitan ser filtrados con
  1907. <methodname>StringTrim</methodname>
  1908. , validados con una expresión
  1909. regular, y que quiere usar un decorador personalizado que
  1910. ha creado
  1911. para mostrarlos, 'My_Decorator_TextItem'; adicionalmente, tiene un
  1912. número de
  1913. atributos estándars, incluyendo 'size', 'maxLength', y
  1914. 'class' que quisiera especificar.
  1915. Puede definir un elemento tal como
  1916. sigue:
  1917. </para>
  1918. <programlisting language="php"><![CDATA[
  1919. class My_Element_Text extends Zend_Form_Element
  1920. {
  1921. public function init()
  1922. {
  1923. $this->addPrefixPath('My_Decorator', 'My/Decorator/', 'decorator')
  1924. ->addFilters('StringTrim')
  1925. ->addValidator('Regex', false, array('/^[a-z0-9]{6,}$/i'))
  1926. ->addDecorator('TextItem')
  1927. ->setAttrib('size', 30)
  1928. ->setAttrib('maxLength', 45)
  1929. ->setAttrib('class', 'text');
  1930. }
  1931. }
  1932. ]]></programlisting>
  1933. <para>Entonces puede informar a su objeto formulario acerca del prefijo
  1934. de ruta para
  1935. elementos de ese tipo, y comenzar creando elementos:</para>
  1936. <programlisting language="php"><![CDATA[
  1937. $form->addPrefixPath('My_Element', 'My/Element/', 'element')
  1938. ->addElement('foo', 'text');
  1939. ]]></programlisting>
  1940. <para>
  1941. El elemento 'foo' será ahora del tipo
  1942. <methodname>My_Element_Text</methodname>
  1943. , y mostrará el
  1944. comportamiento que ha especificado.
  1945. </para>
  1946. <para>
  1947. Otro método que puede querer sobreescribir cuando extienda
  1948. <classname>Zend_Form_Element</classname>
  1949. es el método
  1950. <methodname>loadDefaultDecorators()</methodname>
  1951. . Este método
  1952. carga condicionalmente un grupo de decoradores predefinidos para su
  1953. elemento; puede querer sustituir su propio decorador en su clase
  1954. extendida:
  1955. </para>
  1956. <programlisting language="php"><![CDATA[
  1957. class My_Element_Text extends Zend_Form_Element
  1958. {
  1959. public function loadDefaultDecorators()
  1960. {
  1961. $this->addDecorator('ViewHelper')
  1962. ->addDecorator('DisplayError')
  1963. ->addDecorator('Label')
  1964. ->addDecorator('HtmlTag',
  1965. array('tag' => 'div', 'class' => 'element'));
  1966. }
  1967. }
  1968. ]]></programlisting>
  1969. <para>
  1970. Hay muchas maneras de personalizar elementos; asegúrese de leer
  1971. la documentación de la
  1972. <acronym>API</acronym>
  1973. de
  1974. <classname>Zend_Form_Element</classname>
  1975. para conocer todos los
  1976. métodos disponibles.
  1977. </para>
  1978. </sect2>
  1979. </sect1>