Zend_Form-QuickStart.xml 22 KB

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