Zend_Form-Elements.xml 70 KB

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