Zend Framework: Crear formulario con Zend_Form

Una de las grandes ventajas que observé al trabajar con Zend Framework fue el manejo de formularios con Zend_Form. A continuación os intentare enseñar cómo hacer un simple formulario de contacto utilizando Zend_Form, sus filtros y validadores.

Esta es la estructura de directorios de mi ejemplo para que tengáis una referencia de donde va cada archivo, aunque si ya habéis trabajado con Zend Framework no tendréis problemas:

Los pasos que he seguido han sido los siguientes:

1. Crear el objeto vista en Bootstrap, para ello en el archivo Bootstrap.php debéis tener un código parecido a este:

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
      
        protectedfunction _initView(){
              
            //Inicializamos la vista  
            $view=new Zend_View();
            $view->setEncoding('UTF-8');
            $view->doctype('XHTML1_STRICT');
            $view->headMeta()
                 ->appendHttpEquiv('Content-Type','text/html;charset=utf-8');
      
            //renderizamos la vista  
            $viewRenderer=
            Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
            $viewRenderer->setView($view);
              
            return$view;
        }
      
    }
?>

2. Una vez tenemos el objeto vista creado, nos vamos a por el formulario. Para ello dentro del directorio form creamos el archivo Contacto.php con el siguiente contenido:

<?php
class Application_Form_Contacto extends Zend_Form  
{
  
    publicfunction init()
    {
        /* Form Elements & Other Definitions Here ... */
        $this->setName('contacto');
           
        //creamos input text para escribir nombre     
        $nombre=new Zend_Form_Element_Text('nombre');
        //Cambiamos la etiqueta del elemento nombre  
        $nombre->setLabel('* Su Nombre:')->
        //Para establecer que el elemenento no puede quedar vacio  
        setRequired(true)->
        //StripTags elimina las etiquetas HTML  
        addFilter('StripTags')->
        //StringTrim quita todos los caracteres de espacio en blanco iniciales y finales  
        addFilter('StringTrim')->
        //Establecemos el tamaño del campo de texto  
        setAttrib('size',50)->
        //Establecemos el número de caracteres máximo del campo de texto  
        addValidator('stringLength',false,array(0,300))->
        //Cambiamos el mensaje de error para cuando el elemento del formulario se envia vacio  
        addValidator('NotEmpty',true,array('messages'=>array(
        Zend_Validate_NotEmpty::IS_EMPTY=>'Introducir su nombre es obligatorio.')));
   
        //creamos input text para escribir email    
        $email=new Zend_Form_Element_Text('email');
        $email->setLabel('* Su Email:')->
        setAttrib('size',50)->
        setRequired(true)->
        addFilter('StripTags')->
        addFilter('StringTrim')->
        addValidator('stringLength',false,array(0,320))->
        addValidator('NotEmpty',true,array('messages'=>array(
        Zend_Validate_NotEmpty::IS_EMPTY=>'Introducir su email es obligatorio.')))->
        //Cambiamos los mensajes de error para el elemento email  
        addValidator('EmailAddress',true,array('messages'=>array(
        Zend_Validate_EmailAddress::INVALID            =>"El tipo especificado no es válido, el valor debe ser una cadena de texto",
        Zend_Validate_EmailAddress::INVALID_FORMAT     =>"'%value%' no es una dirección de correo electrónico válida en el formato local-part@hostname",
        Zend_Validate_EmailAddress::INVALID_HOSTNAME   =>"'%hostname%' no es un nombre de host válido para la dirección de correo electrónico '%value%'",
        Zend_Validate_EmailAddress::INVALID_MX_RECORD  =>"'%hostname%' no parece tener un registro MX válido para la dirección de correo electrónico '%value%'",
        Zend_Validate_EmailAddress::INVALID_SEGMENT    =>"'%hostname%' no esta en un segmento de red ruteable. La dirección de correo electrónico '%value%' no se debe poder resolver desde una red pública.",
        Zend_Validate_EmailAddress::DOT_ATOM           =>"'%localPart%' no es igual al formato dot-atom",
        Zend_Validate_EmailAddress::QUOTED_STRING      =>"'%localPart%' no es igual al formato quoted-string",
        Zend_Validate_EmailAddress::INVALID_LOCAL_PART =>"'%localPart%' no es una parte local válida para la dirección de correo electrónico '%value%'",
        Zend_Validate_EmailAddress::LENGTH_EXCEEDED    =>"'%value%' excede la longitud permitida",)));
          
        //creamos input text para escribir la empresa   
        $empresa=new Zend_Form_Element_Text('empresa');
        $empresa->setLabel('Nombre de la empresa:')->
        setRequired(false)->
        addValidator('stringLength',false,array(0,200))->
        setAttrib('size',50)->
        addFilter('StripTags')->addFilter('StringTrim');
          
        //creamos input text para escribir website   
        $website=new Zend_Form_Element_Text('website');
        $website->setLabel('Sitio Web:')->setRequired(false)->
        addValidator('stringLength',false,array(0,320))->
        setAttrib('size',50)->
        addFilter('StripTags')->addFilter('StringTrim');
          
        //creamos input text para escribir el mensaje  
        $mensaje=new Zend_Form_Element_Textarea('mensaje');
        $mensaje->setLabel('* Mensaje:')->setRequired(true)->
        //especificamos el tamaño del textarea  
        setAttrib('cols','53')->setAttrib('rows','4')->
        addFilter('StripTags')->addFilter('StringTrim')->
        addValidator('stringLength',false,array(0,500))->
        addValidator('NotEmpty',true,array('messages'=>array(
        Zend_Validate_NotEmpty::IS_EMPTY=>'Introducir el mensaje es obligatorio.')));
            
        //boton para enviar formulario    
        $submit=new Zend_Form_Element_Submit('submit');
        $submit->setAttrib('idcontacto','submitbutton');
    
        //agrego los objetos creados al formulario    
        $this->addElements(array($nombre,
        $email,$empresa,$website,$mensaje,$submit));
    }
  
}
?>

