Zend Framework/Zend Db/ABM Básico con Validaciones

De Wikilibros, la colección de libros de texto de contenido libre.
Saltar a: navegación, buscar

Introducción[editar]

Aquí se explicará un ejemplo muy similar al Zend Framework/Zend Db/ABM Básico (se recomienda ver ese ejemplo antes), pero con el extra de la verificación previa de los datos mediante validaciones de Zend.

En esta sección se detallarán los puntos más importantes del ejemplo. Más abajo se encuentra el código completo del ejemplo.

A todos los invitamos a suscribirse al grupo Zend Framework Hispano. Ahí colocaremos los archivos de ejemplos para que puedan descargarlos. Podés bajar el código de este ejemplo aquí zft_db_ABM_Validaciones.zip

En este ejemplo accederemos hacia la base de datos world la cual se puede descargar desde http://downloads.mysql.com/docs/world.sql.gz, y la guía de instalación de la misma se puede encontrar en http://dev.mysql.com/doc/world-setup/en/world-setup.html. Podés encontrar otros detalles de la utilización de esta base de datos en Zend Framework/Zend Db/Configuración Básica.

Validaciones[editar]

La parte más importante de este ejemplo se encuentra en el #/application/controllers/WorldController.php.

<?php
class WorldController extends Zend_Controller_Action
{
    function init()
    {
        $response = $this->getResponse();
        $response->insert('sidebarLeft', $this->view->render('sidebarLeft.phtml'));
        $response->insert('sidebarRight', $this->view->render('sidebarRight.phtml'));
        $response->insert('header', $this->view->render('header.phtml'));
        $response->insert('footer', $this->view->render('footer.phtml'));
        // Para poder crear, almacenar y manipular mensajes de errores entre las pantallas
        $this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
    }

    // El index es por defecto el listado
    public function indexAction()
    {
            $city = new City();
            $this->view->cities = $city->listCities();   
    }
    
    // Aqui solo es necesario el ingreso de datos
    public function altaAction()
    {
        $this->view->mensajes = $this->_helper->_flashMessenger->getMessages();
    }
    
    // Para eliminar una entrada al hacer click en eliminar
    public function bajaAction()
    {
                $city = new City();
                // Se obtiene la entrada a eliminar mediante el ID
                $where = $city->getAdapter()->quoteInto('ID = ?', $this->_request->getParam('ID'));
                // Se elimina la entrada de la Base de Datos
                $city->delete($where);       
    }
    
    // Para modificar los valores de una entrada al hacer click en modificar
    public function modificacionAction()
    {
                $city = new City();
                $this->view->mensajes = $this->_helper->_flashMessenger->getMessages();
                // Se obtiene los datos de la entrada a modificar mediante el ID
                $where = $city->getAdapter()->quoteInto('ID = ?', $this->_request->getParam('ID'));
                $this->view->city = $city->fetchAll($where);
    }
    
