Comunidad de diseño web y desarrollo en internet online

Aprendamos MVC implementando el uso de plantillas!!

Citar            
MensajeEscrito el 28 Jul 2009 02:01 am
Estoy trabajando sobre un proyecto donde la idea es utilizar el patron de diseno MVC e implementar el uso de DWOO para la gestion de las plantillas y URLs amigables/bonitas/preciosas/legibles/etc.

Primero me voy a adelantar a algunas preguntas:
1. ¿Por qué no utilizar frameworks como CakePHP, ZF, Symphony, etc?
Me parecen herramientas fenomenales por la infinidad de sus ventajas... pero prefiero aprender programando algo desde cero.
2. ¿Y que hay con eso de utilizar plantillas tercerizadas?
Lo de las plantillas es simplemente por que no muestran nada mas que las vistas...

Entendiendo esto, creo que dejo en claro mi inquietud por arrancar algo, no desde cero sino, desde quince.

Bueno, comienzo con lo que tengo... ya ustedes podran decirme que mejorar!!

1. Un vistazo rapidito a las carpetas/archivos involucrados




2. Los archivos y sus roles



Con esta primera "configuracion" se espera que el documento imprima "Contenido de la pagina principal!!". Notese que ejecutar "www.host.com" seria igual a que ejecutar "www.host.com/home/index" o "www.host.com/index.php?url=home/index/arg1/arg2/arg[N]"

index.php


Este archivo carga la configuracion inicial, imprime las plantillas y carga el controlador y ejecuta la accion dentro de ese controlador segun la variable GET[url]

Código PHP :

<?php
/**
 * Carga la configuracion inicial (contiene variables para mostrar en la vista y las utilizadas por el sistema)
 */
 require('config.php');
/**
 * Habilita el uso de las plantillas (aca es en donde DWOO entra en juego)
 * Crea el objeto Dwoo y se guarda en la variable $tpl
 */
 require(ROOT_BASEDIR.DS.'includes\dwoo\dwooAutoload.php');
 $tpl = new Dwoo();
/**
 * Carga la cabecera de la plantilla
 * Utiliza el primer comando DWOO para cargar un archivo e imprimirlo
 */
 $tpl_header = new Dwoo_Template_File(TPL_BASEDIR.DS.'header.tpl');
 $tpl->output($tpl_header,$tpl_var);
/**
 * Crea un arreglo segun URL
 * @ $controller, es el primer valor del arreglo $url y llamara a dicho archivo mediante un require
 * @ $action, es la accion dentro del controlador y esta sera la que se ejecute
 */
 $url = (!empty($_GET['url'])) ? explode('/',$_GET['url']) : false ;
 $controller = (!empty($url[0])) ? $url[0] : 'home' ;
 $action = (!empty($url[1])) ? $url[1] : 'index' ;
 $args = (!empty($url[2])) ? array_slice($url,2) : false ;
 $args = (!empty($args)) ? $args : false ;
/**
 * Carga el controlador mediante un require dentro de la carpeta "root/content/controllers/"
 * solo si este archivo existe, sino, muestra un error y para el proceso.
 */
 $loadController = strtolower($controller).'Controller.php';
 $loadController = ROOT_BASEDIR.DS.'content\controllers'.DS.$loadController;
 if (is_file($loadController)) { require($loadController); }
 else { die('<h1>El controlador "'.$controller.'" no existe</h1>'); }
/**
 * Verifica si la funcion $action puede ser llamada previo requerimiento del controlador y la ejecuta
 * Si esta funcion no puede ejecutarse, envia un error y termina el proceso.
 */
 if (is_callable($action)) { $action($args); }
 else { die('<h1>La accion "'.$action.'" no existe dentro del controlador "'.$controller.'"</h1>'); }
/**
 * Carga el footer de la plantilla y lo imprime en el documento
 */
 $tpl_footer = new Dwoo_Template_File(TPL_BASEDIR.DS.'footer.tpl');
 $tpl->output($tpl_footer,$tpl_var);
?>


config.php


Contiene variables necesarias para mostrar en la plantilla y las utilizadas por el sistema

Código PHP :

<?php
/**
 * Miscelaneas
 * @ error_reporting(E_ALL), imprime errores en el documento
 */
 error_reporting(E_ALL);
 
/**
 * Conexion SQL
 * @ hostname = nombre de host (rara vez se necesitara editar este valor)
 * @ username = nombre de usuario mysql
 * @ password = contrasena del usuario mysql
 * @ database = base de datos a la cual se conectara
 */
 $sql['hostname'] = 'localhost';
 $sql['username'] = 'user';
 $sql['password'] = 'pass';
 $sql['database'] = 'data';

