Zend_Validate.xml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20115 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.validate.introduction">
  5. <title>Introducción</title>
  6. <para> Cuando se necesita validar algún tipo de dato, el componente
  7. <classname>Zend_Validate</classname> ofrece un conjunto de
  8. validadores, como así también un sencillo mecanismo de encadenado de
  9. validaciones por el cual múltiples validadores pueden aplicarse a un
  10. dato en un orden definido por el usuario. </para>
  11. <sect2 id="zend.validate.introduction.definition">
  12. <title>¿Qué es un validador?</title>
  13. <para> Un validador examina su entrada con respecto a algunos
  14. requerimientos y produce un resultado booleano si la entrada valida
  15. satisfactoriamente con los requisitos. Si la entrada no cumple los
  16. requisitos, un validador también podrá proporcionar información
  17. adicional sobre que requisito(s) no son satisfechos. </para>
  18. <para> Por ejemplo, una aplicación web podría requerir que un usuario
  19. ingrese su nombre, de entre seis y doce caracteres de longitud y que
  20. sólo puede contener caracteres alfanuméricos. Se puede usar un
  21. validador para asegurar que los usuarios cumplan estos requisitos.
  22. Si el nombre de usuario elegido no cumple con uno o ambos de los
  23. requisitos, sería útil saber cuál de estos requisitos no se cumple. </para>
  24. </sect2>
  25. <sect2 id="zend.validate.introduction.using">
  26. <title>Uso básico de validadores</title>
  27. <para> Habiendo definido la validación de esta manera, Zend Framework
  28. nos proporciona el fundamento para
  29. <classname>Zend_Validate_Interface</classname> que define dos
  30. métodos, <methodname>isValid()</methodname> y
  31. <methodname>getMessages()</methodname> . El método
  32. <methodname>isValid()</methodname> realiza la validación del
  33. valor, devolviendo <constant>TRUE</constant> si y sólo si el valor
  34. pasa contra el criterio de validación. </para>
  35. <para> Si <methodname>isValid()</methodname> devuelve
  36. <constant>FALSE</constant> , la función
  37. <methodname>getMessages()</methodname> devuelve un array de
  38. mensajes explicando el motivo(s) del fracaso de la validación. Las
  39. claves del array son strings cortos que identifican las razones por
  40. las cuales fracasó la validación, y los valores del array son los
  41. correspondientes mensajes para ser leídos por un ser humano. Las
  42. claves y los valores son dependientes de la clase; cada clase de
  43. validación define su propio conjunto de mensajes de validación
  44. fallidas y las claves únicas que las identifican. Cada clase tiene
  45. también una definición constante que hace corresponder a cada
  46. identificador con una causa del fallo de validación. </para>
  47. <note>
  48. <para> El método <methodname>getMessages()</methodname> devuelve
  49. información del fracaso de la validación sólo para la llamada
  50. más reciente a <methodname>isValid()</methodname> . Cada llamada
  51. a <methodname>isValid()</methodname> borra los mensajes y
  52. errores causados por una llamada anterior
  53. <methodname>isValid()</methodname> , porque es probable que
  54. cada llamada a <methodname>isValid()</methodname> se refiera al
  55. valor de una entrada diferente. </para>
  56. </note>
  57. <para> El siguiente ejemplo ilustra la validación de una dirección de
  58. e-mail: </para>
  59. <programlisting language="php"><![CDATA[
  60. $validator = new Zend_Validate_EmailAddress();
  61. if ($validator->isValid($email)) {
  62. // email parece ser válido
  63. } else {
  64. // email es inválido; muestre la razones
  65. foreach ($validator->getMessages() as $messageId => $message) {
  66. echo "Falla de validación '$messageId': $message\n";
  67. }
  68. }
  69. ]]></programlisting>
  70. </sect2>
  71. <sect2 id="zend.validate.introduction.messages">
  72. <title>Personalizar los mensajes</title>
  73. <para> Para validar las clases se proporciona un método
  74. <methodname>setMessage()</methodname> con el que se puede
  75. especificar el formato de un mensaje devuelto por
  76. <methodname>getMessages()</methodname> en caso de fallo de
  77. validación. El primer argumento de este método es un string que
  78. contiene el mensaje de error. Usted puede incluir tokens en este
  79. array que serán sustituidos con datos relevantes al validador. El
  80. token <emphasis>%value%</emphasis> es aceptado por todos los
  81. validadores, que es sustituido por el valor que pasó a
  82. <methodname>isValid()</methodname> . Cada clase de validación,
  83. puede dar apoyo a otros tokens en base a cada caso. Por ejemplo,
  84. <emphasis>%max%</emphasis> es un token apoyado por
  85. <classname>Zend_Validate_LessThan</classname> . El método
  86. <methodname>getMessageVariables()</methodname> devuelve un array
  87. de tokens variables aceptados por el validador. </para>
  88. <para> El segundo argumento opcional es un string que identifica la
  89. plantilla de mensajes que se establecerá en caso del fracaso de la
  90. validación, lo que es útil cuando una clase de validación define más
  91. de una causa para el fallo. Si omite el segundo argumento,
  92. <methodname>setMessage()</methodname> asume que el mensaje que
  93. especifique debe ser utilizado por la plantilla del primer mensaje
  94. que declaró en la clase de validación. Muchas clases de validación
  95. sólo definen una plantilla de mensaje de error, así que no hay
  96. necesidad de especificar el cambio de plantilla de mensaje. </para>
  97. <para>
  98. <programlisting language="php"><![CDATA[
  99. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  100. $validator->setMessage(
  101. 'El string \'%value%\' es muy corto; debe tener al menos %min% ' .
  102. 'caracteres',
  103. Zend_Validate_StringLength::TOO_SHORT);
  104. if (!$validator->isValid('word')) {
  105. $messages = $validator->getMessages();
  106. echo current($messages);
  107. // "El string 'word' es muy corto; debe tener al menos 8 caracteres"
  108. }
  109. ]]></programlisting>
  110. </para>
  111. <para> Puede establecer varios mensajes usando el método
  112. <methodname>setMessages()</methodname> . Su argumento es un
  113. array que contiene pares de clave/mensaje. </para>
  114. <programlisting language="php"><![CDATA[
  115. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  116. $validator->setMessages( array(
  117. Zend_Validate_StringLength::TOO_SHORT =>
  118. 'El string \'%value%\' es muy corto',
  119. Zend_Validate_StringLength::TOO_LONG =>
  120. 'El string \'%value%\' es muy largo'
  121. ));
  122. ]]></programlisting>
  123. <para> Incluso, si su aplicación requiere una mayor flexibilidad para
  124. informar los fallos de validación, puede acceder a las propiedades
  125. por el mismo nombre, tal como los tokens de mensajes apoyados por
  126. una determinada clase de validación. La propiedad
  127. <methodname>value</methodname> siempre está disponible en un
  128. validador; es el valor que especificó en el argumento de
  129. <methodname>isValid()</methodname> . En cada clase de validación
  130. se puede dar apoyo a otras propiedades basándose en el esquema de
  131. caso por caso. <programlisting language="php"><![CDATA[
  132. $validator = new Zend_Validate_StringLength(8, 12);
  133. if (!validator->isValid('word')) {
  134. echo 'Palabra fallada: '
  135. . $validator->value
  136. . '; su longitud no está entre '
  137. . $validator->min
  138. . ' y '
  139. . $validator->max
  140. . "\n";
  141. }
  142. ]]></programlisting>
  143. </para>
  144. </sect2>
  145. <sect2 id="zend.validate.introduction.static">
  146. <title> Utilizando el método estático is() </title>
  147. <para> Si es inconveniente cargar una clase de validación y crear una
  148. instancia del validador, puede usar el método estático
  149. <methodname>Zend_Validate::is()</methodname> como un estilo
  150. alternativo de invocación. El primer argumento de este método es el
  151. valor de una entrada de datos que usted pasaría al método
  152. <methodname>isValid()</methodname> . El segundo argumento es un
  153. string, que corresponde al nombre base de la clase de validación,
  154. relativo al nombre de espacio <classname>Zend_Validate</classname> .
  155. El método <methodname>is()</methodname> carga automáticamente la
  156. clase, crea una instancia y aplica el método
  157. <methodname>isValid()</methodname> a la entrada de datos. <programlisting language="php"><![CDATA[
  158. if (Zend_Validate::is($email, 'EmailAddress')) {
  159. // Si, el email parece ser válido
  160. }
  161. ]]></programlisting>
  162. </para>
  163. <para> Si el validador lo necesita, también puede pasar un array de
  164. constructores de argumentos. <programlisting language="php"><![CDATA[
  165. if (Zend_Validate::is($value, 'Between', array('min' => 1, 'max' => 12))) {
  166. // Si, $value está entre 1 y 12
  167. }
  168. ]]></programlisting>
  169. </para>
  170. <para> El método <methodname>is()</methodname> devuelve un valor
  171. booleano, lo mismo que el método <methodname>isValid()</methodname>
  172. . Cuando se utiliza el método estático <methodname>is()</methodname>
  173. , no están disponibles los mensajes de fracaso de validación. </para>
  174. <para> El uso estático puede ser conveniente para invocar un validador
  175. ad-hoc (hecho especialmente), pero si tiene la necesidad de ejecutar
  176. el validador para múltiples entradas, es más eficiente usar métodos
  177. no estáticos, creando una instancia del objeto validador y llamando
  178. a su método <methodname>isValid()</methodname> . </para>
  179. <para> También la clase <classname>Zend_Filter_Input</classname> le
  180. permite crear ejemplos y ejecutar múltiples filtros y clases de
  181. validadores por demanda, para procesar juegos de datos de entrada.
  182. Ver <xref linkend="zend.filter.input"/> . </para>
  183. <sect3 id="zend.validate.introduction.static.namespaces">
  184. <title>Namespaces</title>
  185. <para> When working with self defined validators you can give a
  186. forth parameter to <methodname>Zend_Validate::is()</methodname>
  187. which is the namespace where your validator can be found. </para>
  188. <programlisting language="php"><![CDATA[
  189. if (Zend_Validate::is($value, 'MyValidator', array('min' => 1, 'max' => 12),
  190. array('FirstNamespace', 'SecondNamespace')) {
  191. // Yes, $value is ok
  192. }
  193. ]]></programlisting>
  194. <para>
  195. <classname>Zend_Validate</classname> allows also to set
  196. namespaces as default. This means that you can set them once in
  197. your bootstrap and have not to give them again for each call of
  198. <methodname>Zend_Validate::is()</methodname> . The following
  199. code snippet is identical to the above one. </para>
  200. <programlisting language="php"><![CDATA[
  201. Zend_Validate::setDefaultNamespaces(array('FirstNamespace', 'SecondNamespace'));
  202. if (Zend_Validate::is($value, 'MyValidator', array('min' => 1, 'max' => 12)) {
  203. // Yes, $value is ok
  204. }
  205. if (Zend_Validate::is($value, 'OtherValidator', array('min' => 1, 'max' => 12)) {
  206. // Yes, $value is ok
  207. }
  208. ]]></programlisting>
  209. <para> For your convinience there are following methods which allow
  210. the handling of namespaces: </para>
  211. <itemizedlist>
  212. <listitem>
  213. <para>
  214. <emphasis>
  215. <methodname>Zend_Validate::getDefaultNamespaces()</methodname>
  216. </emphasis> : Returns all set default namespaces as
  217. array. </para>
  218. </listitem>
  219. <listitem>
  220. <para>
  221. <emphasis>
  222. <methodname>Zend_Validate::setDefaultNamespaces()</methodname>
  223. </emphasis> : Sets new default namespaces and overrides
  224. any previous set. It accepts either a string for a
  225. single namespace of an array for multiple namespaces.
  226. </para>
  227. </listitem>
  228. <listitem>
  229. <para>
  230. <emphasis>
  231. <methodname>Zend_Validate::addDefaultNamespaces()</methodname>
  232. </emphasis> : Adds additional namespaces to already set
  233. ones. It accepts either a string for a single namespace
  234. of an array for multiple namespaces. </para>
  235. </listitem>
  236. <listitem>
  237. <para>
  238. <emphasis>
  239. <methodname>Zend_Validate::hasDefaultNamespaces()</methodname>
  240. </emphasis> : Returns <constant>TRUE</constant> when one or more default
  241. namespaces are set, and <constant>FALSE</constant> when no default namespaces
  242. are set. </para>
  243. </listitem>
  244. </itemizedlist>
  245. </sect3>
  246. </sect2>
  247. <sect2 id="zend.validate.introduction.translation">
  248. <title>Translating messages</title>
  249. <para> Validate classes provide a
  250. <methodname>setTranslator()</methodname> method with which you
  251. can specify a instance of <classname>Zend_Translate</classname>
  252. which will translate the messages in case of a validation failure.
  253. The <methodname>getTranslator()</methodname> method returns the set
  254. translator instance. </para>
  255. <programlisting language="php"><![CDATA[
  256. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  257. $translate = new Zend_Translate(
  258. 'array',
  259. array(Zend_Validate_StringLength::TOO_SHORT => 'Translated \'%value%\''),
  260. 'en'
  261. );
  262. $validator->setTranslator($translate);
  263. ]]></programlisting>
  264. <para> With the static <methodname>setDefaultTranslator()</methodname>
  265. method you can set a instance of
  266. <classname>Zend_Translate</classname> which will be used for all
  267. validation classes, and can be retrieved with
  268. <methodname>getDefaultTranslator()</methodname> . This prevents
  269. you from setting a translator manually for all validator classes,
  270. and simplifies your code. </para>
  271. <programlisting language="php"><![CDATA[
  272. $translate = new Zend_Translate(
  273. 'array',
  274. array(Zend_Validate_StringLength::TOO_SHORT => 'Translated \'%value%\''),
  275. 'en'
  276. );
  277. Zend_Validate::setDefaultTranslator($translate);
  278. ]]></programlisting>
  279. <note>
  280. <para> When you have set an application wide locale within your
  281. registry, then this locale will be used as default translator.
  282. </para>
  283. </note>
  284. <para> Sometimes it is necessary to disable the translator within a
  285. validator. To archive this you can use the
  286. <methodname>setDisableTranslator()</methodname> method, which
  287. accepts a boolean parameter, and
  288. <methodname>translatorIsDisabled()</methodname> to get the set
  289. value. </para>
  290. <programlisting language="php"><![CDATA[
  291. $validator = new Zend_Validate_StringLength(array('min' => 8, 'max' => 12));
  292. if (!$validator->isTranslatorDisabled()) {
  293. $validator->setDisableTranslator();
  294. }
  295. ]]></programlisting>
  296. <para> It is also possible to use a translator instead of setting own
  297. messages with <methodname>setMessage()</methodname> . But doing so,
  298. you should keep in mind, that the translator works also on messages
  299. you set your own. </para>
  300. </sect2>
  301. </sect1>