Contenido

¿Como usar SpynTPL?

22 Jun

+ 23

SpynTPL es una clase que hice hace mucho tiempo, la idea era la de tener un sistema de templates para PHP que cubriera mis necesidades sin tener que recurrir a Smarty u otras que ocupan demasiado espacio con demasiadas funcionalidades que nunca utilizaré.

La idea del motor de plantillas es simple, separa el código del diseño. De tal forma que conseguimos reducir el coste de mantenimiento de nuestras aplicaciones, podremos modificar el aspecto sin tener que tocar el código y cambiar el código sin tener que tocar el diseño. Además dispone de un sistema rústico de cache con el que conseguimos que el rendimiento de la web mejore considerablemente.

Podeis descargar la clase aqui

Manual de uso 

La forma de uso es más bien simple, únicamente tenemos que conocer como decirle que fichero HTML (o como queramos) ha de coger para aplicar el estilo y respetando las variables no tenemos que tener ningún problema.

Empecemos

Primero tenemos que definir una serie de variables desde nuestro fichero .php.

fichero.php 

//Importamos el fichero de la clase en nuestro fichero.

include('class-tpl.php');

//Generamos un nuevo objeto donde se realizará la conversión.
$html = new SpynTPL($directorio_templates); //$directorio_templates es el lugar donde se encuentran las plantillas.
//Ahora llamamos al fichero que necesitamos para esta página.
$html->Fichero("fichero.html");
//Y ahora la mágia, de esta forma podemos Asignar un valor a una variable.
$html->Asigna("VARIABLE", $valor); //$valor es el valor que se reemplazará por la variable
//Con esta llamada mostraremos el resultado de la fusión del HTML con las variables definidas.
echo $html->Muestra();

Y en nuestro fichero .html tenemos que definir el aspecto que queremos que tenga nuestra aplicación.

fichero.html

<head>
<title>[VARIABLE]</title> <!-- En este punto [VARIABLE] pasará a valer $valor -->
</head>

Como podeis ver no es muy complicado.Simplemente tenemos que respetar que las variables explorarán en el lugar donde se encuentre [NOMBRE_VARIABLE] de esa forma conseguiremos que el valor se cambie.

Usando Bloques

En algunos casos quizas necesitaremos el uso de bloques que se repitan X veces, y el uso de una simple variable no cubre nuestra necesidad. Por ese motivo implementé un AsignaBloque al que le pasaremos un array y el se encargará de explotar las variables que hayamos definido dentro. Un ejemplo dejará más claro esto.

ejemplo.php 

while($row = mysql_fetch_assoc($rs)) 
    { 
        $row["fontcolor"] = $fontcolor; 
        $row["color"] = $color; 
        $row["nombre"] = $nombre; 
        $row["apellido"] = $apellido; 
        $html->AsignaBloque('temas',$row); 
    } 
  
  

Como podeis ver insertamos un array y definimos las claves con nombres y cada una de ellas se reemplazará por el valor que le hayamos declarado dentro del array. 

ejemplo.html

 
 [block: temas]
 <div style="background-color:[color]; color:[fontcolor]">
         <p> <strong>[nombre] </p>
         <p>[apellidos] </p>
   </div>
[/block: temas]
 

Definimos los bloques con la siguiente [block: nombre] [/block:nombre] y dentro exactamente igual que si de variables simples se tratara, de esta forma el contenido se repetirá a lo largo del while insertando el HTML con los valores ya reemplazados N veces.

