Pero hace unos días se me ha ocurrido la idea de hacer un plugin para un CMS, y me surgio la duda de como Crear y Usar plantillas, así que por supuesto, que mejor lugar que CrsitaLab para buscar información.
La suerte que encontré este magnífico tutorial Creación y uso de plantillas o templates en PHP, de Maikel, pero en vista que no cubría del todo mi idea, me he puesto a currar y romperme la cabeza, y esto he conseguido, a ver que os parece.
El principal, problema, por el que no me servía, era a la hora de trabajar los datos como arrays.
La estructura de las carpetas sería esta
En la carpeta clases, las clases a usar.
En la carpeta css, estarán los estilos .CSS
En la carpeta foro/funciones, estaran las operaciones que hay que realizar con los distintos valores, para un campo, cuyo nombre será el mismo que el del fichero a tratar. Y en este habrá una funcion con el mismo nombre.
En la carpeta foro/plantillas, estrán las plantillas a usar.
La idea parte de coger datos de una tabla en cuyo campo llamado DATOS tenemos este valor
{titulo|Cuatro bodas y un funeral}{genero|Comedia|Drama}
donde la primera división ( y no hablamos de futbol ), es el "campo virtual" de una tabla y el resto de divisiones son los valores para ese campo.
osea
campo: titulo
valor: Cuatro bodas y un funeral
campo: genero
valores: Comedia|Drama
Mi principal intención es permitir que los datos se puedan mostrar de distintas formas, simplemente indicandolo en la plantilla. Ni que decir que estas formas, deberían estar definidas en algún sitio y ese sitio será en la carpeta foro/funciones/"campo".php.
Empecemos con el código
Archivo index.php, creo que no hace falta explicación, aunque si hay alguno tan torpe como yo ( más es imposible ), que me lo diga
Código PHP :
<!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> <link rel="stylesheet" type="text/css" href="css/chory.plantillas.css"/> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Documento sin título</title> </head> <body> <?php include "plantillas.php"; ?> </body> </html>
Archivo plantillas.php[/b]
Código PHP :
<?php include "clases/clsPlantilla.php"; // Cargamos la clase para manejar las plantillas $Contenido=new Plantilla("peliculas"); // Cargamos la plantilla a usar $losDatos="{titulo|Cuatro bodas y un funeral}{genero|Comedia|Drama}"; // Estos son los datos que cojemos de la Base de Datos
Esta clase, que aún no la he metido en su archivo correspondiente, nos va a ayudar a preparar los valores, para pasarlos a la plantilla.
Código PHP :
class variables{ public $variables; function variables($datos) { $pattern = '/\{(.*?)\}/si'; preg_match_all($pattern, $datos, $misvalores); $valores=$misvalores[1]; foreach ( $valores as $dato) { $tmp=explode("|",$dato,2); // Separamos el campo de sus valores $variable= $tmp[0]; // Asisgnamos el campo $valorestmp=explode("|",$tmp[1]); esto es para comprovar si hay más de un valor if ( count($valorestmp) > 1 ) { $valores=$valorestmp; // Si los valores son múltiples, prepara el array } else { $valores=$tmp[1]; // Si solo es un valor } $this->variables[] = array($variable => $valores ); } } } $VARIABLES=new variables($losDatos); // En esta parte preparamos todos los campos y sus valores para pasarlos a la plantilla $losValores=NULL; foreach( $VARIABLES->variables as $valores ) { if ( $losValores==NULL) { $losValores=$valores; } else { $losValores=array_merge($losValores,$valores); } } $Contenido->asigna_variables( $losValores ); // Pasamos los datos a la plantilla $ContenidoString = $Contenido->muestra(); // echo $ContenidoString; ?>
Archivo chory.plantillas.css, Creo que tampoco hace falta explicarlo
Código CSS :
@CHARSET "ISO-8859-1"; body{ background-color:#CCC; } .menuitem{ background-color:white; font-weight:bold; font-size:6pt; text-transform:uppercase; padding-left:20px; padding-right:20px; padding-bottom:2px; padding-top:2px; border:#000 dotted 1px; margin-left:2px; margin-right:2px; } .menuitem:hover{ background-color:#666; border:#000 solid 1px; }
Archivo /clases/clsPlantilla.php
Código PHP :
class plantilla{ function plantilla($template_file) { $this->tpl_file = 'foro/plantillas/' . $template_file . '.tpl'; // Asignamos la plantilla correspondiente } function asigna_variables($vars) { $this->vars= (empty($this->vars)) ? $vars : $this->vars . $vars; // Asisgnamos los valores } function muestra() { if (!($this->fd = @fopen($this->tpl_file, 'r'))) { print_r('error al abrir la plantilla ' . $this->tpl_file); // Si no podemos cargar la plantilla nos muestra un error. } else { $this->template_file = fread($this->fd, filesize($this->tpl_file)); // Leemos el archivo de la plantilla fclose($this->fd); // Cerramos el archivo de la plantilla $this->mihtml = $this->template_file; // Cargamos la plantilla en memoria $this->mihtml = str_replace ("'", "\'", $this->mihtml); // Reemplazamos todos los ' por \' while (list($key, $val) = each($this->vars)) // Creamos una lista con todos los campos y sus valores y la recorremos { $patron="#\{(".$key."[a-z0-9\s\(\)\-=_]*?)\}#is"; // Este será el patrón de búsqueda de los campos en la plantilla. // Nos buscará tanto los {campo}, como los {campo estilo=x} para indicar el modo de presentación preg_match_all($patron, $this->mihtml, $claves); // Realizamos la búsqueda y el resultado lo asisgnamos a la la variable $clave foreach($claves[1] as $clave) // Usamos solo el array[1] devueltoen la búsqueda, y recorremos todos sus valores { $estilo=explode($key." estilo=",$clave); // Comprobamos si se ha definido un estilo diferente al de por defecto if ( is_array($val) ) // Comprobamos si hay más de un valor para el campo ( es un array ) { // Si es un array if ( !function_exists($key) ) // Miramos que no existe una función con el nombre del campo { // Si n existe include "foro/funciones/".$key.".php"; // Cargamos el archivo que contendrá esta función. Un fallo mio, no comprobar si existe el archivo } $$key = $key($val, $estilo[1]); // Llamamos a la función para que "trabaje" los datos } else { // si no es un array $$key = $val; // Asisgnamos directamente el valor } $this->mihtml = preg_replace('#\{'.$clave.'\}#is', $$key, $this->mihtml); // Reemplazamos la "definición" en la plantilla por sus valores } } echo $this->mihtml; // mostramos el contenido } } }
Archivo foro/plantillas/peliculas.tpl[/n], una plantilla simple
Código HTML :
<div>Título: {titulo}</div> <div>Género: {genero}</div> <div>Género: {genero estilo=1}</div>
Archivo [b]"foro/funciones/genero.php", el archivo que contiene la función para tratar los posibles valores del campo genero.
Código PHP :
function genero( $losValores, $estilo= false) // La función a ejecutar { $html=$losValores; if (is_array( $losValores )) // Si hay multiples valores { $html=""; switch( $estilo ) // Utilizamos el estido idicado en la plantilla { case 1: // Estilo 1 foreach( $losValores as $valor) { $html.='<span class="menuitem">'.$valor.'</span>'; } break; default: // Estilo por defecto return implode(" / ",$losValores); } } return $html; }
Ahora según he puesto los comentarios me he dado cuenta que hay algunas cosillas que quizas se podrían eliminar.
Espero comentarios, críticas y sugerencias, y que a alguien le pueda servir
P.D.: la carpeta foro se llama así, porque en el plugin será donde accederá el BBCode para mostrar la plantilla en el foro. Vamos que podeis llamarla como querais o eliminarla.