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.
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
...
Última modificación: oct 4, 2024