Proyecto BlogZf – Parte 3

Proyecto BlogZf – Parte 3
En los envíos anteriores vimos la forma de crear el frontend, la forma correcta de configurar el layout del sistema y como aprovecharlo. En esta oportunidad vamos a ver dos cosas muy importantes, como son la modularización del sistema, para crear un backend, y como conectarnos a la base de datos con Zend_Db.
Quiero que recuerden que el proyecto esta alojado en google code, pueden ver como esta quedando en http://www.blogzf.com.ar.

- Modularizar el sistema.

Uno de los problemas que me encuentro habitualmente en los foros o las listas de Zend Framework es como tener en un  mismo sistema frontend y Backoffice (backend) compartiendo la misma estructura. Este problema se puede resolver de varias formas, pero la manera correcta es crear módulos. En nuestro sistema actual teníamos el modulo default cargado, que no necesita mas configuracion, que declarar cual es el path de nuestros controllers, con el método setControllerDirectory(), y como parámetro le pasamos un string con el path correspondiente. Con esta acción, le estamos diciendo que el modulo default esta en esa ruta.

Si nosotros quisieramos agregar un modulo mas que en este caso vamos a llamarlo admin, en vez de pasarle un string vamos a pasarle un array, donde el índice va a ser el nombre del modulo, y el valor el path donde encontrar el controller.

Nuestra ruta actual es applications/controller/, esta es la ruta para el default, pero ahora que vamos a agregar un admin necesitamos ubicarlo en otro lugar. Ese lugar lo puede establecer ustedes, yo voy a elegir para guardarlo en applications/admin/controller. Ahora siguiendo esto en la carpeta application nos va a quedar la siguiente estructura.


Esto tiene una particularidad, los controllers de nuestro modulo admin, tienen que tener el prefijo de la carpeta, pero en Mayúscula no en minúscula como lo indica la lógica, ya que la carpeta admin esta en minúscula.

Ahora cuando queramos crear un controller el nombre seria algo así

  1.  
  2. <?php
  3. class Admin_IndexController extends Zend_Controller_Action
  4. {
  5. }
  6.  

Pero ya me estoy llendo por otro lado, ahora vamos a ver cual es la forma correcta de agregar los módulos en nuestro bootstrap.

  1.  
  2. <?php
  3. /** … */
  4. $controller = Zend_Controller_Front::getInstance();
  5. $controller->setParam( ‘config’, ‘config.default.ini’ )
  6.     ->setControllerDirectory( array(
  7.         ‘default’=> ‘../application/controller’,
  8.         ‘admin’=> ‘../application/admin/controller’))
  9.     ->throwExceptions(true)    
  10.     ->dispatch();
  11.  

Si o si tenemos que crear un modulo con el key default, y el otro es el que queremos agregar. Si quisieramos podríamos agregar muchos mas módulos, pero no es algo que veamos en este proyecto, pero se puede

Si hacen un svn update del proyecto, van a encontrar algunas lineas mas en este código, que son las que levantan los plugins. Pero esto lo dejamos para otra entrega.

- Leyendo una base de datos

Todo blog necesita de una base de datos para almacenar los post, ahora vamos a crear una nueva base de datos llamada blogzf.

Vamos a crear la tabla ‘posts‘, donde vamos a guardar todo el contenido de nuestro blog.

La tabla es la siguiente.

  1.  
  2. CREATE TABLE `blogzf`.`posts` (
  3. `post_id` MEDIUMINT( 10 ) NOT NULL AUTO_INCREMENT ,
  4. `user_id` MEDIUMINT( 10 ) NOT NULL ,
  5. `title` TEXT NOT NULL ,
  6. `content` LONGTEXT NOT NULL ,
  7. `comment` TINYINT( 1 ) NOT NULL ,
  8. `created_date` DATETIME NOT NULL ,
  9. `modified_date` DATETIME NOT NULL ,
  10. `status` CHAR( 10 ) NOT NULL ,
  11. PRIMARY KEY ( `post_id` )
  12. ) ENGINE = MYISAM;
  13.  

Y la tabla users.

  1.  
  2. CREATE TABLE `blogzf`.`users` (
  3. `user_id` MEDIUMINT( 10 ) NOT NULL AUTO_INCREMENT ,
  4. `username` CHAR( 50 ) NOT NULL ,
  5. `password` CHAR( 50 ) NOT NULL ,
  6. `display_name` CHAR( 100 ) NOT NULL ,
  7. `status` CHAR( 10 ) NOT NULL ,
  8. PRIMARY KEY ( `user_id` )
  9. ) ENGINE = MYISAM;
  10.  

Ahora vamos a tener que crear un ABML o CRUD (CREATE, READ, UPDATE, DELETE) para estos modulos.

En esta parte no vamos a darle funcionalidad a este modulo, vamos a dejarlo para la proxima, asi podemos extendernos un poco y ver Zend_Paginator, Zend_Form, entre otros.

Lo primero que tenemos que hacer es crear el controller, model, y vista de users, vamos a empezar con el mas facil.

Creamos los actions para nuestro CRUD.

  1.  
  2. <?php
  3. class Admin_UsersController extends Zend_Controller_Action
  4. {
  5.     public function preDispatch()
  6.     {
  7.        
  8.     }
  9.     public function createAction()
  10.     {
  11.        
  12.     }
  13.     public function readAction()
  14.     {
  15.        
  16.     }
  17.     public function updateAction()
  18.     {
  19.        
  20.     }
  21.     public function deleteAction()
  22.     {
  23.        
  24.     }
  25. }
  26.  
  27.  

El modelo va a ser bastante simple

  1.  
  2. <?php
  3. class Users extends Zend_Db_Table_Abstract
  4. {
  5.     protected $_name = ‘users’;
  6.     protected $_primary = ‘user_id’;
  7. }
  8.  

Y las vistas.

Un buen ejemplo de como crear un CRUD con Zend Framework  lo tenemos en el blog de Zsamer.
Lo primero que tenemos que hacer es configurar la conexion a la base de datos, los datos de esta lo vamos a poner en nuestro archivo de configuracion, config.default.ini.

[database]
db.adapter = PDO_MYSQL
db.config.host = localhost
db.config.username = blogzf
db.config.password = “password
db.config.dbname = blogzf

Supongamos que tenemos una base de datos en localhost llamada blogzf,  y un usuario blogzf con la clave “password“. esta seria la forma de representarlo en el ini.

Cuando levantamos esta configuracion tenemos que crear una conexion a la base de datos, esto lo vamos a hacer desde el preDispatch, la conexion la vamos a guardar en una variable privada llamada _db, para usarla en todo el modulo.

  1.  
  2. $this->_db = Zend_Db::factory(
  3.     $config->database->db->adapter,
  4.     $config->database->db->config
  5.     ->toArray() );
  6.  

Asi como paso con el bootstrap, el config no les va andar porque tienen que crear un archivo config.local.ini, con solo crearlo y dejarlo en blanco es suficiente, la idea de esto es generar un archivo con toda la configuracion generica, y uno que sea configurable para cada ambiente, desarrollo, qa, y Produccion. Pero eso lo vemos mas adelante.

En esta parte vimos

Zend_Config
Zend_Db