Premessa
In questo articolo verrà trattato l'uso, o meglio, l'interazione di templates html
e PHP. Chiarisco preventivamente, come spiegherò più in dettaglio di seguito, che
non alludo alla semplice inclusione di un file html all'interno di una pagina PHP, ma di qualcosa di diverso e un po' più complesso.
Chiunque abbia visitato almeno una volta la home page ufficiale di PHP (http://www.php.net)
avrà senz'altro notato che, nella colonna sinistra del sito, è riportata quella che è legittimo
considerare a tutti gli effetti la definizione ufficiale del nostro amato linguaggio:
"PHP is a widely-used general-purpose scripting language that is especially suited for Web
development and can be embedded into HTML. (...)".
Soffermiamoci sull'ultimo periodo "...and can be embedded into HTML...", letteralmente "...e può
essere immerso nell'HTML...(PHP s'intende)".
Proprio questa frase chiarisce quella che è una
delle caratteristiche principali di PHP e che ha contribuito a farne la fortuna: il fatto cioè
di poter integrare, in una normale pagina html, il codice PHP e di far coesistere, all'interno
dello stesso file, codice HTML e codice PHP inserendo, ad esempio all'interno dei tags
<td></td> , le variabili risultanti dall'interrogazione ad un Database.
Perchè usare i template?
Ma cosa succederebbe se si decidesse di cambiare, magari stravolgendola, la parte html di una
pagina?
Poco male se si trattasse di una semplice pagina e, soprattutto, se le modifiche
venissero effettuate dallo stesso autore del codice. Ma se i cambiamenti coinvolgessero
un'intera sezione di un sito?
Pensiamo, ad esempio, a quei grossi portali in cui si presuppone che ci sia (e di norma c'è),
una rigida divisione dei ruoli tra i designers ed i "coders", ossia fra coloro che curano
l'aspetto grafico del sito e coloro che materialmente lo fanno funzionare. In un caso del
genere si verrebbe a creare una sorta di "conflitto di competenza" che non gioverebbe certo
alla causa comune.
Si pone quindi, con tutta evidenza, l'esigenza di una rigida separazione fra aspetto grafico
del sito e contenuti tecnici dello stesso, tanto più sentita quanto più grande è il progetto
su cui si lavora.
Si potrebbe replicare a questo punto, che sarebbe sufficiente, a questo fine, mettere i vari
"pezzi" del sito (i classici header, footer) in files esterni da includere
in ogni pagina ed il gioco sarebbe fatto !
Purtroppo non è così semplice; ripensiamo infatti per un attimo all'esempio dei risultati di
un'interrogazione al database: che fare in un caso del genere ?
Non è possibile includere semplicemente una parte "statica" per ottenere il risultato
desiderato. Appare evidente che è necessario che il template esterno sia, in qualche modo,
"dinamico", e che, nonostante la separazione fra html e codice PHP, le due parti possano
"interagire" in qualche maniera, cosa che non è possibile realizzare con una semplice
"inclusione statica".
La funzione Eval();
Il sistema per realizzare ciò che ci proponiamo prevede l'uso dei templates, che altro non
sono se non files contenenti codice .html.
Restano comunque documenti particolari e vedremo subito cosa ciò
significhi nel dettaglio. Tutto questo però non è sufficiente; occorre infatti "elaborare" queste pagine in un modo particolare per far sì che interagiscano con il nostro codice PHP. In questo articolo proporrò due sistemi che prevedono l'uso dei templates, ma è chiaro che non ho affatto la pretesa di esaurire l'argomento. Nelle mie intenzioni dovrebbero semplicemente fornire uno spunto per affrontare l'interazione di PHP con i templates html.
In entrambe le soluzioni si presuppone un'interrogazione ad un database (MySQL nello specifico) mirante ad estrarre dei dati da visualizzare poi nella pagina PHP. Il codice di esempio, in cui si presuppone di selezionare delle notizie dal DB, è il seguente:
<?
## STRINGA DI CONNESSIONE A MYSQL
$connessione = @mysql_connect("localhost", "username", "password")
or die("La connessione al Database è fallita !");
## SELEZIONE DEL DATABASE DA INTERROGARE
@mysql_select_db("Db_News") or die("Selezione del Database fallita !");
## QUERY DI SELEZIONE
$sql = "SELECT titolo_notizia, data_notizia, contenuto_notizia FROM Notizie LIMIT 0,3";
## ESECUZIONE DELLA QUERY
$query = @mysql_query($sql) or die("Esecuzione Query fallita !");
?>
Questo codice (comune ad entrambi i sistemi che verranno proposti) verrà messo in un file, chiamato mysql.php, da includere all'inizio di ciascuna pagina. In entrambi i metodi proposti, avremo una pagina .html (chiamata template.html) ed una .php (chiamata test.php). Ecco il primo sistema:
Pagina HTML
<table border="0">
<tr>
<td align="center">$titolo</td>
</tr>
<tr>
<td>$contenuto</td>
</tr>
<tr>
<td align="center">Notizia del $data</td>
</tr>
</table>
Pagina PHP
<?
## QUESTA FUNZIONE LEGGE E RESTITUISCE IL TEMPLATE HTML FACENDO L'ESCAPE DEGLI APICI DOPPI
function GetTemplate($template) {
return str_replace(""",""",implode("",file($template)));
}
## QUESTA FUNZIONE STAMPA A VIDEO IL TEMPLATE RISULTANTE DALLA FUNZIONE PRECEDENTE
function Stampa($template) {
echo $template;
}
## INCLUDIAMO IL FILE CONTENENTE IL CODICE PER L'INTERROGAZIONE A MYSQL
include("mysql.php");
## SCORRIAMO I RISULTATI DELL'INTERROGAZIONE E STAMPIAMO LE SINGOLE NOTIZIE
while($result = @mysql_fetch_array($query)) {
$titolo = $result["titolo_notizia"];
$contenuto = $result["contenuto_notizia"];
$data = $result["data_notizia"];
eval("Stampa("".GetTemplate("template.html")."");");
}
## CHIUDIAMO LA CONNESSIONE A MYSQL
@mysql_close($connessione);
?>
La prima cosa da rilevare è la presenza di variabili php all'interno della pagina html; proprio
questa è la "particolarità" dei templates cui si accennava sopra e che consente per l'appunto,
l'interazione tra i due linguaggi.
Funzionamento di Eval();
La chiave di tutto sta nella riga
eval("stampa("".gettemplate("template.html")."");");
È grazie a questa infatti che, magicamente, la pagina html diverrà dinamica.
All'interno del file php abbiamo definito due funzioni che non fanno altro che "leggere" il
contenuto del template (la funzione GetTemplate(), che provvede anche a fare l'escape degli
apici doppi che darebbero fastidio a php, anteponendogli un backslash) e stamparli a video,
(la funzione Stampa(), invero semplicissima).
Il resto del lavoro lo fa, come detto, la
funzione eval() che "elabora" il prodotto delle funzioni GetTemplate() e Stampa() restituendoci
il risultato desiderato.
Per chiarire meglio la cosa, avremmo potuto raggiungere lo stesso scopo con un codice di questo
tipo:
<?
while($result = @mysql_fetch_array($query)) {
$titolo = $result["titolo_notizia"];
$contenuto = $result["contenuto_notizia"];
$data = $result["data_notizia"];
echo "
<table border="0">
<tr>
<td align="center">$titolo</td>
</tr>
<tr>
<td>$contenuto</td>
</tr>
<tr>
<td align="center">Notizia del $data</td>
</tr>
</table>
";
}
?>
È evidente il vantaggio derivante dall'adozione del nostro sistema: una totale separazione
della parte html da quella php, il tutto a vantaggio, come è ovvio, della facilità di
formattazione dell'output, che era proprio ciò che ci si proponeva.
Fra l'altro, questo è il metodo usato da molti noti forum, due su tutti: Vbulletin e
Woltlab Burning Board.
Il secondo metodo: eregi_replace()
Ecco il secondo sistema:
Pagina HTML:
<table border="0">
<tr>
<td align="center"><!-- TITOLO --></td>
</tr>
<tr>
<td><!-- CONTENUTO --></td>
</tr>
<tr>
<td align="center">Notizia del <!-- DATA --></td>
</tr>
</table>
Pagina PHP:
<?
## INCLUDIAMO IL FILE CONTENENTE IL CODICE PER L'INTERROGAZIONE A MYSQL
include("mysql.php");
## LEGGIAMO IL CONTENUTO DEL TEMPLATE E LO MEMORIZZIAMO NELLA VARIABILE $file_content
$file_content = implode("",file("template.txt"));
## SCORRIAMO I RISULTATI DELL'INTERROGAZIONE E STAMPIAMO LE SINGOLE NOTIZIE
while($ris=mysql_fetch_array($res)) {
$output = eregi_replace("<!-- TITOLO -->", $ris["Titolo"], $file_content);
$output = eregi_replace("<!-- CONTENUTO -->", $ris["Contenuto"], $output);
$output = eregi_replace("<!-- DATA -->", date("d/m/Y", $ris["Data"]), $output);
echo $output;
}
## CHIUDIAMO LA CONNESSIONE A MYSQL
@mysql_close($connessione);
?>
A differenza del primo metodo proposto, questo potrebbe essere definito come "più puro", nel
senso che, all'interno del template, le variabili PHP hanno ceduto il posto a delle stringhe
aventi la sintassi dei commenti HTML, per cui, "aprendo" la pagina con un browser, non verranno visualizzati i segni di dollaro ($) che contraddistinguono le variabili PHP.
Riguardo al contenuto vero e proprio dello script: esso si limita a
leggere il contenuto del template, a memorizzarlo in una variabile ($file_content) e quindi,
all'interno del ciclo while con cui si scorrono i risultati dell'interrogazione al Database,
ad effettuare dei semplici replace, miranti a sostituire le nostre stringhe (tre nel nostro
esempio) con il contenuto dei vari campi del DB.