Truco para manejar formularios en Zend Framework

Zend Framework es una herramienta que facilita multitud de tareas de programación php, pero como casi siempre suele pasar en estos casos su sencillez por un lado lo hace más complejo por otro.
Por ejemplo, a la hora de crear un simple formulario, Zend consigue hacerlo de forma sencilla, pero su marcado HTML casi nunca me convence, y hay que hurgar y hurgar hasta encontrar la forma específica que deseo.
Por esta cuestión cree un método que me facilita el tener un formulario a mi medida de una forma sencilla.
A continuación puedes descargar un archivo comprimido con la clase que utilizo: Abstract.php

El método setInput() lo tengo en la clase Application_Form_Abstract y simplemente tengo que hacer que el formulario que creemos extienda de esta clase.
Como podéis ver en la clase, este método llama a su vez a otros dos métodos:
genMessage() y genDecorator().

El método genMessage() simplemente crea unos mensajes de validación personalizados según el error mostrado por el validador del formulario.

El método genDecorator() es el que nos ayuda a definir el formato en que queremos que coloque las etiquetas HTML del formulario, por ejemplo yo lo tengo maquetado por tabla (‘table’), párrafo (‘p’), cabecera de nivel tres (‘h3′) y sin etiquetas (”), pero la gracia esta en crear tus propios decoradores a medida. Para comprobar el tipo de decorador que vamos a usar utilizo el array global $this->_decoratorName con los tipos de decoradores posibles.

Una vez tengas estos métodos en tu clase abstracta puedes invocarlo simplemente con lo siguiente:

$element[] = $this->setInput($type, $name);

Por ejemplo para un simple formulario de login solo habría que crear la siguiente clase:

class Application_Form_Login extends Application_Form_Abstract 
{ 

	public function init() 
	{ 
		//resetear los decoradores para eliminar el 'dl' 
		$this->setDecorators(array('FormElements','Form')); 

		$this->setName('login'); 

		//usuario 
		$type = 'Text'; 
		$name = 'usuario';

		$element[] = $this->setInput($type, $name); 

    		//password
    		$type = 'password'; 
		$name = 'pas'; 

		$element[] = $this->setInput($type, $name); 

		//Boton 
		$type = 'Submit'; 
		$name = 'continuar'; 

		$element[] = $this->setInput($type, $name);

		//añadir los elementos
		$this->addElements($element); 
	} 
}

Esta puede ser invocada desde un controlador o modelo de la siguiente forma:

	//creamos una instancia del formulario
	$form = new Application_Form_Login();
	//pasamos la instancia a la vista 
    	$this->view->form = $form;
	//comprobamos los datos recibidos por el formulario
	if ($this->getRequest()->isPost()) 
    	{
    		$formData = $this->getRequest()->getPost(); 
		//por hacer una muestra sencilla comparo los datos con un solo usuario de forma dura 
    		if ($form->isValid($formData) && $formData['usuario'] == 'Usuario' && $formData['pas'] == 'Password') 
    		{
			//Generamos las acciones deseadas, por ejemplo Saludar
    			$this->view->mensaje = 'Saludos Usuario'; 
    		} else 
    		{ 
    			//Denegamos el acceso
    			$this->view->mensaje = '¡¡¡No puedes pasar!!!';
    		} 
    	}

Al imprimir el formulario, en la vista, con un

echo $this->form;

generará el siguiente HTML:

<form id="login" enctype="application/x-www-form-urlencoded" action="" method="post">

<input type="text" name="usuario" id="usuario">

<input type="password" name="pas" id="pas" value="">

<input type="submit" name="continuar" id="continuar" value="Continuar"></form>