/**
 * Variables definidas
 * @ TPL_NAME, nombre del directorio de la plantilla dentro de "root/content/themes/"
 * @ DS, caracter que representa al separador de directorios
 * @ ROOT_BASEDIR, ruta absoluta del directorio raiz ("user\www")
 * @ ROOT_DIR, ruta relativa del directorio raiz del sitio ("http://www.host.com")
 * @ TPL_BASEDIR, ruta absoluta del directorio de la plantilla ("user\www\host\content\themes\tpl_name")
 * @ TPL_DIR, ruta relativa del directorio de la plantilla ("http://www.host.com/content/themes/tpl_name")
 */
 if (!defined('TPL_NAME')) {
    define('TPL_NAME','default');
 }
 if (!defined('DS')) {
    define('DS',DIRECTORY_SEPARATOR);
 }
 if (!defined('ROOT_BASEDIR')) {
    define ('ROOT_BASEDIR', dirname(__FILE__));
 }
 if (!defined('ROOT_DIR')) {
    define('ROOT_DIR','http://127.0.0.1/vhm');
 }
 if (!defined('TPL_BASEDIR')) {
    define('TPL_BASEDIR',ROOT_BASEDIR.'\content\themes\\'.TPL_NAME);
 }
 if (!defined('TPL_DIR')) {
    define('TPL_DIR',ROOT_DIR.'/content/themes/'.TPL_NAME);
 }
/**
 * Variables de comunicacion con la vista
 * @ PAGE_TITLE, titulo por defecto de las vistas
 * @ TPL_BASEDIR, ruta absoluta del directorio de la plantilla
 * @ TPL_DIR, ruta relativa del directorio de la plantilla
 */
 $tpl_var['page_title'] = 'Bienvenido!';
 $tpl_var['tpl_basedir'] = TPL_BASEDIR;
 $tpl_var['tpl_dir'] = TPL_DIR;

?>


.htaccess


El que hace que "www.host.com/index.php?url=home/index/arg1" pueda verse como "www.host.com/home/index/arg1" (si, url amigables)

Código :


<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
   
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 

</IfModule>


/content/controllers/homeController.php


Archivo que se encarga de conectarse a la base de datos y de mostrar las vistas

Código PHP :

<?php
/**
 * La variable $args contiene los parametros pasados por $url despues de la accion.
 * Es decir: www.host.com/controlador/accion/arg1/arg2/arg3/arg[N]
 */
function index($args) {
   global $tpl;
   global $tpl_var;
   /**
    * Configuracion e impresion del documento
    */
    $tpl->output(TPL_BASEDIR.DS.'index.tpl', $tpl_var);
}

?>

/content/themes/default/header.tpl


La cabecera que se incluye desde index.php

Código HTML :

<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{$page_title}</title>
<link rel="stylesheet" href="{$tpl_dir}/css/generic.css" />
</head>
<body>


/content/themes/default/index.tpl


El contenido cargado desde la accion del controlador

Código HTML :

Contenido de la pagina principal!!


/content/themes/default/header.tpl


El pie cargado desde index.php

Código HTML :

</body>
</html>


3. Observaciones


Por ahi lei que utilizar clases seria lo mas adecuado y estaria bueno que alguien me apuntase y dijese como es que esto se puede hacer utilizando clases. Otra cosa es lo de los argumentos... me gusta la idea de como lo trabajan los "grandes" frameworks, me refiero a que cuando tienes una accion dentro de un controlador, puedes utilizar algo como:

Código PHP :

<?php
class homeController extends appController { 

  function index($arg1, $arg2) {
    $this->set('arg1', $arg1);
  }

}
?>


... esto significa que puedes pasar aquellos argumentos desde:

Código :

www.host.com/controlador/action/arg1/arg2


... no se si queda claro.

Y bueno, ya ire viendo otras "incomodidades"... pero por el momento son aquellas que mencione!.

4. Objetivos


Personalmente, aprender y poder gestionar un patron de diseno de manera facil y sin depender de terceros.
Y en general, ayudar a otros que esten en la misma que yo... y que tambien se interesen en esto.

5. Licitacion


Estan todos invitados a compartir sus experiencias y ayudar para que la gente como nosotros, pobres mortales y de una raza inferior a la de grandes programadores, podamos aprender a armar un buen proyecto!!

Por Necrophasto

Claber

148 de clabLevel



Genero:Masculino  

Diseñador gráfico y web

firefox
Citar            
MensajeEscrito el 28 Jul 2009 04:23 pm
excelente yo tambien tengo interes de aprender un poco de mvc saludos

Por talcual

686 de clabLevel



 

Colombia

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.