Comunidad de diseño web y desarrollo en internet online

Plantillas

Citar            
MensajeEscrito el 02 Abr 2013 03:26 pm
Hola, a todo, hace tiempo que no me pasaba por aquí, ya que no tenía nada que ofrecer y no tenia nada en mente.
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 :wink: ), 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 :D

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.

Por Chory

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Abr 2013 06:25 pm
Buen post amigo

Por DYREKEX

2 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Abr 2013 07:00 pm
Gracias, se hace lo que se puede

Por Chory

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Abr 2013 03:58 am
Interesante propuesta, aunque tengo tiempo que no uso esa clase. De hecho, publique una version mejorada, y hubo otra mejora más que nunca publique. Pero ninguna contaba con tu planteamiento, eran mejoras de rendimiento.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

chrome

 

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