Zend_Form-Elements.xml 70 KB

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