Una template engine è uno prodotto che ti permette di scrivere una cosa del genere (esempio)
Codice PHP:
<loop $variabile>
{$variabile.valore}</p>
</loop>
Per eseguire un loop so tutti i valori di un array.
Esistono diversi "template engine" con diverse sintassi, e Smarty è appunto un "template engine"
Quello che voglio dire io è che non c'è alcuna differenza tra il codice da me appena scritto e il seguente
Codice PHP:
<?php foreach ($variabile as $valore) {?>
<?php echo $valore?></p>
<?php } ?>
Cambia la sintassi, ma non è assolutamente vero che nel primo caso ho "separato il codice dal contenuto html"; ho semplicemente inserito nell'html un codice con una sintassi diversa da quella php (ma sempre di codice si tratta), il che non fa altro che "rallentare" lo script. Senza contare che la maggior parte dei template engine ci costringe a mettere sempre in un array i valori quando vogliamo eseguire un ciclo, cosa che nel caso di un query ci fa fare due volte lo stesso ciclo: la prima volta un ciclo di fetch per prendere i valori della select e metterli nell'array (con grande sperpero di memoria), la seconda nel template engine per usare tali valori
In pratica avviene una cosa del genere
Codice PHP:
$sql = "SELECT x,y FROM tabella";
$result = mysql_query($sql);
$array = array();
while($row = mysql_fetch_assoc($result) // questo è il primo ciclo
$array[] = $row;
$template = new MioTemplate("template.tpl");
$template->show();
Immagina se la select producesse migliaia di righe che spreco di memoria
Con il file "template.tpl" che sarà qualcosa del genere (dipende dal template engine usato)
Codice PHP:
<loop $array> // secondo loop
{$array.elem.x} - {$array.elem.y}</p>
</loop>
Quando avremmo potuto, semplicemente usando solo php scrivere una cosa del genere
Codice PHP:
$sql = "SELECT x,y FROM tabella";
$result = mysql_query($sql);
$array = array();
while($row = mysql_fetch_assoc($result) // questo è il primo ciclo
echo "
".$row["x"]." - " . $row["y"] . "</p>";
Eseguendo un solo ciclo e risparmiando tutta la memoria, poichè il php avrebbe mantenuto solamente un record del query alla volta, demandando al motore sql il resto del lavoro di "contenimento dati"
Questi sono esempi molto semplici, ma rendono l'idea di quello di cui parlo.
Sta al programmatore cercare metodi per separare il codice dal contenuto
Ad esempio si potrebbe preparare un file "template.tpl" contenente SOLO questa parte
Codice PHP:
{x} - {y}</p>
E trasformare il nostro php in
Codice PHP:
$sql = "SELECT x,y FROM tabella";
$result = mysql_query($sql);
$array = array();
while($row = mysql_fetch_assoc($result) // questo è il primo ciclo
{
$html = implode("",file("template.tpl"));
foreach($row as $key=>$value)
{
$html = strreplace("{$key}",$value);
}
echo $html;
}
In pratica il template contiene "l'aspetto" di ogni singolo "blocco" che però può essere visualizzato uno o più volte, decisione che spetta al PHP e non al TEMPLATE
Da qui si arriva rapidamente a quel "template engine" MINIMALE che ti ha suggerito WISHER e che può essere un buon compromesso per usare "template" senza compromettere significativamente le prestazioni