Programer via un moteur de template.
Je passerai l'explication du comment qu'on fait, tout simplement parceque je ne ferai pas mieux que ce tutoriel.
ça fait changer l'approche de la programmation PHP puis celle de débogage. A titre perso, je suis sur deux projets de sites web, actuellement. Dont un est la bascule de tinai (VB) (sorte d'ERP, GED) en vrai intranet, extranetisable.
Comment je m'y prenais avant et comment je fais avec les templates?
Généralement, on découpe son site en plusieurs éléments qu'on appelle avec des include (ça, ça ne change pas).Lorsqu'on code on a une idée de ce qu'on va y mettre, et on le fait apparaître sur la page au fur et à mesure du code en PHP pur par des echo'<code html>';. Et comme l'ordre des echo définit l'ordre d'apparition du code html. Le script php se lit dans le même sens que la page web. (vous m'avez compris.) ça peut être gênant d'ailleurs lorsque l'on doit remettre à plusieurs endroits des portions de code identiques à plusieurs endroits. dans la page: dans le cas du résultat d'une requête mysql remplissant des listes déroulantes de choix par exemple. En ce cas là soit on est prévoyant, on met tout dans une variable pour le réutiliser, soit on a gardé la variable $result soit on refait la requette mysql. Pas super optimisé dans tous les cas (et au fond, les templates, ce n'est pas beaucoup mieux, mais ça ne se voit pas).
Exemple de code: un annuaire tout bête:
Juste un petit moteur de recherche dans une base de données en fait.
Sans template:
Cet exemple attaque la base de données qui est mise à jour par un script qui attaque notre autocommutateur.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="fr" xml:lang="fr"> <head> <meta http-equiv="Content-type" content="text/html;charset=ISO_8859-1" /> <meta name="keywords" content="" /> <meta name="description" content="Annuaire" /> <meta name="author" content="Gnieark http://blog-du-grouik.tinad.fr" /> <title> Annuaires téléphone et mail</title> </head> <body> <div id="all"> <div id="telephone" style="position: absolute; width 50%; left: 0px; top: 0px;"> <?php if ($_POST[nomtel]<>''){ if (!mysql_connect('localhost', 'Usermysql', 'Password)) { echo 'Impossible de se connecter à MySQL'; exit; } mysql_query("USE database"); $sql = "SELECT Noannuaire, Nomannuaire, Prenomannuaire FROM annuairePABX WHERE Nomannuaire LIKE '".$_POST['nomtel']."%' OR Prenomannuaire LIKE '".$_POST['nomtel']."%' ORDER BY Noannuaire ASC"; $result = mysql_query($sql); if (!$result) { echo "Erreur DB, impossible de lister les tables\n"; echo 'Erreur MySQL : ' . mysql_error(); exit; } while ($row = mysql_fetch_row($result)) { echo "{$row[0]} {$row[1]} {$row[2]} |\n"; } } ?> <h3>Numéros de téléphone:</h3> <form method="post" action="annuaireinterne.php"> <p>Début du nom:<input type="text" name="nomtel"/> <input type="submit" value="Valider" /></p> </form> </div><!-- Fin div telephone --> <div id="mails" style="position: absolute; width 50%; left: 50%; top: 0px;"> <?php if ($_POST[nommail]<>''){ if (!mysql_connect('localhost', 'rpasserieu', 'a239373')) { echo 'Impossible de se connecter à MySQL'; exit; } mysql_query("USE postfix"); $sql = "SELECT username, name FROM mailbox WHERE name LIKE '%".$_POST[nommail]."%' ORDER BY name ASC"; $result = mysql_query($sql); if (!$result) { echo "Erreur DB, impossible de lister les tables\n"; echo 'Erreur MySQL : ' . mysql_error(); exit; } while ($row = mysql_fetch_row($result)) { echo "<a href=\"mailto:".$row[0]."\">".$row[0]."</a> : ".$row[1]."<br />\n"; } } ?> <h3>E-mail:</h3> <form method="post" action="annuaireinterne.php"> <p>Partie du nom:<input type="text" name="nommail"/> <input type="submit" value="Valider" /></p> </form> </div><!-- Fin div mails --> </div><!-- Fin div all --> </body> </html>
Avec template:
Là cet exemple se base sur une base de donées users plus classique. Il y a donc deux fichiers: le template et le script php. Le template:
<div id="main"> <div id="telephone" style="position: absolute; width 50%; left: 0px; top: 0px; background: #F7F7F7;"> <h3>Numéros de téléphone:</h3> <form method="post" action="{acturltel}"> <p>Début du nom:<input type="text" name="nomtel" value="{nomtel}"/> <input type="submit" value="Valider" /></p> </form> <table> <!-- BEGIN tel --> <tr><td>{tel.nom}</td><td>{tel.numero}</td></tr> <!-- END tel --> </table> </div><!-- Fin div telephone --> <div id="mails" style="position: absolute; width 50%; left: 50%; top: 0px; background: #F7F7F7;"> <h3>E-mail:</h3> <form method="post" action="{acturlmail}"> <p>Partie du nom:<input type="text" name="nommail" value="{nommail}"/> <input type="submit" value="Valider" /></p> </form> <table> <!-- BEGIN mail --> <tr><td>{mail.nom}</td><td><a href="mailto:{mail.mail}">{mail.mail}</a></td></tr> <!-- END mail --> </table> </div><!-- fin div mails --> </div>
Le script php:
<?php @session_start(); if($_SESSION['is_registered']!="1") { echo "You need be logged in"; die; } require_once('./config.php'); //sql if (!mysql_connect($config['mysql_host'], $config['mysql_user'], $config['mysql_password'])) { echo 'Impossible de se connecter à MySQL'; exit; } mysql_query("USE ".$config['mysql_database']); $template = new Template('./annuaire/template/'); $template->set_filenames(array( 'annuaire' => 'annuaire.tpl' )); $template->assign_vars( array( 'acturltel' => './index.php?menu=annuaire', 'acturlmail' => './index.php?menu=annuaire' )); //afficher les mails if (isset($_POST['nommail'])) { $cdt=" AND username LIKE '%".$_POST['nommail']."%'"; } else { $cdt =""; } $result=mysql_query("SELECT username, mail FROM users WHERE mail IS NOT NULL AND mail <> ''".$cdt." ORDER BY username"); while($row=mysql_fetch_row($result)) { $template->assign_block_vars( 'mail',array( 'nom' => $row[0], 'mail' => $row[1] )); } //les tels if (isset($_POST['nomtel'])) { $cdt=" AND username LIKE '%".$_POST['nomtel']."%'"; } else { $cdt =""; } $result=mysql_query("SELECT username, telephone FROM users WHERE telephone IS NOT NULL AND telephone <> ''".$cdt." ORDER BY username"); while($row=mysql_fetch_row($result)) { $template->assign_block_vars( 'tel',array( 'nom' => $row[0], 'numero' => $row[1], )); } $template->assign_vars(array( 'nomtel' => $_POST['nomtel'], 'nommail' => $_POST['nommail'] )); $template->pparse('annuaire'); ?>
Conclusion,
Dans les deux cas, j'ai fait un truc moche. Mais je vais moins galérer à améliorer l'aspect de celui avec template. Je sens que je vais avoir du mal à m'en passer dans les développements à venir.