Formularios en Zend Framework (III)



Hosting barato
VN:F [1.9.20_1166]
Rating: 0.0/10 (0 votes cast)
Continuamos con nuestra “versión” sobre la construcción de formularios en Zend Framework, teniendo siempre como premisas:

  • No tener código HTML o CSS en código que se ejecute en el servidor
  • Disminuir la carga del servidor al realizar ciertas validaciones a nivel de cliente
  • Crear formularios donde la distribucón de campos sea como nosotros queramos, y no secuencial, de arriba hacia abajo, como hace Zend Framework

En este tercer capítulo vamos a tratar los resultados que se generan en el servidor, ya sea por validaciones internas o por ejecuci&ooacute;n de un proceso.

Para ello, definiremos un controlador, una vista y un modelo encargado de representar cualquier resultado, y de ofrecer distintas alternativas, una vez finalizado el proceso.

Antes de comenzar a implementar cada uno de los componentes, decir, que para nuestra demo, no va a ser necesario crear un modelo, que en una aplicación real, sí sería necesario hacer, pero que para mostrar el mensaje que sale en caso de obtener un resultado positivo o negativo de un determinado proceso, no nos va a ser necesario.

Previo a la creación del nuevo controlador, vamos a preparar nuestra aplicación para poder guardar valores en sesión. Aclarar, que no es necesario tener la variable del archivo php.ini register_globals a “yes”. Para ello, en el archivo Bootstraps.php en al función _initViewHelpers() se debe añadir la instrucción Zend_Session::start();

protected function _initViewHelpers(){
		$this->bootstrap('layout');
		$layout = $this->getResource('layout');
		$view = $layout->getView();
		$view->doctype('XHTML1_STRICT');
		$view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
		$view->headMeta()->appendHttpEquiv('Cache-Control', 'no-cache');
		$view->headTitle()->setSeparator(' - ');
		$view->headTitle('Biblioteca');
		Zend_Session::start();
	}

Además debemos preparar el actual controlador Libro (LibroController.php) para que devuelva un error siempre que se produzca para darle una interpretación a través de un texto que mostremos al usuario de nuestra web, para ello, negamos el resultado correcto if (!$form->isValid($formData)) para poder hacer la prueba, por lo que nos llevará siempre al else, de dicho if, y ahí, meteremos en sesión la información que vamos a mostrar en la vista de resultado. Los datos que guardaremos serán:

  • Título
  • Mensaje
  • Opciones
public function anyadirAction(){
		$this->view->setEncoding('UTF-8');
		$this->view->headTitle("Añadir nuevo libro", 'PREPEND');
		//Añadimos el archivo de javascript que valide los campos de la página
		$this->view->headScript()->appendFile($this->view->baseUrl() . "/js/anyadir-libro.js");
		//Instanciamos el formulario
		$form = new Form_Libro();
		//Asignamos a la vista el formulario
		$this->view->form = $form;

		if ($this->getRequest()->isPost()){ //Si se envían los datos, los recuperamos del formulario
			$formData = $this->getRequest()->getPost();
			if (!$form->isValid($formData)){ //Validamos que los datos recibidos sean correctos
				//Asignamos los valores recuperados a variables
				$autor = $form->getValue('autor');
				$titulo = $form->getValue('titulo');
				//Creamos el modelo
				$libros = new Model_DbTable_Libros();
				//Insertamos el nuevo libro en nuestra BBDD
				$libros->addLibro($titulo, $autor);
				//Redireccionamos a la home, donde podremos ver el nuevo libro introducido.
				$this->_redirect('/');
			}else{ //Si los datos del formulario, no son válidos, se muestra el formulario con los datos de nuevo.
				//Creamos un namespace donde almacenar las variables en sesión
				$app = new Zend_Session_Namespace("app");
				$app->titulo = "Añadir libro";
				$app->texto = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse ut ante ac nulla tincidunt cursus tincidunt non elit. Ut rhoncus ullamcorper lorem ac ultrices. Pellentesque viverra porta dui, at feugiat enim iaculis lobortis. Donec justo turpis, convallis sit amet convallis at, molestie vitae metus. Mauris et turpis at lacus varius ultrices. Etiam vel lobortis justo. Proin euismod augue in metus blandit porttitor bibendum lorem venenatis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut sed tincidunt ante. Duis rhoncus consequat odio. Aliquam vitae dui ipsum. Nam consectetur ultrices nunc eu dapibus. Donec sit amet nulla. ";
				$opciones = array(0 => array(0 => "index", 1 => "index", 2 => "Ir a la home de la biblioteca"),
								  1 => array(0 => "http://www.google.com", 1 => "", 2 => "Ir a Google")
								 );
				$app->opc = $opciones;
				$_SESSION['opciones'] = $opciones;							//redirigimos a la nueva vista de resultado
				$this->_redirect('/resultado');
			}
		}
	}

