Foros del Web » Programando para Internet » PHP »

[Aporte] Mini sistema de plantillas

Estas en el tema de [Aporte] Mini sistema de plantillas en el foro de PHP en Foros del Web. Esta es una clase para usar plantillas en sitios pequeños, espero sea útil template.class.php @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código php: Ver original <?php /* **************************************** template.class.php: Clase ...
  #1 (permalink)  
Antiguo 06/03/2009, 19:10
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
[Aporte] Mini sistema de plantillas

Esta es una clase para usar plantillas en sitios pequeños, espero sea útil

template.class.php
Código php:
Ver original
  1. <?php
  2. /* ****************************************
  3. template.class.php: Clase para crear plantillas de sitios pequeños que permite cambiar el diseño
  4.     de todo el sitio modificando sólo archivos de plantilla (.tpl) y estilos (.css)
  5. Autor: Ricardo Garza (Triby) [url]http://www.forosdelweb.com/miembros/triby/[/url]
  6. Licencia: Puedes usar y modificar este script para sitios personales o comerciales
  7.     Para distribuirlo sólo conserva estos créditos
  8. Requerimientos:
  9.     PHP 4 o posterior
  10. Declarar:
  11.     CONSTANTE   - Sólo para evitar accesos directos al script
  12. **************************************** */
  13.  
  14. if(!defined('CONSTANTE')) {
  15.     header('HTTP/1.0 403 Forbidden');
  16.     die('No tienes permisos para ver el contenido del directorio o abrir este archivo.');
  17. }
  18.  
  19. // Uso: $html = new TplParser('archivo.tpl', 'directorio/plantilla/', 'directorio/auxiliar/');
  20. // Las etiquetas serán leídas desde el archivo .tpl e inicializadas como cadena vacía ('')
  21.  
  22. class TplParser {
  23.     var $header = '';
  24.     var $body = '';
  25.     var $footer = '';
  26.     var $tags = array();    // Aquí guardamos todas las etiquetas encontradas
  27.     var $started = false;
  28.     var $tpldir = '';
  29.     var $tplaux = '';
  30.  
  31.     // Constructor
  32.     function TplParser($tplFile = 'main.tpl', $dirtpl = '', $diraux = '') {
  33.         // Cargamos el archivo $tplFile y buscamos todos los elementos necesarios para crear encabezado y pie
  34.         $this->tpldir = $dirtpl;    // Ruta relativa al directorio donde se almacenan los archivos de la plantilla, ejemplo: "plantillas/mi-estilo/"
  35.         $this->tplaux = $diraux;    // Ruta relativa para encontrar archivos a incluir, ejemplo: "auxiliar/"
  36.         $thefile = "$dirtpl$tplFile";
  37.         if(!file_exists($thefile))
  38.             die('El archivo de plantilla no existe.');
  39.         $code = file_get_contents($thefile);
  40.         // Buscamos todas las etiquetas dentro del archivo
  41.         preg_match_all('#\{(.*?)\}#', $code, $varrefs);
  42.         foreach($varrefs[1] as $tagname) {
  43.             // Omitimos etiquetas que pueden corresponder a estilos CSS o códigos que no debemos reemplazar
  44.             if(strpos($tagname, '#') || strpos($tagname, "\\") || strpos($tagname, ':') || strpos($tagname, ':') || strpos($tagname, "\n") || strpos($tagname, ' ') == 1)
  45.                 continue;
  46.             $this->tags[$tagname] = '';
  47.         }
  48.         if(!isset($this->tags['mainbody']))
  49.             die('No existe la etiqueta "mainbody" para crear contenido en el archivo de plantilla.');
  50.         $maintag = false;
  51.         $output = explode("\n", $code);
  52.         // Creamos header y footer en base a la ubicación de {mainbody}
  53.         foreach($output as $cline) {
  54.             $cline .= "\n";
  55.             if(!$maintag)
  56.                 if(trim($cline) == '{mainbody}')
  57.                     $maintag = true;
  58.                 else
  59.                     $this->header .= $cline;
  60.             else
  61.                 $this->footer .= $cline;
  62.         }
  63.     }
  64.  
  65.     // Asignamos valores a las etiquetas
  66.     function assignVars($tags = array()) {
  67.         foreach($tags as $tk => $tv)
  68.             $this->tags[$tk] = $tv;
  69.     }
  70.  
  71.     // Interpretamos header y footer, ejecutalo solo hasta que vayas a presentar contenidos
  72.     function parseAll() {
  73.         // Juntamos todo para no tener que realizar dos veces el reemplazo
  74.         $splithere = '<!-- separar contenidos -->';
  75.         $allcode = $this->header . $splithere . $this->footer;
  76.         $allcode = $this->parseTags($allcode, $this->tags);
  77.         list($this->header, $this->footer) = explode($splithere, $allcode);
  78.     }
  79.  
  80.     // Interpretar el codigo, reemplazando las etiquetas con sus respectivos valores $tags['etiqueta'] = 'valor'
  81.     function parseTags($code, $tags) {
  82.         $auxdir = $this->tplaux;
  83.         if($code == '')
  84.             return '';
  85.  
  86.         if(count($tags) > 0) {
  87.             $search = array();
  88.             $replace = array();
  89.             $remove = array();
  90.             foreach($tags as $tag => $data) {
  91.                 if(strpos($tag, '#') || strpos($tag, "\\") || strpos($tag, ':') || strpos($tag, ':') || strpos($tag, "\n") || strpos($tag, ' ') == 1)
  92.                     continue;
  93.                 $data = ($data != '' && file_exists("$auxdir$data") && !is_dir("$auxdir$data")) ? $this->parseFile("$auxdir$data") : $data;
  94.                 $search[] = '#\{'.$tag.'\}#';
  95.                 $replace[] = $data;
  96.             }
  97.             $code = preg_replace($search, $replace, $code);
  98.         }
  99.         return $code;
  100.     }
  101.  
  102.     // Cargar un archivo (.txt, .htm, .css, .js, .php, .tpl) y devolver el contenido como cadena
  103.     function parseFile($file) {
  104.         $allowed = array('txt', 'htm', 'css', 'js', 'php', 'tpl');
  105.         $fileExt = end(explode('.', $file));
  106.         if(!in_array($fileExt, $allowed))
  107.             return '';
  108.         ob_start();
  109.         include($file);
  110.         $content=ob_get_contents();
  111.         ob_end_clean();
  112.         return $content;
  113.     }
  114.  
  115.     // Devolver el encabezado
  116.     function header() {
  117.         $this->started = true;
  118.         return $this->header;
  119.     }
  120.  
  121.     // Devolver el pie de página
  122.     function footer() {
  123.         return $this->footer;
  124.     }
  125. }