    // Lógica para guardar datos, ya sea para dar un alta o para modificar
    public function guardarAction()
    {
                $city = new City();
                // Si llega un ID por POST o GET, se guarda en esta variable.
                // Sino, se le asigna false (para determinar más adelante si se trata
                // de un alta o una modificación)
                $ID = $this->_request->getParam('ID',false);
                // Pasa el ID a la pantalla de guardar para saber si se trata de un alta
                // o una modificación
                $this->view->ID = $ID;
                
                // Preparación de los datos para la validación
                $lsName                 = $this->_request->getParam('Name');
                $lsCountryCode  = $this->_request->getParam('CountryCode');
                $lsDistrict             = $this->_request->getParam('District');
                $lsPopulation   = $this->_request->getParam('Population');
                
                // Objetos para las validaciones:
                // Para validar no vacíos
                $validator                      = new Zend_Validate_NotEmpty();
                // Para validar números enteros
                $validatorInt           = new Zend_Validate_Int();
                // Para validar tres caracteres (para usar con el CountryCode)
                $validatorLength        = new Zend_Validate_StringLength(3, 3);
                
                // Contador de errores
                $iContador = 0; 
                
                // Si no se ingresó el nombre de la ciudad...
                if (!$validator->isValid($lsName)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar un nombre.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                // Si no se ingresó un código de país de tres caracteres...
                if (!$validatorLength->isValid($lsCountryCode)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar un código de país de tres caracteres.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                // Si no se ingresó un districto...
                if (!$validator->isValid($lsDistrict)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar un districto.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                // Si no se ingresó la cantidad de población...
                if (!$validator->isValid($lsPopulation)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar una cantidad de población.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                // Si la cantidad de población no es un número...
                if (!$validatorInt->isValid($lsPopulation)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('La cantidad de población debe ser un número.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                
                // Si no hubo errores de validación:
                if ($iContador == 0) {
                        // Preparación de los datos para ser guardados
                        $data = array(
                            'Name'                      => $this->_request->getParam('Name'),
                            'CountryCode'       => $this->_request->getParam('CountryCode'),
                                'District'              => $this->_request->getParam('District'),
                                'Population'    => $this->_request->getParam('Population')
                        );
                        // Si por POST o GET vino un ID, es porque se trata de una modificacion
                        if($ID){
                                // Se realiza la actualización sobre la entrada seleccionada
                                $where = $city->getAdapter()->quoteInto('ID = ?', $ID);
                                $city->update($data, $where);
                        // Sino, se trata de un alta
                        }else{
                                // Se realiza el alta de una nueva entrada
                                $city->insert($data);        
                        }
                // Si hubo algún error de validación:
                } else {
                        // Se crea un objeto destinado a redireccionar
                        $this->_redirector = $this->_helper->getHelper('Redirector');
                        // Si por POST o GET vino un ID, es porque se trata de una modificación, y sino, es un alta 
                        if($ID) {
                                // Si era una modificación, vuelvo al formulario de modificación para mostrar los errores
                                // de validación y le paso el ID de nuevo
                                $this->_redirector->gotoUrl('/world/modificacion/ID/' . $ID);
                        } else {
                                // Si era un alta, vuelvo al formulario de alta para mostrar los errores de validación
                                // y para que se reingresen los datos
                                $this->_redirector->gotoUrl('/world/alta');
                        }
                }
    }
}

Para empezar, vamos a necesitar una forma de comunicar los errores entre las distintas pantallas y acciones. Para ello, disponemos de una herramienta de Zend diseñada exclusivamente para pasar los mensajes de error, el flashMessenger, que cargaremos de la siguiente manera en la función init() del controlador #/application/controllers/WorldController.php.

    function init()
    {
        $response = $this->getResponse();
        $response->insert('sidebarLeft', $this->view->render('sidebarLeft.phtml'));
        $response->insert('sidebarRight', $this->view->render('sidebarRight.phtml'));
        $response->insert('header', $this->view->render('header.phtml'));
        $response->insert('footer', $this->view->render('footer.phtml'));

        // Para poder crear, almacenar y manipular mensajes de errores entre las pantallas
        $this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
    }

Para cargar los mensajes de error que vaya almacenando esta herramienta, debemos incluir en los action que vayan a recibir mensajes la siguiente línea:

        $this->view->mensajes = $this->_helper->_flashMessenger->getMessages();

En este caso debemos incluirla en altaAction() y modificacionAction(), ya que son los action que preparan los datos para los formularios.

    // Aqui solo es necesario el ingreso de datos
    public function altaAction()
    {
        $this->view->mensajes = $this->_helper->_flashMessenger->getMessages();
    }
    // Para modificar los valores de una entrada al hacer click en modificar
    public function modificacionAction()
    {
                $city = new City();
                $this->view->mensajes = $this->_helper->_flashMessenger->getMessages();
                // Se obtiene los datos de la entrada a modificar mediante el ID
                $where = $city->getAdapter()->quoteInto('ID = ?', $this->_request->getParam('ID'));
                $this->view->city = $city->fetchAll($where);
    }

Cuando desde alguno de los dos formularios (alta o modificación) pasemos los datos al action guardarAction() mediante el botón guardar, antes de guardarlos este action realizará la validación de los datos para determinar si pueden almacenarse correctamente en la tabla.

Para ello, se guardan los datos en variables separadas

                // Preparación de los datos para la validación
                $lsName                 = $this->_request->getParam('Name');
                $lsCountryCode  = $this->_request->getParam('CountryCode');
                $lsDistrict             = $this->_request->getParam('District');
                $lsPopulation   = $this->_request->getParam('Population');

se crean los objetos que nos servirán de herramienta para validar los datos

                // Objetos para las validaciones:
                // Para validar no vacíos
                $validator = new Zend_Validate_NotEmpty();
                // Para validar números enteros
                $validatorInt = new Zend_Validate_Int();
                // Para validar tres caracteres (para usar con el CountryCode)
                $validatorLength = new Zend_Validate_StringLength(3, 3);

y se instancia un contador de errores que nos servirá para determinar si algún dato faltó ser ingresado o es de formato incorrecto.

                // Contador de errores
                $iContador = 0;

Luego, mediante las herramientas de validación anteriormente mensionadas, se verifican uno por uno los datos, y por cada error se genera un mensaje que guardaremos en nuestra herramienta para mensajes que declaramos en la función init() del controlador #/application/controllers/WorldController.php.

                // Si no se ingresó el nombre de la ciudad...
                if (!$validator->isValid($lsName)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar un nombre.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                // Si no se ingresó un código de país de tres caracteres...
                if (!$validatorLength->isValid($lsCountryCode)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar un código de país de tres caracteres.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                // Si no se ingresó un districto...
                if (!$validator->isValid($lsDistrict)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar un districto.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                // Si no se ingresó la cantidad de población...
                if (!$validator->isValid($lsPopulation)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar una cantidad de población.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                // Si la cantidad de población no es un número...
                if (!$validatorInt->isValid($lsPopulation)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('La cantidad de población debe ser un número.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }

Como podemos ver, los distintos datos son verificados por distintos tipos de validadores de Zend.

Para el nombre de la ciudad y el distrito usamos un validador que verifica que el dato no sea una cadena vacía, ni esté conformada por ciertos caracteres prohibidos, y en caso de no ser válido el dato, agregamos un mensaje de error indicando que se debe ingresar ese campo y sumamos una unidad al contador de errores.

                // Para validar no vacíos
                $validator = new Zend_Validate_NotEmpty();
                // Si no se ingresó el nombre de la ciudad...
                if (!$validator->isValid($lsName)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar un nombre.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }

En cambio, para el código de país usamos otro tipo de validador que verifica si la cantidad de caracteres está entre el primer parámetro y el segundo. Como en este caso necesitamos que el dato sea de exactamente tres caracteres, le indicamos un mínimo de tres y un máximo de tres.

                // Para validar tres caracteres (para usar con el CountryCode)
                $validatorLength = new Zend_Validate_StringLength(3, 3);

Si el código de país no tiene tres caracteres, generamos el mensaje de error que será almacenada y transportada por la herramienta de Zend, y le sumamos uno al contador de errores.

                // Si no se ingresó un código de país de tres caracteres...
                if (!$validatorLength->isValid($lsCountryCode)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar un código de país de tres caracteres.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }

De la misma manera, hay otro tipo de validador que usamos para determinar si el número de población ingresado es realmente un número entero, o contiene otros caracteres que no deben estar.

                // Para validar números enteros
                $validatorInt           = new Zend_Validate_Int();

(Se pueden encontrar gran variedad de tipos de Validators y ejemplos sobre cómo usarlos en [1])

Después usamos el contador de errores para saber qué debemos hacer. Si no hubo errores, el procedimiento siguiente es exactamente igual a cuando guardábamos un dato en el ejemplo anterior (Zend Framework/Zend Db/ABM Básico)

                // Si no hubo errores de validación:
                if ($iContador == 0) {
                        // Preparación de los datos para ser guardados
                        $data = array(
                            'Name'                      => $this->_request->getParam('Name'),
                            'CountryCode'       => $this->_request->getParam('CountryCode'),
                                'District'              => $this->_request->getParam('District'),
                                'Population'    => $this->_request->getParam('Population')
                        );
                        // Si por POST o GET vino un ID, es porque se trata de una modificacion
                        if($ID){
                                // Se realiza la actualización sobre la entrada seleccionada
                                $where = $city->getAdapter()->quoteInto('ID = ?', $ID);
                                $city->update($data, $where);
                        // Sino, se trata de un alta
                        }else{
                                // Se realiza el alta de una nueva entrada
                                $city->insert($data);        
                        }

Sino, significa que hubo errores, por lo tanto, debemos volver mediante un redireccionamiento a la página del formulario. Pero a su vez debemos determinar CUÁL de los formularios era, si el de alta o el de modificación, y para ello preguntamos si llegó un ID como parámetro. Si tenemos un ID, es porque estábamos modificando una entrada, y sino, es porque estábamos realizando un alta.

                // Si hubo algún error de validación:
                } else {
                        // Se crea un objeto destinado a redireccionar
                        $this->_redirector = $this->_helper->getHelper('Redirector');
                        // Si por POST o GET vino un ID, es porque se trata de una modificación, y sino, es un alta 
                        if($ID) {
                                // Si era una modificación, vuelvo al formulario de modificación para mostrar los errores
                                // de validación y le paso el ID de nuevo
                                $this->_redirector->gotoUrl('/world/modificacion/ID/' . $ID);
                        } else {
                                // Si era un alta, vuelvo al formulario de alta para mostrar los errores de validación
                                // y para que se reingresen los datos
                                $this->_redirector->gotoUrl('/world/alta');
                        }

Como podemos ver, para el redireccionamiento usaremos otra herramienta del Zend. Es muy simple de usar y con estos ejemplos es suficiente para entender cómo usarlos. Se trata de instanciar un objeto $this->_helper->getHelper('Redirector'), y luego podemos dedireccionar mediante la función $this->_redirector->gotoUrl('/controller/action') del objeto que instancíamos, en donde controller es el controlador objetivo y action es la acción a ejecutar de dicho controlador. También podemos pasarle una dirección con parámetros, como se ve aquí cuando redireccionamos hacia el formulario de modificación.

                        // Se crea un objeto destinado a redireccionar
                        $this->_redirector = $this->_helper->getHelper('Redirector');
                                $this->_redirector->gotoUrl('/world/modificacion/ID/' . $ID);
                                $this->_redirector->gotoUrl('/world/alta');

Por último, debemos agregar en las pantallas de los formularios (alta #/application/views/scripts/world/alta.phtml y modificación #/application/views/scripts/world/modificacion.phtml) un lugar donde se mostrarán los errores en caso de existir. En dicho lugar crearemos un código php para determinar si hubo errores. En caso de que los haya, recorremos el array donde guardamos los mensajes de error mediante un foreach, y los mostramos en pantalla en líneas sucesivas.

<span>
<?php
// Si hay mensajes de error provenientes de una validación, los muestra
if (count($this->mensajes) > 0) {
        foreach ($this->mensajes as $msg) {
                echo $msg.'<br>';
        }
}
?>
</span>

Estructura de archivos[editar]

La estructura de los archivos será al siguiente

Archivo:Zft db basica abm validate.png

/html/index.php[editar]

Breve descripción del archivo

Plantilla:Zf /index.php

<?php
define('ROOT_DIR', dirname(dirname(__FILE__)));

// Setup path to the Zend Framework files
set_include_path('.'
        . PATH_SEPARATOR . ROOT_DIR.'/lib/'
        . PATH_SEPARATOR . ROOT_DIR.'/application/models/'
        . PATH_SEPARATOR . get_include_path()
);


require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();

// Inicializar el MVC
Zend_Layout::startMvc(array('layoutPath' => ROOT_DIR.'/application/views/layouts'));


try {
        // Seteos para la conexion con la base de datos
        $db = Zend_Db::factory('Pdo_Mysql', array(
            'host'     => 'localhost',
            'username' => 'root',
            'password' => 'r00t',
            'dbname'   => 'world'
        ));
        
        //Test de conexion con la base de datos
        $db->getConnection();        
        
        // Establecemos que $db sera el Adapter por defecto
        Zend_Db_Table_Abstract::setDefaultAdapter($db);

} catch (Zend_Db_Adapter_Exception $e) {
    //Sucedio un error con las credenciales del usuario o la base de datos.
    die($e->getMessage());
    
} catch (Zend_Exception $e) {
        // Sucedio un error inexperado
        die($e->getMessage());
        
}


// Run!
$frontController = Zend_Controller_Front::getInstance();
$frontController->addControllerDirectory(ROOT_DIR.'/application/controllers');
$frontController->throwExceptions(true);
try {
    $frontController->dispatch();
} catch(Exception $e) {
    echo nl2br($e->__toString());
}


/html/.htaccess[editar]

Breve descripción del archivo

Este archivo me permite realizar una redireccion utilizando apache, aqui me indica que cada vez que ingrese a la url http://localhost/zft ( que es donde reside este ejemplo ) nos redireccionara hacia http://localhost/zft/html que es la url base de la aplicacion.

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php


/html/css/grid.css[editar]

Breve descripción del archivo

Plantilla:Zf /css/grid.css

/* Site Grid by BoxedCSS.com */

#bcss-header {

        width:100%;

        background:#FFFFE5; /* you can delete this, it's just a visual aid */

        clear:both;

        }

#bcss-sidebar-1 {

        width:27%;

        float:left;

        background:#FFE5FF; /* you can delete this, it's just a visual aid */

        }

#bcss-sidebar-2 {

        width:13%;

        float:left;

        background:#F7FBEA; /* you can delete this, it's just a visual aid */

        }

#bcss-content {

        width:60%;

        min-height: 400px;

        float:left;

        background:#E5F2FF; /* you can delete this, it's just a visual aid */

        }

#bcss-footer {

        width:100%;

        clear:both;

        background:#FFF2E5; /* you can delete this, it's just a visual aid */

        }


/application/models/City.php[editar]

Breve descripción del archivo

Plantilla:Zf /application/models/City.php

<?php
class City extends Zend_Db_Table_Abstract
{
        protected $_name = 'City';      
        // Devuelve un listado de 10 ciudades ordenadas descendentemente por ID
        public function listCities(){
                $result = $this->fetchAll(null ,'id desc',10,0);
                return $result;
        }
}


/application/controllers/WorldController.php[editar]

Breve descripción del archivo

Plantilla:Zf /application/controllers/WorldController.php

<?php
class WorldController extends Zend_Controller_Action
{
    function init()
    {
        $response = $this->getResponse();
        $response->insert('sidebarLeft', $this->view->render('sidebarLeft.phtml'));
        $response->insert('sidebarRight', $this->view->render('sidebarRight.phtml'));
        $response->insert('header', $this->view->render('header.phtml'));
        $response->insert('footer', $this->view->render('footer.phtml'));
        // Para poder crear, almacenar y manipular mensajes de errores entre las pantallas
        $this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
    }

    // El index es por defecto el listado
    public function indexAction()
    {
            $city = new City();
            $this->view->cities = $city->listCities();   
    }
    
    // Aqui solo es necesario el ingreso de datos
    public function altaAction()
    {
        $this->view->mensajes = $this->_helper->_flashMessenger->getMessages();
    }
    
    // Para eliminar una entrada al hacer click en eliminar
    public function bajaAction()
    {
                $city = new City();
                // Se obtiene la entrada a eliminar mediante el ID
                $where = $city->getAdapter()->quoteInto('ID = ?', $this->_request->getParam('ID'));
                // Se elimina la entrada de la Base de Datos
                $city->delete($where);       
    }
    
    // Para modificar los valores de una entrada al hacer click en modificar
    public function modificacionAction()
    {
                $city = new City();
                $this->view->mensajes = $this->_helper->_flashMessenger->getMessages();
                // Se obtiene los datos de la entrada a modificar mediante el ID
                $where = $city->getAdapter()->quoteInto('ID = ?', $this->_request->getParam('ID'));
                $this->view->city = $city->fetchAll($where);
    }
    
    // Lógica para guardar datos, ya sea para dar un alta o para modificar
    public function guardarAction()
    {
                $city = new City();
                // Si llega un ID por POST o GET, se guarda en esta variable.
                // Sino, se le asigna false (para determinar más adelante si se trata
                // de un alta o una modificación)
                $ID = $this->_request->getParam('ID',false);
                // Pasa el ID a la pantalla de guardar para saber si se trata de un alta
                // o una modificación
                $this->view->ID = $ID;
                
                // Preparación de los datos para la validación
                $lsName                 = $this->_request->getParam('Name');
                $lsCountryCode  = $this->_request->getParam('CountryCode');
                $lsDistrict             = $this->_request->getParam('District');
                $lsPopulation   = $this->_request->getParam('Population');
                
                // Objetos para las validaciones:
                // Para validar no vacíos
                $validator                      = new Zend_Validate_NotEmpty();
                // Para validar números enteros
                $validatorInt           = new Zend_Validate_Int();
                // Para validar tres caracteres (para usar con el CountryCode)
                $validatorLength        = new Zend_Validate_StringLength(3, 3);
                
                // Contador de errores
                $iContador = 0; 
                
                // Si no se ingresó el nombre de la ciudad...
                if (!$validator->isValid($lsName)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar un nombre.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                // Si no se ingresó un código de país de tres caracteres...
                if (!$validatorLength->isValid($lsCountryCode)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar un código de país de tres caracteres.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                // Si no se ingresó un districto...
                if (!$validator->isValid($lsDistrict)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar un districto.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                // Si no se ingresó la cantidad de población...
                if (!$validator->isValid($lsPopulation)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('Debe ingresar una cantidad de población.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                // Si la cantidad de población no es un número...
                if (!$validatorInt->isValid($lsPopulation)) {
                        // ...genera un mensaje de error,...
                        $this->_helper->_flashMessenger->addMessage('La cantidad de población debe ser un número.');
                        // ...y suma uno al contador de errores.
                        $iContador++;
                }
                
                // Si no hubo errores de validación:
                if ($iContador == 0) {
                        // Preparación de los datos para ser guardados
                        $data = array(
                            'Name'                      => $this->_request->getParam('Name'),
                            'CountryCode'       => $this->_request->getParam('CountryCode'),
                                'District'              => $this->_request->getParam('District'),
                                'Population'    => $this->_request->getParam('Population')
                        );
                        // Si por POST o GET vino un ID, es porque se trata de una modificacion
                        if($ID){
                                // Se realiza la actualizacion sobre la entrada seleccionada
                                $where = $city->getAdapter()->quoteInto('ID = ?', $ID);
                                $city->update($data, $where);
                        // Sino, se trata de un alta
                        }else{
                                // Se realiza el alta de una nueva entrada
                                $city->insert($data);        
                        }
                // Si hubo algún error de validación:
                } else {
                        // Se crea un objeto destinado a redireccionar
                        $this->_redirector = $this->_helper->getHelper('Redirector');
                        // Si por POST o GET vino un ID, es porque se trata de una modificación, y sino, es un alta 
                        if($ID) {
                                // Si era una modificación, vuelvo al formulario de modificación para mostrar los errores
                                // de validación y le paso el ID de nuevo
                                $this->_redirector->gotoUrl('/world/modificacion/ID/' . $ID);
                        } else {
                                // Si era un alta, vuelvo al formulario de alta para mostrar los errores de validación
                                // y para que se reingresen los datos
                                $this->_redirector->gotoUrl('/world/alta');
                        }
                }
    }
}


/application/controllers/IndexController.php[editar]

Breve descripción del archivo

Este es el controlador por defecto que se invoca en el caso de no especificar que controlador utilizar. Aqui podemos ver las acciones que el mismo puede realizar.

<?php
class IndexController extends Zend_Controller_Action
{
    function init()
    {
        $response = $this->getResponse();
        $response->insert('sidebarLeft', $this->view->render('sidebarLeft.phtml'));
        $response->insert('sidebarRight', $this->view->render('sidebarRight.phtml'));
        $response->insert('header', $this->view->render('header.phtml'));
        $response->insert('footer', $this->view->render('footer.phtml')); 
    }   
    public function indexAction()
    {
    }
}


/application/views/scripts/sidebarRight.phtml[editar]

Breve descripción del archivo

Este archivo forma parte del layout #/application/views/layouts/layout.phtml.

Esta sección incluye el contenido de la parte lateral derecha del layout.

<h1>Sidebar Right</h1>


/application/views/scripts/footer.phtml[editar]

Breve descripción del archivo

Este archivo forma parte del layout #/application/views/layouts/layout.phtml.

Esta sección incluye el contenido del pie del layout.

<h1>Footer</h1>


/application/views/scripts/header.phtml[editar]

Breve descripción del archivo

Este archivo forma parte del layout #/application/views/layouts/layout.phtml.

Esta sección incluye el contenido del encabezado del layout.

<h1>Header</h1>


/application/views/scripts/sidebarLeft.phtml[editar]

Breve descripción del archivo

Este archivo forma parte del layout #/application/views/layouts/layout.phtml.

Esta sección incluye el contenido de la parte lateral izquierda del layout.

<ul>
<li><a href="<?php echo $this->baseUrl();?>/index/index">home</a></li>
<li><a href="<?php echo $this->baseUrl();?>/world/index">world</a></li>
<li><a href="http://www.google.com">google</a></li>
</ul>


/application/views/scripts/world/index.phtml[editar]

Breve descripción del archivo

Plantilla:Zf /application/views/scripts/world/index.phtml

<table border="1">
  <tr>
    <th>ID</th>
    <th>Name</th>
    <th>CountryCode</th>
    <th>District</th>
    <th>Population</th>
    <th><a href="<?php echo $this->baseUrl() ?>/world/alta">Alta</a></th>

  </tr>
                                
  
<?php foreach ($this->cities as $city) {?>    
  <tr>
    <td><?=$city->ID?></td>
    <td><?=$city->Name?></td>
    <td><?=$city->CountryCode?></td>
    <td><?=$city->District?></td>
    <td><?=$city->Population?></td>
    <td>
            <a href="<?php echo $this->baseUrl() ?>/world/modificacion/ID/<?=$city->ID?>">Modificacion</a>
            <a href="<?php echo $this->baseUrl() ?>/world/baja/ID/<?=$city->ID?>">Baja</a>
    </td>
  </tr>
  
<?php }?>    
</table>


/application/views/scripts/world/alta.phtml[editar]

Breve descripción del archivo

Plantilla:Zf /application/views/scripts/world/alta.phtml

<span>
<?php
// Si hay mensajes de error provenientes de una validación, los muestra
if (count($this->mensajes) > 0) {
        foreach ($this->mensajes as $msg) {
                echo $msg.'<br>';
        }
}
?>
</span>
<form name="alta" action="<?php echo $this->baseUrl() ?>/world/guardar" method="post">
<table>
  <tr>
    <td>Name</td>
    <td><input type="text" name="Name" value=""></td>
  </tr>
  <tr>
    <td>CountryCode</td>
    <td><input type="text" name="CountryCode" value=""></td>
  </tr>
  <tr>
    <td>District</td>
    <td><input type="text" name="District" value=""></td>
  </tr>
  <tr>
    <td>Population</td>
    <td><input type="text" name="Population" value=""></td>
  </tr>
  <tr>
    <td colspan="2"><input type="submit" name="guardar" value="Guardar"></td>
  </tr>
</table>
</form>


/application/views/scripts/world/modificacion.phtml[editar]

Breve descripción del archivo

Plantilla:Zf /application/views/scripts/world/modificacion.phtml

<?php
// Se guarda en esta variable los datos de la entrada a modificar
$city = $this->city->current();

// Se cargan los datos de la entrada a modificar en la pantalla?>
<span>
<?php
// Si hay mensajes de error provenientes de una validación, los muestra
if (count($this->mensajes) > 0) {
        foreach ($this->mensajes as $msg) {
                echo $msg.'<br>';
        }
}
?>
</span>
<form name="alta" action="<?php echo $this->baseUrl() ?>/world/guardar" method="post">
<table>
  <tr>
    <td>ID</td>
    <td><input type="text" name="ID" value="<?php echo $city->ID ?>"></td>
  </tr>
  <tr>
    <td>Name</td>
    <td><input type="text" name="Name" value="<?php echo $city->Name ?>"></td>
  </tr>
  <tr>
    <td>CountryCode</td>
    <td><input type="text" name="CountryCode" value="<?php echo $city->CountryCode ?>"></td>
  </tr>
  <tr>
    <td>District</td>
    <td><input type="text" name="District" value="<?php echo $city->District ?>"></td>
  </tr>
  <tr>
    <td>Population</td>
    <td><input type="text" name="Population" value="<?php echo $city->Population ?>"></td>
  </tr>
  <tr>
    <td colspan="2"><input type="submit" name="guardar" value="guardar"></td>
  </tr>
</table>
</form>


/application/views/scripts/world/baja.phtml[editar]

Breve descripción del archivo

Plantilla:Zf /application/views/scripts/world/baja.phtml

Entrada eliminada.

<a href="<?php echo $this->baseUrl() ?>/world/index">listado</a>


/application/views/scripts/world/guardar.phtml[editar]

Breve descripción del archivo

Plantilla:Zf /application/views/scripts/world/guardar.phtml

<?php
// Muestro un mensaje de éxito en la operación dependiendo si es un alta o
// una modificación
if ($this->ID) {
        echo "Modificación";
} else {
        echo "Alta";
}
?> realizada con éxito.

<a href="<?php echo $this->baseUrl() ?>/world/index">Listado</a>


/application/views/scripts/index/index.phtml[editar]

Breve descripción del archivo

Este archivo forma parte del layout #/application/views/layouts/layout.phtml.

Esta sección incluye el contenido de la accion que se esta ejecutando.

<h1>Hello World !!!</h1>


/application/views/layouts/layout.phtml[editar]

Breve descripción del archivo

Esta pagina nos permite definir la estructura del sitio, es decir su distribucion topografica, como ser si dispone de un encabezado, pie de pagina, barra lateral izquierada, barra lateral derecha y donde residira el contenido de la accion que se esta ejecutando actualmente.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
        <title>ZFTutorial :: Enfoque pragmatico</title>
        <link rel="stylesheet" type="text/css" href="<?php echo $this->baseUrl();?>/css/main.css">
    <link rel="stylesheet" type="text/css" href="<?php echo $this->baseUrl();?>/css/grid.css">
</head>
<body>
        <div id="bcss-header">
    <!-- bcss-header -->
        <?php echo $this->layout()->header ?>
    <!-- /bcss-header -->
        </div>
        
        <div id="bcss-sidebar-1">
    <!-- bcss-sidebar-1 -->
        <?php echo $this->layout()->sidebarLeft ?>
    <!-- /bcss-sidebar-1 -->
        </div>
        
        <div id="bcss-content">
    <!-- bcss-content -->
        <?php echo $this->layout()->content ?>
    <!-- /bcss-content -->        
        </div>
        
        <div id="bcss-sidebar-2">
    <!-- bcss-sidebar-2 -->
        <?php echo $this->layout()->sidebarRight ?>
    <!-- /bcss-sidebar-2 -->      
        </div>
        
        <div id="bcss-footer">
    <!-- bcss-footer -->
        <?php echo $this->layout()->footer ?>
    <!-- /bcss-footer --> 
        </div>
</body>
</html>


/application/views/helpers/BaseUrl.php[editar]

Breve descripción del archivo

Este helper me permite determinar en forma absoluta la url base de la aplicación.

<?php

class Zend_View_Helper_BaseUrl
{
    function baseUrl()
    {
        $fc = Zend_Controller_Front::getInstance();
        $request = $fc->getRequest();
        return $request->getBaseUrl();
    }
}