Una vez hechos estos pasos, pasamos a construir nuestro controlador, la vista que dará soporte a dicho controlador. El modelo, en este caso, no lo vamos a construir, no nos sería necesario para hacer nuestra demo, pero sería necesario en una aplicación para que a partir del idioma y el resultado obtenido recuperar el título, el mensaje y las opciones oportunas.

Creamos el controlador (ResultadoController.phtml) con el siguiente código:

<?php

require_once 'Zend/Controller/Action.php';

class ResultadoController extends Zend_Controller_Action {
	/**
	 * The default action - show the home page
	 */
	public function indexAction() {
		$this->view->setEncoding('UTF-8');
		//Recuperamos los valores de sesion
		$app = new Zend_Session_Namespace("app");
		$this->view->titulo = htmlentities($app->titulo);;
		$this->view->texto = $$app->texto;
		$this->view->opc = $app->opc;
	}

}
?>

Y creamos la vista que nos dará el controlador definido anteriormente (index.phtml):

<h1><?php echo $this->titulo;?></h1><p />
<?php echo $this->texto;?><br />
<h5>&iquest;Qu&eacute; deseas hacer?</h5>
<?php
foreach ($this->opc as $option => $value){
	$controlador = $value[0];
	$pos1 = stripos($controlador, "http://");
	if ($pos1 != false)
		echo "<a href = '" . $this->url(array('controller'=>$value[0], 'action'=>$value[1])) . "'>" . $value[2] . "</a><br />";
	else
		echo "<a href = '" . $value[0] . "'>" . $value[2] . "</a><br />";
}
?>

Una vez realizados estos pasos, si ejecutamos la aplicación e intentamos añadir un libro, cualquiera, por código, forzaremos el error, y nos redirigirá a la vista de resultado final.

url: http://biblioteca.localhost:8080/libro/anyadir
Formulario añadir libro

url: http://biblioteca.localhost:8080/resultado
Resultado alta nuevo libro

Una vez visto cómo sería el tratamiento de los errores, decir, que este tratamiento se puede extender a cualquier tipo de resultado de manera que tendríamos un controlador, con su modelo, y su vista, encargados en presentar cualquier tipo de resultado de proceso. Algo que puede ser bastante interesante a la hora de tener en cuenta nuestro diseño de clases.

Quedaría ver cómo podemos crear componentes cuyo contenido puede obtenerse de una base de datos, como por ejemplo, un comboBox. Si el contenido de este fuera limitado, y sólo tratáremos un idioma, se podría poner en la propia vista, sin ningún problema. Pero tendríamos que analizar el cómo hacerlo cuando el volumen de datos de este comboBox sea elevado o dependa del idioma, o cuando cuyo contenido sea en función de los datos seleccionados. En el caso de que los datos del comboBox sea en función de los datos introducidos en el formulario, todo apunta que a una solución por ajax, sería factible, pero para el caso en el que el volumen de datos de este comboBox sea elevado, o estos datos dependan del idioma, tendremos que analizar qué alternativa tenemos a la que nos ofrece en la actualidad Zend Framework.

¡¡¡Y esto es todo por el momento!!!

¡¡¡Cualquier comentario, mejora, o ayuda sobre este tema siempre será bienvenido!!!

Comparte y disfruta:

Si te ha gustado este artículo, te puede interesar ...



Hosting barato