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. annuaire1.jpg

<!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&eacute;l&eacute;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&eacute;ros de t&eacute;l&eacute;phone:</h3>
			<form method="post" action="annuaireinterne.php">
 				<p>D&eacute;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. annuaire2.jpg Le template:

<div id="main">
 
		<div id="telephone" style="position: absolute; width 50%; left: 0px; top: 0px; background: #F7F7F7;"> 
 
			<h3>Num&eacute;ros de t&eacute;l&eacute;phone:</h3>
			<form method="post" action="{acturltel}">
 				<p>D&eacute;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.

Page top