Posts Tagged ‘ Templates

XSLTProcessor: Utiliser des fonctions PHP pour des traitements avancés

J’ai eu souvent l’occasion d’utiliser XSL pour gérer des templates d’affichages.
En effet j’ai eu beaucoup l’habitude de travailler avec des contenus XML pour leur structure simple à exploiter. Ce type de contenu permet, à mon sens, une séparation plus simple entre traitement et affichage qu’avec une base de données.

Cependant les feuilles de style XSL sont assez limitées dans les traitements car même si elles permettent des boucles et des calculs simples, toutes les informations utiles doivent être stockées dans le XML pour être exploitées directement par le XSL.
Cette exhaustivité d’information est assez rare et plus particulièrement dans l’affichage des médias. XSL ne permet pas, contrairement à PHP, de tester l’existence d’un fichier, de redimensionner une image ou de lire des meta-données associées à un fichier.

Pour réaliser ces traitements plus avancés, le processeur XSLT associé à PHP (XSLTProcessor inclut dans le module php_xsl) permet l’appel de fonction PHP à travers XSL.

Pour cela il faut créer une feuille de style XSL en ajoutant l’espace de nom XML PHP dans l’en-tête:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" >
...
</xsl:stylesheet >

Pour activer l’utilisation de ce nouvel espace de nom, il faut lors de la construction de l’objet XSLTProcessor appelé l’instruction suivante:

$oXSL = new XSLTProcessor( DOMDocument::load( "chemin-vers-mon-fichier" ) );
$oXSL->registerPHPFunctions();

Afin d’être utilisées dans la feuille XSL, les fonctions PHP doivent être déclarées en amont de la construction de l’objet XSLTProcessor. Voici un exemple d’appel à une fonction écrite en procédural:

function AfficherTexte( $sText )
{
   return $sText;
}
...
<xsl:value-of select="php:function('AfficherTexte', $myText)" />

Voici un autre exemple d’utilisation avec une fonction statique:

class Text
{
   public static function Afficher( $sText )
   {
      return $sText;
   }
}
...
<xsl:value-of select="php:function('Text::Afficher', $myText)" />

Pourquoi ne pas utiliser PHP comme moteur de Template

Pour répondre à cette question, je vais m’appuyer sur un article publié par Fabien Potencier sur le sujet: Templating Engines in PHP. Fabien Potencier est un membre très actif de la communauté symfony, il est aussi le PDG de la société Sensio à l’origine du projet.

Il décrit dans cette article les différentes raisons qui l’ont fait changer d’avis sur les templates PHP. En effet, aujourd’hui, j’utilise souvent PHP pour construire mon HTML rapidement sous la forme de templates simpliste (passage de variable par fonction extract puis utilisation dans un fichier HTML template).

Pour un développeur cette méthode fonctionne à merveille mais n’est pas très souple. Dès que l’on doit rajouter une nouvelle information, il faut repasser dans le HTML, le PHP, parfois le JavaScript pour réorganiser le tout… Rapide me direz-vous? Pas si on remet le template à sa place.

En effet le Template sert normalement à gérer l’affichage des données. En modèle MVC, il est utilisé dans les vues pour mettre en forme les données transmises par le contrôleur. Pour cette raison, un Web Designer peut conscient des technologies PHP doit pouvoir s’approprier facilement les Templates pour les modifier. Il ne devrait pas se soucier des données, de la forme, l’encodage, le découpage, la cesure et tout ce qui s’en suit…

Par rapport à se constat, PHP n’est pas un moteur de Template adapté pour être utilisé dans une équipe de création structurée et multi-compétences. Pour cela des moteurs de Template simples (attention à utiliser pas à réaliser) comme celui utilisé dans le FrameWork Django. Il en éxiste d’autres mais je trouve celui-ci vraiment souple et puissant par rapport à d’autres.

Il utilise une syntaxe et un interpréteur développer spécifiquement pour répondre à la besoin de la création de Templates. Il est possible d’utiliser des variables, de faire des boucles, des conditions booléennes de l’inclusion de fichier, des filtres sur les données (couper quand trop long, mise en minuscules/majscules…). La syntaxe très simple peut être utilisée par n’importe quel public technique non développeur (Monteur, Web Designer, …).

Un éventail des possibilités de ce moteur de template se trouve sur le site: http://www.biologeek.com/django,traduction,web-frameworks/le-langage-de-template-django-pour-les-auteurs-de-templates/

La documentation est accessible directement sur le site du projet Django: http://docs.djangoproject.com/en/dev/ref/templates/builtins/