Zend_Form-QuickStart.xml 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15103 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.form.quickstart">
  5. <title>Inicio rápido a Zend_Form</title>
  6. <para>
  7. Esta guía rápida pretende cubrir los fundamentos para
  8. crear, validar y presentar formularios usando <classname>Zend_Form</classname>
  9. </para>
  10. <sect2 id="zend.form.quickstart.create">
  11. <title>Creando un objeto formulario</title>
  12. <para>
  13. Crear un objeto de formulario es muy simple: solo instancíe
  14. <classname>Zend_Form</classname>
  15. </para>
  16. <programlisting language="php"><![CDATA[
  17. $form = new Zend_Form;
  18. ]]></programlisting>
  19. <para>
  20. Para casos de uso avanzados, es posible desee crear una subclase de
  21. <classname>Zend_Form</classname>, pero para formularios simples, puede
  22. programar la creación de un formulario usando un objeto
  23. <classname>Zend_Form</classname>
  24. </para>
  25. <para>
  26. Si desea especificar el action y method del formulario (siempre
  27. buenas ideas), puede hacer uso de los accesos
  28. <methodname>setAction()</methodname> y <methodname>setMethod()</methodname>:
  29. </para>
  30. <programlisting language="php"><![CDATA[
  31. $form->setAction('/resource/process')
  32. ->setMethod('post');
  33. ]]></programlisting>
  34. <para>
  35. El código de arriba establece el action del formulario a la URL
  36. parcial "/resource/process" y como method HTTP POST. Esto se
  37. mostrará en la presentación final.
  38. </para>
  39. <para>
  40. Usted puede establecer atributos HTML adicionales para la etiqueta
  41. <methodname>&lt;form&gt;</methodname> mediante el uso de los métodos
  42. setAttrib() o setAttribs(). Por ejemplo, si desea especificar el id
  43. establezca el atributo "id":
  44. </para>
  45. <programlisting language="php"><![CDATA[
  46. $form->setAttrib('id', 'login');
  47. ]]></programlisting>
  48. </sect2>
  49. <sect2 id="zend.form.quickstart.elements">
  50. <title>Añadir elementos al formulario</title>
  51. <para>
  52. Un formulario no es nada sin sus elementos. <classname>Zend_Form</classname>
  53. contiene de manera predeterminada algunos elementos que generan
  54. XHTML vía auxiliares <classname>Zend_View</classname>. Son los
  55. siguientes:
  56. </para>
  57. <itemizedlist>
  58. <listitem><para>
  59. button
  60. </para></listitem>
  61. <listitem><para>
  62. checkbox (o varios checkboxes a la vez con multiCheckbox)
  63. </para></listitem>
  64. <listitem><para>
  65. hidden
  66. </para></listitem>
  67. <listitem><para>
  68. image
  69. </para></listitem>
  70. <listitem><para>
  71. password
  72. </para></listitem>
  73. <listitem><para>
  74. radio
  75. </para></listitem>
  76. <listitem><para>
  77. reset
  78. </para></listitem>
  79. <listitem><para>
  80. select (tanto regulares como de multi-selección)
  81. </para></listitem>
  82. <listitem><para>
  83. submit
  84. </para></listitem>
  85. <listitem><para>
  86. text
  87. </para></listitem>
  88. <listitem><para>
  89. textarea
  90. </para></listitem>
  91. </itemizedlist>
  92. <para>
  93. Tiene dos opciones para añadir elementos a un formulario; puede
  94. instanciar elementos concretos y pasarlos como objetos, o
  95. simplemente puede pasar el tipo de elemento y <classname>Zend_Form</classname>
  96. instaciará por usted un objeto del tipo correspondiente.
  97. </para>
  98. <para>
  99. Algunos ejemplos:
  100. </para>
  101. <programlisting language="php"><![CDATA[
  102. // Instanciando un elemento y pasandolo al objeto form:
  103. $form->addElement(new Zend_Form_Element_Text('username'));
  104. // Pasando el tipo de elemento del formulario al objeto form:
  105. $form->addElement('text', 'username');
  106. ]]></programlisting>
  107. <para>
  108. De manera predeterminada, éstos no tienen validadores o filtros.
  109. Esto significa que tendrá que configurar sus elementos con un
  110. mínimo de validadores, y potencialmente filtros. Puede hacer esto
  111. (a) antes de pasar el elemento al formulario, (b) vía opciones de
  112. configuración pasadas cuando crea un elemento a través de
  113. <classname>Zend_Form</classname>, o (c) recuperar el elemento del objeto form
  114. y configurándolo posteriormente.
  115. </para>
  116. <para>
  117. Veamos primero la creación de validadores para la instancia de
  118. un elemento concreto. Puede pasar objetos
  119. <classname>Zend_Validate_*</classname> o el nombre de un validador para utilizar:
  120. </para>
  121. <programlisting language="php"><![CDATA[
  122. $username = new Zend_Form_Element_Text('username');
  123. // Pasando un objeto Zend_Validate_*:
  124. $username->addValidator(new Zend_Validate_Alnum());
  125. // Pasando el nombre de un validador:
  126. $username->addValidator('alnum');
  127. ]]></programlisting>
  128. <para>
  129. Cuando se utiliza esta segunda opción, si el constructor del
  130. validador acepta argumentos, se pueden pasar en un array
  131. como tercer parámetro:
  132. </para>
  133. <programlisting language="php"><![CDATA[
  134. // Pasando un patrón
  135. $username->addValidator('regex', false, array('/^[a-z]/i'));
  136. ]]></programlisting>
  137. <para>
  138. (El segundo parámetro se utiliza para indicar si el fallo
  139. debería prevenir la ejecución de validadores posteriores o no; por
  140. defecto, el valor es false.)
  141. </para>
  142. <para>
  143. Puede también desear especificar un elemento como requerido. Esto
  144. puede hacerse utilizando un método de acceso o pasando una opción al
  145. crear el elemento. En el primer caso:
  146. </para>
  147. <programlisting language="php"><![CDATA[
  148. // Hace este elemento requerido:
  149. $username->setRequired(true);
  150. ]]></programlisting>
  151. <para>
  152. Cuando un elemento es requerido, un validador 'NotEmpty' (NoVacio)
  153. es añadido a la parte superior de la cadena de validaciones,
  154. asegurando que el elemento tenga algún valor cuando sea requerido.
  155. </para>
  156. <para>
  157. Los filtros son registrados básicamente de la misma manera que los
  158. validadores. Para efectos ilustrativos, vamos a agregar un filtro
  159. para poner en minúsculas el valor final:
  160. </para>
  161. <programlisting language="php"><![CDATA[
  162. $username->addFilter('StringtoLower');
  163. ]]></programlisting>
  164. <para>
  165. Entonces, la configuración final de nuestro elemento queda así:
  166. </para>
  167. <programlisting language="php"><![CDATA[
  168. $username->addValidator('alnum')
  169. ->addValidator('regex', false, array('/^[a-z]/'))
  170. ->setRequired(true)
  171. ->addFilter('StringToLower');
  172. // o, de manera más compacta:
  173. $username->addValidators(array('alnum',
  174. array('regex', false, '/^[a-z]/i')
  175. ))
  176. ->setRequired(true)
  177. ->addFilters(array('StringToLower'));
  178. ]]></programlisting>
  179. <para>
  180. Tan simple como esto, realizarlo para cada uno de los elementos
  181. del formulario puede resultar un poco tedioso. Intentemos la opción
  182. (b) arriba mencionada. Cuando creamos un nuevo elemento utilizando
  183. <classname>Zend_Form::addElement()</classname> como fábrica, opcionalmente
  184. podemos pasar las opciones de configuración. Éstas pueden incluir
  185. validadores y los filtros que se van a utilizar. Por lo tanto, para hacer todo
  186. lo anterior implícitamente, intente lo siguiente:
  187. </para>
  188. <programlisting language="php"><![CDATA[
  189. $form->addElement('text', 'username', array(
  190. 'validators' => array(
  191. 'alnum',
  192. array('regex', false, '/^[a-z]/i')
  193. ),
  194. 'required' => true,
  195. 'filters' => array('StringToLower'),
  196. ));
  197. ]]></programlisting>
  198. <note><para>
  199. Si encuentra que está asignando elementos con las mismas opciones en
  200. varios lugares, podría considerar crear su propia subclase de
  201. <classname>Zend_Form_Element</classname> y utilizar ésta; a largo plazo le
  202. permitirá escribir menos.
  203. </para></note>
  204. </sect2>
  205. <sect2 id="zend.form.quickstart.render">
  206. <title>Generar un formulario</title>
  207. <para>
  208. Generar un formulario es simple. La mayoría de los elementos
  209. utilizan un auxiliar de <classname>Zend_View</classname> para generarse a sí
  210. mismos, por lo tanto necesitan un objeto vista con el fin de
  211. generarse. Además, tiene dos opciones: usar el método render()
  212. del formulario, o simplemente mostrarlo con echo.
  213. </para>
  214. <programlisting language="php"><![CDATA[
  215. // Llamando a render() explicitamente, y pasando un objeto vista opcional:
  216. echo $form->render($view);
  217. // Suponiendo un objeto vista ha sido previamente establecido vía setView():
  218. echo $form;
  219. ]]></programlisting>
  220. <para>
  221. De manera predeterminada, <classname>Zend_Form</classname> y
  222. <classname>Zend_Form_Element</classname> intentarán utilizar el objeto vista
  223. inicializado en el <methodname>ViewRenderer</methodname>, lo que significa que
  224. no tendrá que establecer la vista manualmente cuando use el MVC de
  225. Zend Framework. Generar un formulario en un script vista es tan
  226. simple como:
  227. </para>
  228. <programlisting language="php"><![CDATA[
  229. <?php echo $this->form
  230. ]]></programlisting>
  231. <para>
  232. Detrás del telón, <classname>Zend_Form</classname> utiliza "decoradores"
  233. (decorators) para generar la salida. Estos decoradores pueden
  234. reemplazar, añadir o anteponer contenido, y tienen plena
  235. introspección al elemento que les es pasado. Como resultado, puede
  236. combinar múltiples decoradores para lograr efectos personalizados.
  237. Predeterminadamente, <classname>Zend_Form_Element</classname> actualmente
  238. combina cuatro decoradores para obtener su salida; la configuración
  239. sería como sigue:
  240. </para>
  241. <programlisting language="php"><![CDATA[
  242. $element->addDecorators(array(
  243. 'ViewHelper',
  244. 'Errors',
  245. array('HtmlTag', array('tag' => 'dd')),
  246. array('Label', array('tag' => 'dt')),
  247. ));
  248. ]]></programlisting>
  249. <para>
  250. (Donde &lt;HELPERNAME&gt; es el nombre de un view helper que
  251. utilizar, y varía según el elemento)
  252. </para>
  253. <para>
  254. Lo anterior crea una salida como la siguiente:
  255. </para>
  256. <programlisting language="html"><![CDATA[
  257. <dt><label for="username" class="required">Username</dt>
  258. <dd>
  259. <input type="text" name="username" value="123-abc" />
  260. <ul class="errors">
  261. <li>'123-abc' has not only alphabetic and digit characters</li>
  262. <li>'123-abc' does not match against pattern '/^[a-z]/i'</li>
  263. </ul>
  264. </dd>
  265. ]]></programlisting>
  266. <para>
  267. (Aunque no con el mismo formato.)
  268. </para>
  269. <para>
  270. Puede cambiar los decoradores usados para un elemento si desea tener
  271. diferente salida; véase la sección sobre decoradores para mayor
  272. información.
  273. </para>
  274. <para>
  275. El propio formulario simplemente itera sobre los elementos y
  276. los cubre en un &lt;form&gt; HTML. El action y method que
  277. proporcionó cuando definió el formulario se pasan a la etiqueta
  278. <methodname>&lt;form&gt;</methodname>, como cualquier atributo que establezca
  279. vía <methodname>setAttribs()</methodname> y familia.
  280. </para>
  281. <para>
  282. Elementos son desplegados en el orden en el que fueron registrados,
  283. o, si el elemento contienen un atributo de orden, ese orden será
  284. utilizado. Usted puede fijar el orden de un elemento usando:
  285. </para>
  286. <programlisting language="php"><![CDATA[
  287. $element->setOrder(10);
  288. ]]></programlisting>
  289. <para>
  290. O, cuando crea un elemento, pasándolo como una opción:
  291. </para>
  292. <programlisting language="php"><![CDATA[
  293. $form->addElement('text', 'username', array('order' => 10));
  294. ]]></programlisting>
  295. </sect2>
  296. <sect2 id="zend.form.quickstart.validate">
  297. <title>Comprobar si un formulario es válido</title>
  298. <para>
  299. Después que un formulario es enviado, necesitará comprobar y ver si
  300. pasa las validaciones. Cada elemento es valuado contra los datos
  301. provistos; si una clave no está presente y el campo fue marcado como
  302. requerido, la validación se ejecuta contra un valor nulo.
  303. </para>
  304. <para>
  305. ¿De dónde provienen los datos?. Puede usar <methodname>$_POST</methodname> o
  306. <methodname>$_GET</methodname>, o cualquier otra fuente de datos que tenga a
  307. mano (solicitud de un servicio web, por ejemplo):
  308. </para>
  309. <programlisting language="php"><![CDATA[
  310. if ($form->isValid($_POST)) {
  311. // ¡Correcto!
  312. } else {
  313. // ¡Fallo!
  314. }
  315. ]]></programlisting>
  316. <para>
  317. Con solicitudes AJAX, a veces puede ignorar la validación de un solo
  318. elemento, o grupo de elementos.
  319. <methodname>isValidPartial()</methodname> validará parcialmente el formulario.
  320. A diferencia de <methodname>isValid()</methodname>, que como sea, si alguna
  321. clave no esta presente, no ejecutará las validaciones para ese
  322. elemento en particular.
  323. </para>
  324. <programlisting language="php"><![CDATA[
  325. if ($form->isValidPartial($_POST)) {
  326. // de los elementos presentes, todos pasaron las validaciones
  327. } else {
  328. // uno u más elementos probados no pasaron las validaciones
  329. }
  330. ]]></programlisting>
  331. <para>
  332. Un método adicional, <methodname>processAjax()</methodname>, puede también ser
  333. usado para validar formularios parciales. A diferencia de
  334. <methodname>isValidPartial()</methodname>, regresa una cadena en formato JSON
  335. conteniendo mensajes de error en caso de fallo.
  336. </para>
  337. <para>
  338. Asumiendo que sus validaciones han pasado, ahora puede obtener los
  339. valores filtrados:
  340. </para>
  341. <programlisting language="php"><![CDATA[
  342. $values = $form->getValues();
  343. ]]></programlisting>
  344. <para>
  345. Si necesita los valores sin filtrar en algún punto, utilice:
  346. </para>
  347. <programlisting language="php"><![CDATA[
  348. $unfiltered = $form->getUnfilteredValues();
  349. ]]></programlisting>
  350. </sect2>
  351. <sect2 id="zend.form.quickstart.errorstatus">
  352. <title>Obteniendo el estado de error</title>
  353. <para>
  354. Entonces, ¿su formulario no es válido? En la mayoría de los casos,
  355. simplemente puede generar el formulario nuevamente y los errores se
  356. mostrarán cuando se usen los decoradores predeterminados:
  357. </para>
  358. <programlisting language="php"><![CDATA[
  359. if (!$form->isValid($_POST)) {
  360. echo $form;
  361. // o asigne al objeto vista y genere una vista...
  362. $this->view->form = $form;
  363. return $this->render('form');
  364. }
  365. ]]></programlisting>
  366. <para>
  367. Si quiere inspeccionar los errores, tiene dos métodos.
  368. <methodname>getErrors()</methodname> regresa una matriz asociativa de nombres /
  369. códigos de elementos (donde códigos es una matriz de códigos de
  370. error). <methodname>getMessages()</methodname> regresa una matriz asociativa
  371. de nombres / mensajes de elementos (donde mensajes es una matriz
  372. asociativa de pares código de error / mensaje de error). Si un
  373. elemento no tiene ningún error, no será incluido en la matriz.
  374. </para>
  375. </sect2>
  376. <sect2 id="zend.form.quickstart.puttingtogether">
  377. <title>Poniendo todo junto</title>
  378. <para>
  379. Construyamos un simple formulario de login. Necesitaremos
  380. elementos que representen:
  381. </para>
  382. <itemizedlist>
  383. <listitem><para>usuario</para></listitem>
  384. <listitem><para>contraseña</para></listitem>
  385. <listitem><para>Botón de ingreso</para></listitem>
  386. </itemizedlist>
  387. <para>
  388. Para nuestros propósitos, vamos a suponer que un usuario válido
  389. cumplirá con tener solo caracteres alfanuméricos, comenzar con una
  390. letra, tener una longitud mínima de 6 caracteres y una longitud
  391. máxima de 20 caracteres; se normalizarán en minúsculas. Las
  392. contraseñas deben tener un mínimo de 6 caracteres. Cuando se procese
  393. vamos simplemente a mostrar el valor, por lo que puede permanecer
  394. inválido.
  395. </para>
  396. <para>
  397. Usaremos el poder de la opciones de configuración de
  398. <classname>Zend_Form</classname> para crear el formulario:
  399. </para>
  400. <programlisting language="php"><![CDATA[
  401. $form = new Zend_Form();
  402. $form->setAction('/user/login')
  403. ->setMethod('post');
  404. // Crea un y configura el elemento username
  405. $username = $form->createElement('text', 'username');
  406. $username->addValidator('alnum')
  407. ->addValidator('regex', false, array('/^[a-z]+/'))
  408. ->addValidator('stringLength', false, array(6, 20))
  409. ->setRequired(true)
  410. ->addFilter('StringToLower');
  411. // Crea y configura el elemento password:
  412. $password = $form->createElement('password', 'password');
  413. $password->addValidator('StringLength', false, array(6))
  414. ->setRequired(true);
  415. // Añade los elementos al formulario:
  416. $form->addElement($username)
  417. ->addElement($password)
  418. // uso de addElement() como fábrica para crear el botón 'Login':
  419. ->addElement('submit', 'login', array('label' => 'Login'));
  420. ]]></programlisting>
  421. <para>
  422. A continuación, vamos a crear un controlador para manejar esto:
  423. </para>
  424. <programlisting language="php"><![CDATA[
  425. class UserController extends Zend_Controller_Action
  426. {
  427. public function getForm()
  428. {
  429. // crea el formulario como se indicó arriba
  430. return $form;
  431. }
  432. public function indexAction()
  433. {
  434. // genera user/form.phtml
  435. $this->view->form = $this->getForm();
  436. $this->render('form');
  437. }
  438. public function loginAction()
  439. {
  440. if (!$this->getRequest()->isPost()) {
  441. return $this->_forward('index');
  442. }
  443. $form = $this->getForm();
  444. if (!$form->isValid($_POST)) {
  445. // Falla la validación; Se vuelve a mostrar el formulario
  446. $this->view->form = $form;
  447. return $this->render('form');
  448. }
  449. $values = $form->getValues();
  450. // ahora intenta y autentica...
  451. }
  452. }
  453. ]]></programlisting>
  454. <para>
  455. Y un script para la vista que muestra el formulario:
  456. </para>
  457. <programlisting language="php"><![CDATA[
  458. <h2>Please login:</h2>
  459. <?php echo $this->form
  460. ]]></programlisting>
  461. <para>
  462. Como notará en el código del controlador, hay más trabajo por hacer:
  463. mientras la información enviada sea válida, necesitará todavía
  464. realizar la autenticación usando <methodname>Zend_Auth</methodname>, por
  465. ejemplo.
  466. </para>
  467. </sect2>
  468. <sect2 id="zend.form.quickstart.config">
  469. <title>Usando un objeto Zend_Config</title>
  470. <para>
  471. Todas las clases <classname>Zend_Form</classname> son configurables mediante
  472. <classname>Zend_Config</classname>; puede incluso pasar un objeto al
  473. constructor o pasarlo a través de <methodname>setConfig()</methodname>. Veamos
  474. cómo podemos crear el formulario anterior usando un archivo INI.
  475. Primero, vamos a seguir las recomendaciones, y colocaremos nuestras
  476. configuraciones dentro de secciones reflejando su objetivo y
  477. y enfocándonos en la sección 'development'. A continuación,
  478. pondremos en una sección de configuración para el controlador dado
  479. ('user'), y una clave para el formulario ('login'):
  480. </para>
  481. <programlisting language="ini"><![CDATA[
  482. [development]
  483. ; metainformación general del formulario
  484. user.login.action = "/user/login"
  485. user.login.method = "post"
  486. ; elemento username
  487. user.login.elements.username.type = "text"
  488. user.login.elements.username.options.validators.alnum.validator = "alnum"
  489. user.login.elements.username.options.validators.regex.validator = "regex"
  490. user.login.elements.username.options.validators.regex.options.pattern = "/^[a-z]/i"
  491. user.login.elements.username.options.validators.strlen.validator = "StringLength"
  492. user.login.elements.username.options.validators.strlen.options.min = "6"
  493. user.login.elements.username.options.validators.strlen.options.max = "20"
  494. user.login.elements.username.options.required = true
  495. user.login.elements.username.options.filters.lower.filter = "StringToLower"
  496. ; elemento password
  497. user.login.elements.password.type = "password"
  498. user.login.elements.password.options.validators.strlen.validator = "StringLength"
  499. user.login.elements.password.options.validators.strlen.options.min = "6"
  500. user.login.elements.password.options.required = true
  501. ; elemento submit
  502. user.login.elements.submit.type = "submit"
  503. ]]></programlisting>
  504. <para>
  505. Entonces puede pasarlo al constructor del formulario:
  506. </para>
  507. <programlisting language="php"><![CDATA[
  508. $config = new Zend_Config_Ini($configFile, 'development');
  509. $form = new Zend_Form($config->user->login);
  510. ]]></programlisting>
  511. <para>
  512. y el formulario entero será definido.
  513. </para>
  514. </sect2>
  515. <sect2 id="zend.form.quickstart.conclusion">
  516. <title>Conclusión</title>
  517. <para>
  518. Esperamos que después de este pequeño tutorial sea capaz de descubrir
  519. el poder y flexibilidad de <classname>Zend_Form</classname>. Continúe leyendo
  520. para profundizar más en el tema.
  521. </para>
  522. </sect2>
  523. </sect1>
  524. <!--
  525. vim:se ts=4 sw=4 et:
  526. -->