2010-04-01 13 views
6

Quiero facilitar el desarrollo de mis nuevos proyectos, y quería una solución de motor de plantillas muy simple. Miré a mi alrededor en la red y todo está demasiado hinchado o me hace temblar.Clase de plantilla PHP con variables?

Mis archivos HTML serán así:

<html> 
    <head> 
     <title>{PAGE_TITLE}</title> 
    </head> 
    <body> 
     <h1>{PAGE_HEADER}</h1> 
     <p>Some random content that is likely not to be parsed with PHP.</p> 
    </body> 
</html> 

Obviamente, quiero reemplazar {PAGE_TITLE} y {PAGE_HEADER} con algo me puse con PHP. De esta manera:

<?php 

    $pageElements = array(
          '{PAGE_TITLE}' => 'Some random title.', 
          '{PAGE_HEADER}' => 'A page header!' 
         ); 

?> 

Y me gustaría usar algo así como str_replace y cargar el código HTML sustituido en una cadena, luego imprimirlo a la página? Esto es lo que estoy en camino de hacer en este momento ... ¿Alguien tiene algún consejo o una forma de hacerlo mejor?

Gracias.

+1

"me hace temblar" me hace pensar que simplemente no entienden ellos y no están realmente interesados ​​en hacer el esfuerzo. Realmente no hay necesidad de reinventar esta rueda en particular. Usa Smarty o Twig o algo similar. – cletus

+1

Quise decir la forma en que analizan los archivos HTML y reemplazan las variables, simplemente no me gusta. Smarty está demasiado hinchado para lo que quiero. – Joe

Respuesta

2

PHP en sí es el motor de una plantilla si quieres ser realmente simple. sólo tiene que utilizar include()

file.phtml:

<html> 
    <head> 
     <title><?=$tpl['PAGE_TITLE']?></title> 
    </head> 
    <body> 
     <h1><?=$tpl['PAGE_HEADER']?></h1> 
     <p>Some random content that is likely not to be parsed with PHP.</p> 
    </body> 
</html> 

code.php:

tpl = Array 
(
'PAGE_HEADER' => "This is the lazy way to do it", 
'PAGE_TITLE' => "I don't care because i am doing it this way anyways" 
) 
include("file.phtml") 
+0

Esto es básicamente cómo lo hago. No hay necesidad de complicar demasiado las cosas, ¿verdad? –

+0

Eso no funcionará, a menos que su html de file.phtml esté dentro de una variable y lo repita. Simplemente poner llaves en medio de un archivo html incluido no lo hará parseable por php. Quizás quisiste decir Pere

+1

@Pere, tienes toda la razón. Como código mirando viejas publicaciones SO es interesante. Solucionado eso. –

6

Su estrategia actual va a funcionar, y es bastante sencillo. str_replace() es eficiente y limpio, y simplemente puede recorrerlo para reemplazar las coincidencias de etiquetas exactas con su contenido variable. Sin embargo, el inconveniente es que primero tienes que cargar todas tus plantillas en cadenas, y eso puede ser bastante ineficiente.

Un método alternativo que es muy similar, es que simplemente puede usar extract(). El extracto tomará un conjunto de pares clave/valor y creará variables a partir de ellos en el ámbito local. Si tiene include() una plantilla en el mismo ámbito, sus variables estarán listas para funcionar.

Algo como esto:

function loadTemplate($template,$vars) 
{ 
    extract($vars); 
    include($template); 
} 

La plantilla podría ser sólo PHP regular.

<html> 
    <head> 
     <title><?php echo $PAGE_TITLE ?></title> 
    </head> 
    <body> 
     <h1><?php echo $PAGE_HEADER ?></h1> 
     <p>Some random content that is likely not to be parsed with PHP.</p> 
    </body> 
</html> 

(. Es evidente que se puede utilizar etiquetas cortas por menos verbosidad plantilla, aunque prefiero no por razones de compatibilidad)

Entonces todo lo que tiene que hacer es:

$pageElements = array(
         'PAGE_TITLE' => 'Some random title.', 
         'PAGE_HEADER' => 'A page header!' 
        ); 
loadTemplate('file.phtml',$pageElements); 
5

Usted podría estar interesado en mustache.php.Es una implementación de la clase PHP muy ligero de Mustache

Ejemplo rápido tomada del README:

<?php 
    include('Mustache.php'); 
    $m = new Mustache; 
    echo $m->render('Hello {{planet}}', array('planet' => 'World!')); 
    // "Hello World!" 
?> 

Y un ejemplo más en profundidad - esta es la plantilla bigote canónica:

Hello {{name}} 
You have just won ${{value}}! 
{{#in_ca}} 
Well, ${{taxed_value}}, after taxes. 
{{/in_ca}} 
0
function parseVars($vars, $file){ 

    $file = file_get_contents($file); 
    foreach($vars as $key => $val){ 
     str_replace("{".$key."}", $val, $file); 
    } 

    echo $file; 

} 
Cuestiones relacionadas