Tengo un primer aproach armado para la parte de "Vista" del MVC que estoy armando. Aún está muy crudo, le faltan controles y seguro habrá mejores formas de aplicarlo, pero quisiera mostrarlo para ver qué opinan y recibir algunos comentarios!
El tema es así... tengo un directorio /templates/ en donde tengo subdirectorios con templates... por ejemplo, tengo el template "basic":
/templates/basic/0_head.php
/templates/basic/1_content.php (siempre estará vacío)
/templates/basic/2_head.php
A su vez dentro de /templates/ tengo archivos sueltos... por ejemplo, "index.php".
LA IDEA
Basicamente, quiero que desde el controlador yo pueda decirle al view:
"Quiero usar el tempalte 'BASIC' (que me da una presentación visual para el encabezado y el footer) ... y quiero que el centro / contenidos sea el archivo xxx.php"
El view va a incluir todos los archivos de forma ordenada, los del directorio del template indicado + el archivo con los contenidos generados recientemente por el MODEL.
Esto lo hago con los siguientes metodos:
1. setTemplate($nombre);
a. Define el nombre del template en la clase
b. Entra al directorio $nombre y busca todos los archivos almacenandolos en un array
c. Ordena alfabéticamente ese array
2. display($nombre);
a. Recorre el array de archivos del template
b. Reemplaza el archivo n_contents.php por el archivo $nombre
c. incluye ( include() ) todos los archivos de forma ordenada
Dentro de mi directorio /templates/basic/ tengo todos los archivos con su numero de orden antepuesto en el nombr de archivo (para que la inclusión sea ordenada). Luego tengo el archivo "señuelo" x_contents.php que está vacio pero me sirve para saber en qué orden voy a incluir al archivo independiente del template.
Códigos:
Código PHP:
function setTemplate($name) {
$path = site_path . 'templates'. DIRSEP . $name . DIRSEP;
$this->templateName = $name;
$directorio = opendir($path);
while ($archivo = readdir($directorio)) {
if ($archivo != "." && $archivo != "..")
$this->templateFiles[] = $archivo;
}
sort($this->templateFiles);
closedir($directorio);
return true;
}
function display($name) {
if (count($this->templateFiles) > 0) {
foreach($this->templateFiles as $key => $value) {
$path = site_path . 'templates' . DIRSEP . $this->templateName . DIRSEP . $value;
if (substr($value, 2) == "contents.php") {
$value = $name.'.php';
$path = site_path . 'templates' . DIRSEP . $value;
}
if (!file_exists($path)) {
trigger_error ('Template file `' . $value . '` does not exist.', E_USER_NOTICE);
return false;
}
// Load variables
foreach ($this->vars as $key => $value) {
$$key = $value;
}
include ($path);
}
}
return true;
}
Otra opcion sería tener un archivo dentro de cada directorio de templates que contenga el orden de inclusion para encabezado, footer, menu y CONTENIDOS. Esto sería simplemente un primer aproach...
¿Qué les opinan?
Un saludo!!
PD: El código esta muy asi nomás, ya lo se, lo hice a lo rapido para poder plasmar la idea...