Les solutions de gestions de contenu récentes proposent souvent un système de gabarits ("templates") pour personnaliser l'aspect, le style du site. En PHP, il est très facile de se doter d'un tel système.

Les fonctionnalités d'un système de gabarits

Structure de la page
Le gabarit permet de structurer la page à sa convenance (tableau, div, etc...).
Modularité
Le gabarit permet de choisir les modules à afficher. (On se place ici dans le contexte d'un site qui affiche une collection de modules plus ou moins indépendant.)
Simplicité
A l'intérieur de la structure définie par le gabarits, des marques indiquent l'emplacement pour une donnée précise (titre, contenu d'un article, message globale, etc...). Idéalement, le gabarit ne contient pas de programme (affichage sous condition, boucle, etc...) : toute structure programmatique est une source potentielle d'erreur d'autant plus difficile à repérer que le gabarit est complexe.

Intégration d'un système de gabarits

Une application PHP utilisant un système de gabarits effectuera son traitement dans cet ordre, à peu de choses près :

  1. Récupération des paramètres
  2. Traitement de données
  3. Définitions des fonctions d'affichages et des valeurs affichables
  4. Inclusion du gabarit global

Les fonctions d'affichages peuvent aussi faire appel à des gabarits, qu'on qualifiera ici de locaux.

Gabarit global

Idéalement l'inclusion de ce gabarit est la dernière instruction d'un script : tous les traitements sont effectués, et les données sont prêtes à être affichées. Quant aux fonctions d'affichage, elle sont utilisables telles quelles, toutes les initialisations nécessaires ayant été effectuées.

Exemple

Voici le gabarit global utilisé par sporniket.com :

<!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" xml:lang="fr" lang="fr">
	<head>
		<meta content="text/html; charset=utf-8" http-equiv="content-Type"/>
		<title><?=$page->getLabel()?> &#8211; <?=$messages["TITLE"]?></title>
		<link rel="stylesheet" title="<?=$messages["TITLE"]?>" type="text/css" href="/styles/sporniket.css"/>
		<link rel="start" title="<?=$messages["TITLE"]?>" href="<?=$linker->getTopPage()?>"/>
	</head>
	<body>
		<div id="container">
			<div id="content">
				<div id="header">
					<?showPagelet('pagelet/access','pagelet_header.xhtml')?>
					<?showPagelet('pagelet/header','pagelet_header.xhtml')?>
				</div>
				<div id="internals">
					<?showPagelet('pagelet/categories')?>
					<?showPagelet('pagelet/sticky')?>
				</div>
				<div id="externals">
					<?showPagelet('pagelet/mysites')?>
					<?showPagelet('pagelet/blogroll')?>
					<?showPagelet('pagelet/links')?>
				</div>
				<div id="body"><?showBody()?></div>
				<div id="footer">
					<p id="copyright"><?=$messages["DIRECTION_COPYRIGHT"]?></p>
					<p id="browser"><?=$messages["DIRECTION_BROWSER"]?></p>
				</div>
			</div>
		</div>
	</body>
</html>

Gabarit local

Un gabarit local est inclus dans une fonction. Toutes les variables utilisées dans le gabarit doivent être visible dans la fonction : les objets globaux doivent donc faire l'objet d'une déclaration dans le corps de la fonction.

Exemple

Pour afficher les menus, on utilise le gabarit local suivant :

<div class="Pagelet">
	<h2><?=$page->getLabel()?></h2>
	<?=$page->getData()?>
</div>

La fonction qui inclus le gabarit est la suivante :

<?php
/*
(c)2004 David Sporn

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License version 2.1 as published by the Free Software Foundation.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

function showPagelet($pageName, $template = 'pagelet.xhtml')
{
	global $messages, $request, $linker, $pageBase, $pageFilter ;
	$pageFilter->setName($pageName) ;
	$pagelet = $pageBase->getList($pageFilter) ;
	if (count($pagelet))
	{
		$page = $pagelet[0] ;
		include('templates/'.$template) ;
	}
}
?>

Conclusion

Le point clé est la définitions des fonctions d'affichages et des valeurs affichables, autrement dit la définition des fonctionnalités accessibles depuis le gabarit.