Ejemplo de main.tpl
Código html:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
  3.     <title>{titulo}</title>
  4.     <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  5.     <meta name="keywords" content="{meta_keys}" />
  6.     <meta name="description" content="{meta_descrip}" />
  7. {meta}
  8.     <meta name="distribution" content="global"/>
  9.     <meta name="robots" content="index,follow"/>
  10.     <link rel="stylesheet" href="{tpl_url}estilos.css" type="text/css" charset="iso-8859-1" />
  11. {script}
  12. </head>
  13. <div id="header">
  14. {titulo_ventana}
  15. </div>
  16.  
  17. <div id="menu"><ul>
  18. {menu}
  19. </ul></div>
  20.  
  21. <div id="contenido">
  22. {subtitulo}
  23. {login.php}
  24. {mainbody}
  25. {no_asignada}
  26.     <div class="regreso">
  27. {regreso}
  28.     </div>
  29. </div>
  30.  
  31. </body>
  32. </head>

Ejemplo de uso:
Código php:
Ver original
  1. <?php
  2. define('CONSTANTE', 1); // Sólo para evitar acceso directo a otros scripts
  3. include 'template.class.php';
  4.  
  5. $html = new TplParser('plantilla.tpl', 'plantilla/mi-estilo/', 'include/');
  6. $etiquetas = array(
  7.     'titulo' => 'Título de la ventana del navegador',
  8.     'meta_keys' => 'Palabras,clave,del,sitio,o,la,página',
  9.     'meta_descrip' => 'Descripción del sitio o la página',
  10.     'tpl_url' => 'plantilla/mi-estilo/', // Ruta relativa a URL del directorio de plantilla actual
  11.     'script' => '<script type="text/javascript" src="mi-javascript.js"></script>"',
  12.     'titulo_ventana' => '<h1>Es el título principal de la página.</h1>',
  13.     'menu' => crear_menu(),
  14.     'regreso' => links_regreso()
  15.     // login.php sera buscado en el directorio include y se agregara el contenido automaticamente a la etiqueta
  16. );
  17. // Asignamos los valores creados
  18. $html->assignVars($etiquetas);
  19.  
  20. // Modificamos otras etiquetas
  21. $html->tags['subtitulo'] = '<h2>Este es el subtítulo</h2>';
  22.  
  23. // Todas las etiquetas que no tengan valor serán removidas de la salida HTML
  24. // En este ejemplo {no_asignada} no tiene valor y no aparecerá
  25.  
  26. // Reemplazamos todas las etiquetas
  27. $html->parseAll();
  28.  
  29. // Desplegamos el encabezado
  30. echo $html->header();
  31.  
  32. // Aquí creamos el contenido de la página, ya sea con html directo,
  33. // funciones php, o incluyendo otros archivos
  34.  
  35. // Finalmente desplegamos el pie de página
  36. echo $html>footer();
  37.  
  38. function crear_menu() {
  39.     $cm = '<ul><li><a href="index.php">Página principal</a></li>';
  40.     $cm .= '<li><a href="otra_pagina.php">Otra página</a></li>';
  41.     $cm .= '<li><a href="otra_pagina.php">Otra página</a></li></ul>';
  42.     return $cm;
  43. }
  44.  
  45. function links_regreso() {
  46.     return 'Regresar a: <a href="index.php">Página principal</a>';
  47. }

