2010-04-01 18 views
6

Voglio rendere più facile lo sviluppo sui miei nuovi progetti, e volevo una soluzione per template engine molto semplice. Mi sono guardato attorno e tutto è troppo gonfio o mi fa rabbrividire.Classe template PHP con variabili?

miei file HTML sarà in questo modo:

<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> 

Ovviamente, voglio sostituire {PAGE_TITLE} e {PAGE_HEADER} con qualcosa ho impostato con PHP. Come questo:

<?php 

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

?> 

E mi piacerebbe usare qualcosa come str_replace e caricare il codice HTML sostituito in una stringa, quindi stamparlo alla pagina? Questo è quello che sto facendo sul momento di fare ... qualcuno ha qualche consiglio o un modo per farlo meglio?

Grazie.

+1

"mi fa rabbrividire" mi fa pensare che si semplicemente non li capire e non sono realmente interessati a fare lo sforzo. Davvero non è necessario reinventare questa ruota particolare. Usa Smarty o Twig o qualcosa di simile. – cletus

+1

Intendo il modo in cui analizzano i file HTML e sostituiscono le variabili, semplicemente non mi piace. Smarty è troppo disperata per quello che voglio. – Joe

risposta

2

PHP è di per sé un motore di template se vuoi essere davvero semplice. basta usare 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

Questo è fondamentalmente come lo faccio. Non c'è bisogno di complicare eccessivamente le cose, giusto? –

+0

Questo non funzionerà, a meno che il file html di file.phtml non si trovi all'interno di una variabile e tu lo faccia eco. Il semplice inserimento di parentesi graffe nel mezzo di un file html incluso non lo renderà analizzabile da php. Forse intendevi Pere

+1

@Pere, hai assolutamente ragione. Come il codice che guarda i vecchi post SO è interessante. Risolto il problema. –

6

Il tuo attuale strategia funziona, ed è abbastanza semplice. str_replace() è efficiente e pulito e puoi semplicemente eseguirne il ciclo per sostituire le corrispondenze esatte dei tag con il tuo contenuto variabile. Tuttavia, lo svantaggio è che devi prima caricare tutti i tuoi modelli in stringhe e questo può essere piuttosto inefficiente.

Un metodo alternativo molto simile, è possibile utilizzare semplicemente extract(). L'estrazione richiede un insieme di coppie chiave/valore e crea variabili al di fuori di esse nell'ambito locale. Se hai un valore di include() un modello nello stesso ambito, le tue variabili saranno pronte per essere utilizzate.

Qualcosa di simile a questo:

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

Il modello potrebbe essere solo regolare PHP.

<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> 

(. Ovviamente è possibile utilizzare i tag brevi per meno template prolissità, anche se preferisco non per motivi di compatibilità)

Poi tutto quello che dovete fare è:

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

Potrebbero essere interessato a mustache.php.Si tratta di un'implementazione della classe PHP davvero leggero di Mustache

esempio Breve tratto dal README:

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

E un altro esempio in profondità - questo è il modello Baffi canonica:

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; 

} 
Problemi correlati