A continuación paso a explicar los parámetros que acepta el método setInput():

  1. $type: (obligatorio) es el tipo se elemento que deseamos crear, los valores posibles son: button , captcha, checkbox, multiCheckbox , file, hash, hidden , image , password , radio , reset , select, multiselect , submit , text , textarea. Puedes comprobar que es cada uno en El manual de Zend Framework.
  2. $name: (obligatorio) es una cadena de texto que aparecerá en el atributo name del elemento.
  3. $label=”: es una cadena de texto que aparecerá en la etiqueta label relacionada con el elemento.
  4. $value=null: el valor inicial que tendrá el elemento.
  5. $filter=array(): un array con las opciones de filtrado para el elemento, los elementos posibles del array son:
    • ‘required’ => true si es un campo requerido o false si no lo es.
    • ‘validator’ => un array con los validadores apropiados, como: array( ‘NotEmpty’, ‘EmailAddress’, ‘Digits’, ‘Alnum’, ‘Alpha’).
    • ‘StringLength’ => un array con el menor y mayor número de caracteres permitidos, por ejemplo: array(1, 9) .
    • GreaterThan’=> la cifra que debe superar, como: ’0′
    • ‘LessThan’=> la cifra a la que debe ser inferior, como: ’9′
    • ‘Between’ => un array con los números menor y mayor permitidos, por ejemplo: array(1, 9) .
  6. $attr=null: un array con los atributos deseados para el elemento, por ejemplo:
        array('style'=>'display: block; float: none; clear: both;',
              'class' =>'bloque').
  7. $description=null: una cadena de texto con la descripción del elemento que aparecerá a continuación de este.
  8. $mark=null: el marcado deseado para el elemento que utilizará el método genDecorator() para maquetar las etiquetas HTML del formulario, yo he desarrollado las siguientes: ‘table’, ‘p’, ‘h3′ y , si se declara ‘dl’ el formulario se genera en la forma por defecto, pero es mejor si desarrollas tus propios decoradores a medida.
    Se debe incluir en la nueva clase del formulario la siguiente línea para quitar el ‘dl’ que aparece por defecto englobando todos los elementos de formulario:

        $this->setDecorators(array('FormElements','Form')); 

    Sin embargo para maquetar con tabla hay que cambiarla por la etiqueta table de la siguiente forma:

        $this->setDecorators(array( 
             'FormElements', 
             array('HtmlTag', array('tag' => 'table')), 
             'Form' 
         ));
  9. $markAttr=array(): los atributos deseados para los decoradores del elemento, si se define un $mark vacío hay que definir los elementos en este parámetro para que aparezcan, como por ejemplo:
        array('label' => array('for' => $name, ),
              'Description'=>array('tag'=>false, 'class'=>false, 'escape' => false),
              'Errors' => array('tag' => 'span'),
              'HtmlTag'=>array('tag' => 'p', 'id'=>"form_email"))
  10. $options=null: un array con las opciones deseadas para el elemento, solo en caso de que las admita, como un select, multiCheckbox, radio, etc.. Su clave sera tomada como valor para la opción, y su valor como el nombre que será mostrado, por ejemplo:
        array(0 => 'No', 1 => 'Si', 2 => 'Tal vez')

    en un select sería:

        <option value="0" label="No">No</option>
        <option value="1" label="Si">Si</option>
        <option value="2" label="Tal vez">Tal vez</option>
  11. $noEscape=false: se puede definir como true en cuyo caso no escaparía los caracteres especiales, lo cual no es aconsejable ya que puede convertirse en un riesgo de seguridad, lo mejor es no utilizar este parámetro, yo lo tengo solo para realizar pruebas controladas.

Espero que mi humilde ‘truco’ os sea útil en vuestro desarrollo facilitándoos el manejo de formularios como me lo ha facilitado a mi.

Redes Sociales
Esta entrada fue publicada en Programación y etiquetada , , , . Guarda el enlace permanente.

2 respuestas a Truco para manejar formularios en Zend Framework

  1. Interesante blog . Aprendo algo con cada sito web todos los días. Siempre es estimulante poder devorar el contenido de otros escritores. Me gustaría usar algo de tu post en mi web, naturalmente dejare un enlace , si me lo permites. Gracias por compartir.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Blue Captcha Image Refrescar

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>