Zend\Form – Formularios en ZendFramework 2
Por Juan Carlos Sosa, @JuanC_Sosa
Debemos recordar lo complicado que era hacer formularios complejos con el componente Form en ZendFramework 1; un formulario que te llevaba un par de horas se podía extender hasta más de cinco horas dependiendo de la complejidad del diseño, debido a que los decoradores (decorators) son un poco ambiguos y a veces, practicamente se lograba el resultado final a prueba y error, sin olvidar los dolores de cabeza y la presión para entregar el resultado.
Afortunadamente para ZendFramework 2 los decoradores han desaparecido, lo que para algunos fueron excelentes noticias (me incluyo) para otros no fue algo con lo que estuvieran muy de acuerdo. Lo que se implementó en el nuevo componente Zend\Form es una separación de los conceptos, es decir, podremos manejar totalmente en partes cada parte que conforma un campo de entrada de datos en un formulario (etiquetas, mensajes de error, campos de texto, checkbox, etc.)
Veremos ahora un poco de código para entender como se hace esto.
Consideren lo siguiente:
– Un simple formulario con para obtener la contraseña olvidada: caja de texto para correo electrónico y el botón de envío de datos al server.
El código en la clase de formulario sería de la siguiente forma:
namespace Application\Form;
use Zend\Form\Form;
class ObtenPass extends Form
{
public function __construct($name = null)
{
$this->add(array(
‘name’ => ’email’,
‘type’ => ‘Zend\Form\Element\Text’,
‘options’ => array(
‘label’ => Tu Correo’,
),
‘attributes’ => array(‘id’ => ’email’),
));
$this->add(array(
‘name’ => ‘submit’,
‘type’ => ‘Zend\Form\Element\Submit’,
‘attributes’ => array(
‘value’ => ‘Obtener’,
‘class’ => ‘btn-success’,
),
));
}
}
En el controlador tendríamos lo siguiente:
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Application\Form\ObtenPass as ObtenPassForm;
class IndexController extends AbstractActionController
{
public function obtenPassFormAction()
{
$form = new ObtenPassForm();
return array(‘form’ => $form);
}
}
Ahora la parte interesante, ¿cómo lo representamos en la vista (view)?
Veamos más código.
$form = $this->form;
$form->setAttribute(‘action’, $this->url(obten-pass’));
$form->prepare();
echo $this->form()->openTag($form) . PHP_EOL;
echo $this->formLabel($form->get(’email’)) . PHP_EOL;
echo $this->formInput($form->get(’email’)) . PHP_EOL;
echo $this->FormElementErrors($form->get(’email’)) . PHP_EOL;
echo $this->formSubmit($form->get(‘submit’)) . PHP_EOL;
echo $this->form()->closeTag($form) . PHP_EOL;
Como se puede observar claramente tenemos cada parte del elemento del formulario por separado, esto gracias a los ViewHelpers que ya se encuentran listos para usar dentro de ZendFramework 2; de tal formar que podemos insertar cada pieza de este en diferentes tags de HTML y prácticamente acomodarlos a nuestro gusto o adaptarlo a un código HTML que previamente nos hayan proporcionado.
En mi opinión esto es una maravilla. ¿Y tú qué opinas?