8 Mbits on the left lane
Développement Web, Google, camescope, Canon HV20, Firefox, PHP, HDV, barbecue, tarte, Blu-Ray
Il y a probablement plus d'une centaine de moteurs de template en PHP (le plus connue étant Smarty). Les templates sont un bon concept : garder la présentation dans un fichier, et la logique applicative dans un autre (et le stockage dans un troisième endroit : la base de donnée). Utiliser un langage simple et facile pour les templates de sorte que n'importe quel infographiste ou amateur de HTML pourra s'en servir, et laisser les aspects complexes de la programmation à quelque chose et quelqu'un d'autre. Oui, les templates sont utiles avec Java, C#, Python ou n'importe quel langage. Sauf PHP.
Pourquoi donc ? Voilà un indice : PHP vient de "Hypertext Preprocessor". C'est à dire en clair un système de template HTML. Et de fait, PHP est bien un langage de template : il a été créé pour être simple et facile à utiliser, et pour permettre d'insérer directement son code dans une page HTML pour en contrôler l'aspect. Alors tout ces systèmes de template pour PHP ne font au final qu'un langage de template écrit avec un autre langage de template. Doh !
Prenons par exemple quelques lignes d'un template Smarty :
{$title}
{include file='header.tpl'}
{if $a}
Hello
{else}
Bye
{/if}
Et la même chose en PHP :
<?php
echo($title);
include('header.php');
if ($a)
echo('Hello');
else
echo('Bye');
?>
Vraiment, quel est l'intérêt de réinventer la roue ?
Les moteurs de template obligent à apprendre une nouvelle synthaxe, ralentisse le traitement (car il faut lire et analyser la template), et comme toute couche logicielle supplémentaire, augmente les chances de tomber sur un bug ou une faille de sécurité. Dès lors ils ne présentent un intérêt qu'avec les langages où la génération de HTML est lourde et pénible. Est-ce le cas avec PHP ? Certainement pas.
Bien sûr, il reste toujours utile de séparer la logique et la présentation. Mais on peu parfaitement le faire sans abandonner PHP : il suffit par exemple de mettre la présentation dans la page PHP principale et de placer la logique dans des fichiers externes. Ou à l'inverse, de stocker la présentation dans une template séparée écrite en PHP "classique. Ou bien les deux en mettant chaque chose dans un fichier distinct.
Dans mon premier billet sur l'optimisation de site Web j'évoquais la possibilité d'utiliser un script pour servir plusieurs fichiers Javascript (ou CSS) d'un coup pour gagner en vitesse. Voici un petit exemple de script PHP pour réaliser ce type de regroupement à la volée :
header('Cache-Control: max-age=3600, must-revalidate');
header('Content-type: text/javascript');
ob_start('ob_gzhandler');
if ($_REQUEST['f'])
{ $tab=explode(' ',trim($_REQUEST['f']));
foreach ($tab as $file)
if (preg_match('/^([0-9a-z_\-]+\/)*[0-9a-z_\-]+\.js$/i',$file)) readfile($file);
}
Le script est supposé être installé dans le répertoire où se trouvent les fichiers Javascript à servir. Ainsi, si vous avez 3 fichiers à regrouper ensemble vous pourriez utiliser une seule ligne HTML de la sorte :
<script src="/javascripts/script.php?f=file1.js+file2.js+file3.js" type="text/javascript"></script>
Quelques mots sur le code :
Il se trouve que Rakaz explore et développe la même idée, mais lui va plus loin en utilisant mod_rewrite pour présenter une URL plus lisible et qui cache le script de groupage.