Zend_Validate.xml 18 KB

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