Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/03/2009, 19:10
Avatar de Triby
Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 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