Zend Framework/Zend Db/Configuración básica

Introducción

editar

En esta sección se detallaran los puntos mas importantes de este ejemplo. Mas abajo se encuentra el código completo del ejemplo.


En este ejemplo la parte importante es #/html/index.php aquí tenemos que prestar especial atención al fragmento

        . PATH_SEPARATOR . ROOT_DIR.'/application/models'

es importante este inclusion de los modelos para que cuando el Zend_Loader se le solicite la lógica de negocio City pueda localizar dicha clase


//Acceso hacia la base de datos
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());
        
}

Aquí definimos que accederemos hacia la base de datos world la cual se puede descargar desde http://downloads.mysql.com/docs/world.sql.gz la guía de instalación se puede encontrar en http://dev.mysql.com/doc/world-setup/en/world-setup.html, especificamos también que utilizaremos el driver de mysql y ante la ocurrencia de un error detendremos la aplicación mostrando el motivo.


Podremos acceder desde el link que esta en #/application/views/scripts/sidebarLeft.phtml

<li><a href="<?php echo $this->baseUrl();?>/world/list-city">listCity</a></li>

hacia la página de ejemplo que nos muestra un listado de ciudades.

El flujo de sucesos es el siguiente


Analicemos que sucede en #/application/controllers/WorldController.php

            $city = new City();
            $this->view->cities = $city->listCities();     

en este código hacemos una llamada hacia la lógica de negocio y le pedimos que nos de un listado de ciudades, aquí es donde se empieza a ver la fortaleza del MVC, aquí la vista no tiene que saber nada de como se genera la lista, ni siquiera el controlador, encapsulando la lógica en una clase nos permite poder llamarla desde otros controladores y desplegarla en otras vistas.


Ahora veremos como recupera la lógica de negocio el listado #/application/models/City.php.

<?php
class City extends Zend_Db_Table_Abstract
{
        protected $_name = 'City';      
        
        public function listCities(){
                $result = $this->fetchAll(null ,null,10,0);
                return $result;
        }
}

Aquí vemos la implementación del patrón TDG donde la clase City nos permitira tener acceso hacia la tabla City del origen de datos. Enfoquemonos en el método listCities allí vemos que realiza una simple llamada fetchAll con un limite de 10 registros. Mas adelante detallaremos mejor como es el comportamiento de este patrón por ahora solo mostramos un ejemplo básico.


Por ultimo en #/application/views/scripts/world/list-city.phtml vemos que el listado que nos paso el controllador es visualizado creando una simple tabla

<table border="1">
  <tr>
    <th>ID</th>
    <th>Name</th>
    <th>CountryCode</th>
    <th>District</th>
    <th>Population</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>
  </tr>
  
<?php }?>    
</table>

Estructura de archivos

editar

La estructura de los archivos será al siguiente

Archivo:Zft db basica.png

/.htaccess

editar

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)$ html


/application/controllers/WorldController.php

editar

Breve descripción del archivo

<?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')); 
    }	
    public function indexAction()
    {
    }
    
    public function listCityAction(){
	    $city = new City();
	    $this->view->cities = $city->listCities();    	
    }

}


/application/controllers/IndexController.php

editar

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
/*
 * Zend Framework Tutorial
 * 
 * Este tutorial tiene un enfoque pragmatico, lo cual indica una amplia cantidad
 * de ejemplos. Este material forma parte del Wikibook en español para ZF.
 * 
 * @author		Mario Garcia
 * @copyright	Copyright (c) 2006-2008 Oh!Studio Media Solutions (http://www.ohstudio.com.ar)
 * @license		http://www.php.net/license/3_0.txt
 */


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/layouts/layout.phtml

editar

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 XHTML 1.0 Transitional//EN" 
					"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>ZFTutorial :: Enfoque pragmatico</title>
    <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

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

<?php
/**
 * Zend Framework Tutorial
 * 
 * Este tutorial tiene un enfoque pragmatico, lo cual indica una amplia cantidad
 * de ejemplos. Este material forma parte del Wikibook en español para ZF.
 * 
 * @author		Mario Garcia
 * @copyright	Copyright (c) 2006-2008 Oh!Studio Media Solutions (http://www.ohstudio.com.ar)
 * @license		http://www.php.net/license/3_0.txt
 */


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


/application/views/scripts/sidebarLeft.phtml

editar

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/list-city">listCity</a></li>
<li><a href="http://www.google.com">google</a></li>
</ul>


/application/views/scripts/header.phtml

editar

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/footer.phtml

editar

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/sidebarRight.phtml

editar

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/world/list-city.phtml

editar

Breve descripción del archivo

<table border="1">
  <tr>
    <th>ID</th>
    <th>Name</th>
    <th>CountryCode</th>
    <th>District</th>
    <th>Population</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>
  </tr>
  
<?php }?>    
</table>


/application/views/scripts/index/index.phtml

editar

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/models/City.php

editar

Breve descripción del archivo

<?php
class City extends Zend_Db_Table_Abstract
{
	protected $_name = 'City';	
	
	public function listCities(){
		$result = $this->fetchAll(null ,null,10,0);
		return $result;
	}
}


/html/index.php

editar

Este archivo es el boot de la aplicacion. Aqui seteamos los archivos de configuracion, acceso a datos, archivos de log, etc. Aqui se setea el frontController y el manejador de layout.

<?php
/**
 * Zend Framework Tutorial
 * 
 * Este tutorial tiene un enfoque pragmatico, lo cual indica una amplia cantidad
 * de ejemplos. Este material forma parte del Wikibook en español para ZF.
 * 
 * @author		Mario Garcia
 * @copyright	Copyright (c) 2006-2008 Oh!Studio Media Solutions (http://www.ohstudio.com.ar)
 * @license		http://www.php.net/license/3_0.txt
 */

/*poner comentario*/


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();

//Acceso hacia la base de datos
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());
        
}

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

// 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

Este archivo me permite determinar que todo archivo que no sea una imagen, ni js, ni css sea redireccionado hacia index.php.

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


/html/css/grid.css

editar

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

Aquí le aplicamos el estilo para la distribución de las secciones.

/* 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 */
	}