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