Como podéis observar a cada elemento del formulario se le asignan diferentes atributos, filtros y validadores.

3. Creado el formulario lo llamamos desde el controlador IndexController en el archivo IndexController.php

<?php
class IndexController extends Zend_Controller_Action  
    {
      
        publicfunction init()
        {
            /* Initialize action controller here */
            $this->initView();
            $this->view->title="Formulario de Contacto";
        }
      
        publicfunction indexAction()
        {
            // action body   
            //creo el formulario    
            $formContacto=new Application_Form_Contacto();
            //cambio el texto del boton submit    
            $formContacto->submit->setLabel('Enviar ahora');
            //lo añado a la vista    
            $this->view->form=$formContacto;
            //los formularios envian sus datos a traves de POST    
            //si vienen datos de post, es que el usuario ha enviado el formulario  
            if($this->getRequest()->isPost())
            {
                //extrae un arreglo con los datos recibidos por POST    
                //es decir, los datos clave=>valor del formulario    
                $formData=$this->getRequest()->getPost();
                $formContacto->populate($formData);
                //isValid() revisa todos los validadores y filtros que le    
                //aplicamos a los objetos del formulario: se asegura de que los    
                //campos requeridos se hallan llenado, etc    
                if($formContacto->isValid($formData))
                {
                    //Aqui ya estamos seguros de que los datos son validos    
                    //Enviamos el email:  
                    $config=array('ssl'=>'tls','port'=>587,'auth'=>'login','username'=>'correo@dominio.com','password'=>'######');
                    $smtpConnection=new Zend_Mail_Transport_Smtp('smtp.dominio.com',$config);
      
                    $mail=new Zend_Mail('utf-8');
                    $mail->setFrom($formContacto->getValue('email'),'Emisor');
                    $mail->addTo('correo@dominio.com','Receptor');
                    $mail->setSubject('Asunto del correo');
                    $mail->setBodyHtml("Nombre:".$formContacto->getValue('nombre').
                                  "Empresa:".$formContacto->getValue('empresa').
                                   "Web:".$formContacto->getValue('website').
                                   "Mensaje:".$formContacto->getValue('mensaje'));
                    $mail->send($smtpConnection);
                    //vamos de nuevo a la página principal    
                    $this->_helper->redirector('index');
                }
                //si los datos del formulario no son validos, es decir, falta ingresar    
                //algunos o el formato es incorrecto...    
                else
                {
                    //esta funcion vuelve a cargar el formulario con los datos que se    
                    //enviaron, Y ADEMAS CON LOS MENSAJES DE ERROR  
                    $formContacto->populate($formData);
                }
              
            }
        }
      
      
    }
?>

4. Finalmente nos vamos a la plantilla index en el archivo index.phtml donde se reflejara la vista y mostramos el formulario con el siguiente código:

<?php echo $this->form;?>

El resultado es el siguiente formulario:

Probar el formulario y me comentáis.

Referencia: http://framework.zend.com/manual/en/zend.form.html

...

0 comentarios para Zend Framework: Crear formulario con Zend_Form

Deja un comentario




Si le ha parecido interesante nuestro artículo Zend Framework: Crear formulario con Zend_Form dentro de la categoría Zend Framework recuerde que puede suscribirse a nuestra dirección RSS,a nuestro newsletter o seguirnos en las redes sociales