Ejemplo de login.php
Código php:
Ver original
  1. <?php
  2. if(isset($_SESSION['usuario']))
  3.     echo "Bienvenido <strong>{$_SESSION['usuario']}</strong>.";
  4. else
  5.     echo 'Por favor ingresa o regístrate.';
__________________
- León, Guanajuato
- GV-Foto
  #2 (permalink)  
Antiguo 07/03/2009, 03:45
Avatar de eddwinpaz  
Fecha de Ingreso: noviembre-2007
Ubicación: Merida , Venezuela
Mensajes: 1.066
Antigüedad: 16 años, 5 meses
Puntos: 25
Respuesta: [Aporte] Mini sistema de plantillas

pudieras generar un .zip :D seria exelente se te agradeceria.
__________________
O nos hacemos miserables o nos hacemos fuertes , la cantidad de trabajo es la misma.
  #3 (permalink)  
Antiguo 07/06/2009, 19:17
Avatar de acoevil  
Fecha de Ingreso: julio-2008
Ubicación: localhost/colombia/sevillaValle.php
Mensajes: 1.123
Antigüedad: 15 años, 8 meses
Puntos: 32
Respuesta: [Aporte] Mini sistema de plantillas

Alguien me podria explicar porque siempre toca darle return a lo que se quiere que cambie en el template.tpl es decir miren esta function


function crear_menu() {

$cm = '<ul><li><a href="index.php">Página principal</a></li>';

$cm .= '<li><a href="otra_pagina.php">Otra página</a></li>';

$cm .= '<li><a href="otra_pagina.php">Otra página</a></li></ul>';

return $cm;

}

Siempre return y de hecho si solo se coloca echo no funciona bien alguien me explica?' yo tambien cree un sistema mas o menos como este y me toca igual y no entiendo que pasa

http://www.forosdelweb.com/f18/aport...l-usar-703876/


Gracias
  #4 (permalink)  
Antiguo 07/06/2009, 19:27
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: [Aporte] Mini sistema de plantillas

acoevil, return basicamente se usa para devolver algún resultado, en lugar de imprimirlo...

es una cualidad básica de las funciones...

imagina que solo necesitas sumar dos numeros, sin imprimirlos....
Código PHP:
function suma($a$b)
{
  return 
$a $b;

¿¿que caso tendría que todas las funciones imprimieran en lugar de devolver algún valor??

analizalo un poco, y si tienes dudas consulta el manual de PHP al respecto, suerte!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 09/06/2009, 06:09
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: [Aporte] Mini sistema de plantillas

Lo que haces con la funcion crear_menu() es generar el codigo con el que va a reemplazarse la "pseudo-etiqueta" en la plantilla, no puedes hacerlo con echo porque no se genera salida html hasta que envias el encabezado.

Hay otros sistemas de plantillas que permiten usar codigo php en vez de pseudo-etiquetas, donde si se usa echo en las funciones.
__________________
- León, Guanajuato
- GV-Foto
  #6 (permalink)  
Antiguo 09/06/2009, 06:35
Avatar de chulifo  
Fecha de Ingreso: abril-2009
Ubicación: perdido en codigos del PHP, pero aprendo rapido!
Mensajes: 524
Antigüedad: 15 años
Puntos: 18
Respuesta: [Aporte] Mini sistema de plantillas

disculpe mi innoransia pero para que sirven este tipo de plantillas??
  #7 (permalink)  
Antiguo 09/06/2009, 06:58
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: [Aporte] Mini sistema de plantillas

Para modificar todo el diseño del sitio editando solamente unos cuantos archivos, basicamente, los de plantilla (.tpl), los de estilos (.css) e imagenes. Inlcuso, puedes darle la oportunidad a los usuarios de seleccionar la plantilla (o tema) con la que desean navegar en tu sitio.
__________________
- León, Guanajuato
- GV-Foto
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 13:27.