Toute l'actualité du CMS TYPO3, typoscripts, extensions, liens et téléchargements
Nous sommes le 03/09/2010
Fluid, le nouveau moteur de template
Je dois bien l'avouer mais en ce début de mars 2009, difficile de décrire précisément le fonctionnement de Fluid si l'on s'appuie sur le peu de documentation qui existe sur la toile. Cependant, je souhaitais faire un petit brief sur ce nouveau moteur de template qui risque de devenir indispensable dans les prochains mois.
1. Qu'est ce que Fluid ?
Fluid (anciennement BEER3) est le nom du moteur de template dans la prochaine version majeure de TYPO3 : la version 5 (Sebastian Kurfuerst et Bastian Waidelich travaillent actuellement sur le projet). Cependant, la Core Team à souhaité que la transition entre les versions 4.x de TYPO3 et l'adoption de la version 5.0 se fasse en douceur. Ainsi, il y aura une sorte de backportage du modèle MVC de la version 5 vers la version 4.3 de TYPO3. Fluid apparaitra donc plus tôt que prévu ! D'ailleurs, Fluid a été intégré avec la version 4.3 Alpha 3, en même temps que Extbase, la librairie qui remplacera tslib_pibase.
J'ai souhaité dans cet article vous faire découvrir quelques aspects de Fluid afin de satisfaire votre curiosité :) Ces informations ne sont pas exhaustives mais j'espère que vous aurez un petit aperçu de Fluid à l'issu de l'article.
2. Pourquoi inventer un nouveau moteur de template ?
Il semblerait que les moteurs existants comme Smarty aient quelques inconvénients quand à leur utilisation dans la prochaine version majeure de TYPO3 :
- pas suffisamment orientés objet
- lacune lors de l'utilisation de certains types de gabarits (vCard, CSV ...)
- pas assez extensibles
Je ne suis pas bien placé pour juger le choix concernant la création d'un nouveau moteur et pour juger si ces remarques énoncées ci-dessus sont suffisamment pertinentes. On regrettera cependant la nécessité d'apprendre un énième langage de templating même si au premier abord, la syntaxe de Fluid a des similarité avec d'autres moteurs de template.
3. Syntaxe et view helpers
De manière générale, un script va faire appel à un gabarit pour afficher la réponse à une requête de l'internaute. On va passer des variables dynamiques à un gabarit mais en respectant une certaine syntaxe.
Retenez que comme tout moteurs PHP de template, un gabarit ne contient pas de code PHP mais peut contenir des fonctions pour traiter justement les variables reçues depuis le programme PHP. Ces fonctions sont issues des aides de vue (view helpers).
Théoriquement, le mécanisme des "view helpers" permet de factoriser (mettre en commun du code) des opérations fréquentes situées dans les templates de vues. Ces aides sont stockées en général dans un dossier views/helpers. Une aide de vue est représentée par une classe qui comporte une méthode du même nom. On appelle ensuite la méthode $this->nomAide() dans un script de vue, ce qui va créer une instance de notre aide de vue. Cette instance est persistante et elle peut être appelée à n'importe quel moment.
Par exemple, une aide de vue pourrait nous communiquer l'url de base de notre application pour créer des liens absolus ou bien renseigner le base href dans les entêtes de nos pages.
Avec une moteur de template comme Smarty, voilà comment on procède en général :
$this->view->assign('blogTitle', $blog->getTitle());
<h1>This blog is called {blogTitle}</h1>
Dans notre fichier PHP, nous avons ici passé une propriété d'un objet appelé 'blog' à notre template puis nous avons appelé ce titre avec {blogTitle}
Avec Fluid, on pourrait passer directement l'objet dans un template.
$this->view->assign('blog', $blog);
This blog is called {blog.title}, written by {blog.author}
La lisibilité est bien meilleure selon les créateurs de Fluid.
{blog.author.email} ferait appel au code suivant : $blog->getAuthor()->getEmail(). On récupère ainsi l'adresse email de l'auteur du blog.
4. Le chargement des aides de vue
On charge les view helpers de la manière suivante dans un template :
{namespace f3=F3\Fluid\ViewHelpers}
Les aides de vues sont chargées sous le prefix f3 et leur syntaxe fait penser au XML. Fluid utilise des espaces de nom (namespace) pour séparer clairement les différents types de view helpers.
Ensuite, pour faire appel à une aide de vue, il faut l'appeler de la manière suivante :
<f3:aide_de_vue...>...</f3:aide_de_vue>
Exemple :
<f3:link...> ... </f3:link> permet de générer un lien.
Ici, nous avons fait appel au view helper LinkViewHelper. La syntaxe est ce qu'elle est... dommage que l'on ne reprenne pas le même ordre que sur certains framework comme Zend. Ici, on va rajouter une lettre capitale à notre aide appelée ; link devient Link. Ensuite, on ajoute ViewHelper, ce qui fait LinkViewHelper.
Il n'y a pas encore beaucoup de view helpers mais vous pouvez évidemment en ajouter. Notez qu'un view helper hérite toujours de la classe \Fluid\Core\AbstractViewHelper (Classes/Core/AbstractViewHelper.php). Il comprend obligatoirement deux méthodes :
- initializeArguments() pour initialiser les arguments qui seront utilisés par le view helper
- render() : pour l'affichage
Pour en revenir à notre exemple de base href, nous pourrions faire appel à BaseViewHelper.
5. View helpers et passage de paramètres
Il est possible de passer des paramètres sous forme de chaines, tableaux ou d'objets.
Exemple :
<f3:link controller="Blog" action="show" arguments="{id : blogPost.id}">... read more</f3:link>
ou
<f:link.action action="new" controller="Vote" arguments="{idea : idea,
voteValue: 1}">Vote up</f:link.action>
Ici, nous allons créer un lien qui va rediriger vers le contrôleur "Blog" et appeler l'action show pour certainement afficher un résultat. Des paramètres supplémentaires seront passés avec "arguments" qui reçoit un tableau associatif, chaque paramètre étant séparé par une virgule (param1 : param1, param2 : param 2...).
Attention ! Si votre argument est un tableau ou un objet, laisser un espace entre 'arguments="' et '{id :' le transformera en chaine. Apparement, ceci n'est pas un bug, c'est une fonctionnalité.
Dans notre exemple, la fonction initializeArguments de la classe LinkViewHelper est un type de constructeur. La méthode render() retourne ensuite le lien.
6. Conclusion
Difficile de dire beaucoup plus sur Fluid actuellement.Il faut espérer que l'intégration de ce moteur permettra encore plus de flexibilité dans la construction des gabarits. On avait déjà cette flexibilité dans TYPO3 mais notre CMS préféré, tel que nous le voyons actuellement, va fondamentalement changer dans les deux ou trois prochaines années. Il sera construit sur la base d'un framework, Flow3, ce qui nécessite un moteur de template... d'où Fluid. Ce qui est bien dans l'histoire, c'est que la transition devrait se faire en douceur. Maintenant, il n'y a plus qu'a espérer que tout ce qui arrive, tiendra ses promesses ;-)
Wiki Fluid et autres informations sur Forge