Espero haber dejado más o menos claro es uso de la clase, si tengo tiempo esta noche subiré un ejemplo completo y funcional.

  • Tiene buena pinta esta clse que has montado. Yo para proyectos grandes uso Smarty, que es verdad que tiene cosas que nunca uso, pero hay que reconocer que está muy bien.

    Para cosas pequeñas he descubierto Template Lite, que es una versión muy reducida del Smarty (antes se llamaba Smarty-light, pero les obligaron a cambiar el nombre), pruébalo a ver si te gusta.

  • Buenas Iñaki, la conocía aunque no la llegué a utilizar, usaba otras que no recuerdo el nombre que eran muy simples pero más limitadas.

    Pero es que era demasiado tantas opciones, aunque de Smarty creo que escribiré un post un día de estos 😀

  • Bastante eficaz tu sistema, en general tu página es una guía de referencía de tecnología para la web, me gustaría usar tu sistema con algunos cambios, que en general son solo quitar las funciones de cache, y cambiarle el nombre a la clase de SpynTPL a templates, esto por motivos de escribir más rápido el código, pero obviamente no borrare la parte que indica que es de tu autoría y añadire una de que la modifique, si no tienes problemas con esto te pido me lo hagas saber o me contactes vía messenger.

  • #3 No hay ningún tipo de problema, pero parece genial. Lo que si te pido es que cuando tengas algo listo que lo use, me lo hagas saber que me encantará echarle un vistazo a lo que se ha podido hacer con ella.

    Un saludo

  • Síp, gracias, de momento, ya hay algo montado que sí bien es muy sencillo es un exelente inicio, llevo dos días en el proyecto, lo colgare en mi web en un rato, si quiere descargarlo, por cierto es un Framework MVC en PHP

  • Ya esta listo, puedes entrar a mi blog y descargarlo!, se agradecen comentario bueno y malos

  • Una pregunta y si uqieor usarlo como un template gneeral en una web modular como le haría si tiene php (include) dentro?

  • Renzo, no entiendo exactamente que necesitas.

  • Es decir, lo siguiente:
    1. Estoy haciendo una web modular y como en toda web modular siempre la parte del medio varia index.php?x=nombreseccion.
    2. Como la mayoria de sistema de plantillas no permite eso, preguntaba si con el tuyo si se podia.
    Gracias! por responder

  • Buenas Renzo, creo que he entendido lo que quieres.

    1. Si que se puede, osea tu simplemente tendrías que cargar el método del objeto con el valor del template correspondiente a la sección.

    
    //Generamos un nuevo objeto donde se realizará la conversión.
    $html = new SpynTPL($directorio_templates); //$directorio_templates es el lugar donde se encuentran las plantillas.
    
    //Ahora llamamos al fichero que necesitamos para esta página.
    if ($_GET['seccion'] == 'inicio') {
        $html->Fichero("fichero.html");
         .....
         $html->Asigna("VARIABLE", $valor); //Variables que queramos mostrar para esta sección
         ....
    }else if ($_GET['seccion'] == 'una_seccion') { 
        $html->Fichero("fichero2.html");
         .....
         $html->Asigna("VARIABLE", $valor); //Variables que queramos mostrar para esta sección
         ....
    }else if ($_GET['seccion'] == 'otra_seccion') { 
        $html->Fichero("fichero3.html");
         .....
         $html->Asigna("VARIABLE", $valor); //Variables que queramos mostrar para esta sección
         ....
    } else {
        $html->Fichero("default.html");
         .....
         $html->Asigna("VARIABLE", $valor); //Variables que queramos mostrar para esta sección
         ....
    }
    
    //Con esta llamada mostraremos el resultado de la fusión del HTML con las variables definidas.
    echo $html->Muestra();
    

    2. Me extraña que no hayas podido, con Smarty, TBS y otras que probé si que se podía, de esta forma.

    Si quieres que lo miremos más detenidamente dime cosas y encantado le echamos un vistazo.

    Un saludo

  • Es que yo me baso en el metodo general:

    [code]

    [/code]

  • Hola, estoy usando Smarty como lo puedo usar de forma modular como tu dices que se puede usar?

  • un ejemplo mas claro tengo las carpetas interfaz_grafica donde esta header.html, footer.html y menu.html y la case autenticar donde esta autenticar.php y autenticar.html.

    Se supone que cuando desde el menu le digo que vaya a autenticar (), se va para un switch case en autenticar.php que maneja la variable accion, y este manejo me debe de sacar en el explorador lo que esta en autenticar.html y tambien el encabezado, el pie y el menu:

    En orden sería header.html, menu.html, autenticar.html y footer.html.

    pero como todo lo estoy haciendo desde la carpeta autenticar todas las variables de los enlaces se cambia, por ejemplo una imagen que esta en la carpeta interfaz_grafica/images aparece con esta direccion http://localhost/soluciones/autenticar/interfaz_grafica/images/banner.jpg y debería ser http://localhost/soluciones/interfaz_grafica/images/banner.jpg.

    Lo mismo pasa con Smarty! entonces todo se cambia y ya no podría usarla, se que la solución que que no lo maneje con carpetas sino que meta todo en una sola carpeta, pero mi dificultad es que trabajo con otras personas en otros paises y esa es la manera mas conveniente para actualizar paginas modulares, llegar y copiar un fichero en vez de copiar los archivos en una carpeta donde todo el mundo mete ficheros.

    Agradecería una ayudita.

  • Tengo un problemita, como hago para asignar un html como variable?. Lo que estoy haciendo es lo siguiente:

    include(‘class-tpl.php’);

    $directorio_templates = «plantillas/»;
    $cuerpo_gral = new SpynTPL($directorio_templates);
    $cuerpo_gral->Fichero(«cuerpo_gral.tpl»);

    $menu = new SpynTPL($directorio_templates);
    $menu->Fichero(«menu.html»);
    $cuerpo_gral->Asigna(«MENU», $menu->Muestra());

    $cuerpo = new SpynTPL($directorio_templates);
    $cuerpo->Fichero(«index.html»);
    $cuerpo_gral->Asigna(«CUERPO», $cuerpo->Muestra());

    echo $cuerpo_gral->Muestra();

    pero solo me muestra $cuerpo_gral y no las variables asignadas(MENU Y CUERPO). En el localhost anda de diez, pero cuando lo subo solo se ve eso (ver http://www.reproisa.com/rejunte)

  • No se porque pero solucione con la asignacion de bloques y no con la asignacion de variables. Lo que hice fue el sig codigo:

    include(‘class-tpl.php’);
    //include(‘conectar.php’);

    $directorio_templates = «plantillas/»;
    $cuerpo_gral = new SpynTPL($directorio_templates);
    $cuerpo_gral->Fichero(«cuerpo_gral.tpl»);

    $menu = new SpynTPL($directorio_templates);
    $menu->Fichero(«menu.html»);
    //$cuerpo_gral->Asigna(«MENU», $menu->Muestra());

    $cuerpo = new SpynTPL($directorio_templates);
    $cuerpo->Fichero(«index.html»);
    //$cuerpo_gral->Asigna(«CUERPO», $cuerpo->Muestra());

    $row[«CUERPO»] = $cuerpo->Muestra();
    $row[«MENU»] = $menu->Muestra();
    $cuerpo_gral->AsignaBloque(‘temas’,$row);

    echo $cuerpo_gral->Muestra();

    disculpen las molestias. muy buen trabajo.

  • Buenas,
    Queria pedirle que publicara como se configura exactamente la caché de su script, las 2 primeras variables para configurarlas son logicas, pero y la del nombre del archivo?
    Tambien queria preguntarle si se podria incluir a la clase una funcion que realice el trabajo similar a la de {include file} de Smarty, pues es lo unico que me haria falta ya para incluir un footer en todas mis paginas.
    Gracias y saludos.

  • mi duda es basica asumo que mi falta de conocimiento hace q no pueda hacer funcionar el motor de plantillas como deseo. Necesito montar en un archivo.php varias partes y en cada parte reemplazar algunas variables por ej:

    header.tpl => q se reemplaze el titulo de la pagina
    menu.tpl => q se reemplazen algunas variables -nombre de los links – (el menu funciona en diferentes idiomas)
    footer.tpl => q tambien aca reemplaze los links.

    basicamente en archivo.php quiero hacer un include de cada uno de estos tpl y reemplazar las variables correspondientes pero sin exito si lo hago de a uno es decir «SOLO REEMPLAZO LAS VARIABLES EN UN SOLO ARCHIVO» funciona en cada uno de estos pero en simultaneo se torna imposible.

    Podrian comentarme algunas variantes para probar yo por el momento estoy probando la variante de javier pero sin exito alguno y sinceramente no entiendo lo q hizo mi conocimiento no llega a tanto.

    Gracias y por lo q pude probar el motor realmente es un muy buen trabajo =D

  • Interesante artículo Andrés.
    Me ha sorprendido ver el uso de if / elseif en vez de un buen switch en la respuesta a renzo.

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.