Vous êtes sur la page 1sur 4

Projets

TinyButStrong un moteur
de modèle vraiment Wysiwyg
Niveau de difficulté : lll
Vincent Billard

Les moteurs de modèle (appelés aussi


moteurs de template) sont une technique
de programmation qui permet de travailler
séparément la partie PHP et la partie HTML
d'une application. La librairie la plus connue
en la matière est Smarty, mais il existe d'autres
moteurs qui peuvent apporter simplicité,
rapidité et autres avantages. Cet article va vous
présenter l'un de ceux-là : TinyButStrong.

L
es outils actuels de scripting, com- TinyButStrong. Un exemple d'application
me PHP ou ASP, amènent le déve- sera présenté un peu plus loin.
loppeur à générer du code source Le moteur TinyButStrong (TBS) sait
dans lequel les instructions de program- fusionner tout type de fichier dont le
mation et les instructions d'affichage sont source est le texte. Html a fortiori, mais
entrecoupés. Quand il y a beaucoup de son utilisation est identique pour Xml,
code, cela devient vite lourd. La technique Rss, Rtf, E-mail, .... Grâce à un petit
de moteur de modèle permet de séparer outil tbsOOo, il est aussi possible de
les deux. On peut ainsi facilement modifier fusionner des documents OpenOffice et
la page HTML sans se soucier du pro- d'obtenir des conversions en PDF.
gramme PHP et vice-versa (voir Figure 1). Un des atouts de TinyButStrong est
D'un point de vue conceptuel, on dit qu'un justement d'être une librairie de relative-
moteur de modèle sépare la logique de ment petite taille. Elle est contenue dans
Auteur présentation de la logique de program-
mation. Cette technique qui parait parfois Cet article explique...
Vincent Billard développe des inter- étrange aux programmeurs PHP, n'est Nous rappelons brièvement le principe
faces utilisateurs sous divers langages pourtant ni plus ni moins que la philoso- des moteurs de modèle, puis nous pré-
depuis dix ans. Lors de ses premiers pas senterons les possibilités de TinyButS-
en PHP, il a tout de suite recherché à tra- phie Wysiwyg déjà offert par bon nombre trong, en regardant particulièrement ce
vailler la partie graphique en mode Wy- de logiciels de développement. qu'il a d'original par rapport à d'autres
siwyg, car pour lui, Html est un format de moteurs de modèle.
fichier document avant d'être un langage.
Il a déjà développé des outils d'aide à la
Les plus
programmation pour d'autres domaines. de TinyButStrong Ce qu'il faut savoir...
Pour ceux qui connaissent déjà les mo- Des notions de Html et des bases sur la
TinyButStrong est l'un de ceux là.
programmation orientée objet sur PHP.
teurs de modèle, voici ce qui caractérise

28 www.phpsolmag.org PHP Solutions N° 6/2006


TinyButStrong Projets

dans un tableau une liste de personnes La plupart des autres moteurs existants,
Le Wysiwyg connectées. Cette application est donc tels que Smarty ou vLib, fonctionnent par
Wysiwyg signifie What You See Is What constituée d'un script PHP et d'un mo- assignation plutôt que fusion directe. C'est
You Get, c'est-à-dire Ce que vous voyez
dèle HTML. à dire que le moteur associe de façon
est ce que vous avez. On dit qu'un lo-
giciel est Wysiwyg quand il permet de logique le bloc et les données, puis il opè-
concevoir une interface ou un document Installation rera la fusion de toutes les assignations
en mode visuel. OpenOffice, Microsoft Côté script PHP, il suffit de déposer logiques à la fin. La méthode d'assignation
Office, Dreamweaver, Adobe Photoshop,
le fichier tbs_class.php ou tbs_class_ a des avantages et des inconvénients.
WinDev sont des logiciels Wysiwyg.
LateX et jEdit sont des éditeurs non php5.php selon que l'on travaille avec Elle ne permet pas d'avoir des fusions
Wysiwyg. PHP 4 ou PHP 5. On insère la librairie ordonnancées qui dépendent les unes des
TinyButStrong dans l'application de la autres, en revanche cela lui permet de réa-
un seul fichier (tbs_class.php) qui met manière la plus simple et la plus clas- liser facilement une compilation du modèle
à disposition une classe PHP n'ayant sique qu'il soit : on utilise la fonction (voir plus loin).
elle même que huit méthodes et quatre include() ou include_once(). On opère
propriétés à connaître. Par comparaison, une connexion MySQL afin de pouvoir Terminer la fusion
le moteur Smarty nécessite trois fichiers lire les données. Puis on crée une En dernier lieu, on fait appel à la méthode
de base avec de multiples extensions, sa instance de la classe TBS. C'est cette Show(). Cette méthode a deux utilités :
classe principale s'utilise avec trente-huit variable objet qui va piloter la fusion du d'abord elle fusionne les derniers champs
méthodes et trente-quatre propriétés. modèle. Avant de regarder le modèle automatiques restants dans le modèle,
Bien qu'il soit de petite taille, Ti- HTML, voyons ce que va faire le moteur puis elle envoie le résultat total de la fusion
nyButStrong ne manque pas de fonc- côté PHP. à l'utilisateur tout en terminant le script.
tionnalité. C'est jusqu'ici le seul moteur Nous venons donc de voir le pilotage
à autoriser des modèle qui soient édi- Chargement du modèle de la fusion côté PHP. Ce pilotage est
tables avec des outils visuels (tels que La méthode LoadTemplate() permet de souvent très semblable d'un moteur à un
Dreamweaver, FrontPage ou Open- charger le modèle. Tous les moteurs autre. Avec Smarty, il serait presque aussi
Office). C'est grâce aux balises relatives de modèle doivent faire cette opération en simple, il faudrait toutefois préparer quel-
de TBS que cela est rendu possible premier. ques paramètres du moteur et aussi récu-
(détaillé plus loin). En utilisant certaines pérer les données MySQL au préalable.
astuces du moteur TBS, on peut même Fusion d'un bloc
créer des modèles HTML qui respectent La méthode MergeBlock() est utilisée Côté HTML
complètement le standard W3C avant pour fusionner un bloc nommé b1 situé Maintenant regardons comment est
leur fusion. Ceci est impossible avec dans le modèle HTML avec le résultat composé le modèle. Il s'agit d'une page
la plupart des moteurs existants, entre d'une requête SQL. Contrairement aux HTML affichée volontairement en visuel
autre Smarty. autres moteurs de modèle, c'est TBS qui plutôt qu'on code source. Ce modèle
Autre aspect pratique : TinyButStrong va exécuter l'instruction SQL et lire les contient des balises TBS que l'on repère
est capable de fusionner en une seule enregistrements. TBS connaît quelques grâce à ses délimiteurs [ et ]. Ce sont les
instruction des données SQL, PHP, ou bases de données en natif. Le moteur délimiteurs par défaut mais on peut tout
autre source de données. En natif, il sait sait qu'il s'agit d'un requête MySQL grâce à fait les changer en ce que l'on veut. Les
traiter automatiquement les requêtes au type de la variable $conn, et c'est lui crochets ont été préférés aux accolades
MySQL, Postgre et SQLite. Si vous avez qui va exécuter la requête. Par sécurité, {, } car ces dernières sont plus présentes
d'autres types de sources de données, TBS ne sait lire que des données exter- dans les pages HTML classiques.
il est possible d'ajouter des fonctions qui nes, il est incapable de mettre à jour des
permettent à TBS de reconnaître cette données. Cette exécution de requête par Les champs
source de données. TBS est une facilité, si besoin on peut La balise [var.dateactu;frm='dd/mm/
Les fonctionnalités basiques de mo- passer à cette méthode un tableau de yyyy'] sert à afficher la variable globale
dèle sont présentes dans TBS mais aussi données au lieu d'une requête SQL. On
des fonctionnalités usuelles comme le peut faire reconnaître au moteur d'autres
formatage des dates et des nombres, types de bases de données à volonté
Le modèle
Ce qu'on appelle modèle c'est un fichier
l'affichage conditionnel, l'affichage alterné en codant des fonctions personnalisées. (HTML, texte, RFT,… ou autre) qui est
(changement de couleur une ligne sur Certaines sont disponibles sur le site comme le document final qu'on cherche
deux par exemple), les sous-modèles, le Web de TBS. Les autres moteurs de mo- à obtenir, mais pour lequel les parties
qui doivent afficher des données dyna-
formatage personnalisé à l'aide de fonc- dèle se contentent de savoir fusionner
miques sont replacées par des balises
tions PHP. des données de type tableau. propres au moteur. Le moteur de modèle
Avec MergeBlock(), la fusion entre le va opérer une ou plusieurs opérations de
Un petit exemple illustré bloc et les données est opérée immédia- fusion entre des données et ce modèle.
Après fusion, on obtient la page HTML
Nous allons voir pas à pas un exemple tement. Le modèle chargé est donc main-
finale.
simple d'une petite application qui affiche tenant déjà différent de son contenu initial.

PHP Solutions N° 6/2006 www.phpsolmag.org 29


Projets TinyButStrong

Autres paramètres utiles


Voici quelques exemples de paramètres
de champ qui simplifient la mise en
���������� ����������
forme : max permet de limiter la longueur
d'un texte ; magnet permet de suppri- ���
���
���
���
��� ���
���
���
���
���

mer un balise HTML quand le champ


a une valeur vide ; selected permet de
sélectionner un item dans une HTML ;
���������������� ���������������� ����������������
file permet d'insérer un sous-modèle ;
�����
htmlconv=js permet de convertir le texte �����
�����������������
�����
��������������� ���������

en chaîne Javascript. ���������������� ��������������� ���������


��
����������������� ���������������
���������������� ���������������
����������������� ��������������� ������

$dateactu. Une balise affiche une don- ���������������� ���������������


����������������� ��������������� �����

née simple est appelée un champ. Les


���������������� ��������������� ������������������
����������������� ��������������� �������������������
���������������� ��������������� �������������������
champs Var (dont le suffixe est var) sont �� �� �������������������
�������������������
fusionnés automatiquement par TBS ������������������
������������������
lorsqu'on appelle la méthode Show() �����
����������
�����
���������
������������������
������������������
du côté PHP. La suite de la balise sert ����������
��
���������
��
������������������
������
à définir un paramètre qui indique le
����� �����
format d'affichage. Ici la date sera af- ���������� ���������
���������� ���������
fichée au format français. Il existe bien �� ��

d'autres paramètres pour les champs. ����������������� ��������������� ����������������� ���������������


����������� �����������
Dans Smarty, le paramètre de forma-
tage des dates existe aussi mais il re-
quière un format de type PHP. Le format Figure 1. Architecture d’une application PHP avec et sans moteur de modèle
Smarty équivalent à 'dd/mm/yyyy' serait
'%d/%m/%Y'. bloc. Le préfixe b1 correspond au nom du modèle HTML en mode visuel. Le
du bloc, toutes les balises du bloc moteur TinyButStrong permet aussi
Les blocs doivent avoir ce préfixe. Le suffixe les syntaxes explicites. Dans ce cas il
Les blocs sont des zones du modèle u_name indique qu'il faut afficher la va- faudrait encadrer la ligne <tr>...</tr>
qui vont servir afficher les enregistre- leur de la colonne du même nom. Le avec des balises [b1;block=begin] et
ments. Dans notre exemple, le bloc paramètre block=tr définit les limites [b1;block=end] Mais bien sûr ces ba-
b1 va être multiplié autant de fois qu'il du bloc b1 comme étant les balises lises seraient alors invisibles en mode
y a d'enregistrements retournés par la <tr> et </tr> qui l'entourent, c'est- visuel. Smarty et les autres moteurs
requête SQL. Les limites topologiques à-dire la ligne du tableau HTML sur de modèles ne permettent qu'une syn-
du bloc b1 sont définis par la balise laquelle il se trouve. C'est ce qu'on taxe explicite.
[b1.u_name;block=tr] . En fait cette appelle une syntaxe relative. C'est
balise définit à la fois un champ et un elle qui rend possible la conception Les champs de bloc
La balise [b1.u_lastlogin] est un
champ de bloc. Comme le précédent,
Listing 1. Petite application avec le moteur TinyButStrong
il affiche la valeur d'une colonne de
<?php l'enregistrement fusionné. Mais ici, pas
include_once('tbs_class.php'); besoin de redéfinir à nouveau le para-
$conn = mysql_connect('root','','localhost'); mètre de bloc. C'est superflu car le bloc
est déjà défini par un autre champ sur
// connexion à MySQL
la même ligne.
$dateactu = date();
$TBS = new clsTinyButStrong; Alternance des couleurs
Le tableau HTML présente une deuxième
// création de l'instance de classe
ligne identique à la première mais d'une
$TBS->LoadTemplate('modele1.html'); couleur différente. Le bloc b1 est donc dé-
fini deux fois. Quand le moteur de modèle
// chargement du modèle TinyButStrong rencontre cette situation,
il se sert de chaque section pour en faire un
$TBS->MergeBlock('b1',$conn, 'SELECT * FROM t_user WHERE (u_connected=1)');
affichage alternatif. Après fusion, le tableau
$TBS->Show();
affichera une alternance de couleur de
// finalisation de la fusion ligne. Pour obtenir le même résultat sous
Smarty, il faut avoir recours à un codage de
?> sections if/then/else au sein du source
du modèle.

30 www.phpsolmag.org PHP Solutions N° 6/2006


TinyButStrong Projets

La sécurité
������������������������ TinyButStrong ne permet pas d'exécu-
ter des fonctions propres au langage
PHP depuis un modèle. Par contre
��������������������������������
il permet l'exécution de fonction uti-
lisateur qui ont un format spécifique.
���������������������������������������������� Il n'y a donc pas grand-chose à crain-
dre de ce côté-là. Par mesure de
��� ������������� �����
sécurité, TinyButStrong convertit par
�������������������� ���������������� ������������
�������������������� ���������������� ������������ défaut tous les caractères [ par son
équivalent HTML. Cela perturbe parfois
les développeurs mais ça a pour but
������������������������
d'éviter l'injection de balises TBS lors
de la fusion, bien que les effets d'une
telle pratique soient plutôt limités car
��������������������������������
ils n'atteignent que la partie graphique.
On peut abaisser cette sécurité quand
������������������������� nécessaire pour chaque champ du
modèle.
��� ������������� �����
���� �������� �����������
������� �������� ������������� Futur du logiciel
����������� �������� �������������� La version 3.0 de TinyButStrong est
������ �������� �������������� en fin de développement. La grande
����� �������� ����������
nouveauté sera de pouvoir ajouter des
��������� �������� ��������������
plug-ins. Il y aura quelques améliora-
tions et simplifications de la syntaxe
pour les balises HTML. Comme d'habi-
tude cette librairie sera complètement
Figure 2. Le contenu du modèle HTML avant et après la fusion
gratuite et disponible pour PHP 4 et 5.
Les champs automatiques Pour améliorer leurs performances,
Nous avons vu que les champs Var les moteurs de modèles se sont dotés Conclusion
étaient automatiquement fusionnés de deux accessoires forts utiles : Nous venons de voir les principes de
avec leur variable PHP correspondante. le système de cache et la compilation base d'une application développée avec
Il existe deux autres types de balises de modèle. Le système de cache con- le moteur TinyButStrong. Cela vous
fusionnées automatiquement. Les bali- siste tout simplement à pouvoir enre- apporte un aperçu de ses fonctionna-
ses [onload] sont fusionnées lorsque la gistrer le résultat d'une fusion dans un lités sur lesquelles vous pouvez vous
méthode LoadTemplate() est appelée. fichier cache et de l'afficher à sa place appuyer pour vos premiers développe-
Elles peuvent servir à définir un champ lorsque c'est opportun. TinyButStrong, ments avec cet outil. Mais le moteur
ou un bloc et sont très utiles pour l'inser- comme quasiment tous les autres mo- réserve encore d'autres fonctionnalités
tion de sous-modèles ou le masquage teurs, a son propre système de cache. qui facilitent la mise en forme de mo-
de zones. Les balises [onshow] font la Quant à elle, la compilation de modèle dèle, qu'ils soient HTML ou autre. n
même chose mais elles sont fusionnées consiste à traduire le script de fusion
automatiquement lorsque la méthode et son modèle par un seul script PHP
Show() est exécutée. qui serait une suite de echo() et de Sur Internet
HTML. Un retour à la case départ ?
• http://www.tinybutstrong.com
Les performances Pas vraiment. Le modèle impropre- – Le site web du moteur TBS, avec
Tous les moteurs de modèle ont en co- ment appelé « compilé » est quasi- forum et FAQ
mmun de devoir charger un modèle et de ment incompréhensible à la lecture de • http://www.tinybutstrong.com/
tbsooo.php
rechercher ses balises à l'intérieur. Cette son source, par contre il fait la même
– L'outil tbsOOo qui premet la fusion
technique est par nature forcément plus chose que le script d'origine avec son de documents OpenOffice et con-
lente qu'une méthode basique de suite modèle, et il le fait plus vite. La com- version PDF
de echo(). Toutefois plusieurs moteurs pilation de modèle est l'un des atouts • http://www.phpwact.org/pattern/
good_template_smells
obtiennent des résultats très acceptables de Smarty, et TinyButStrong n'est pas
– Un article à propos des pré-requis
pour des interfaces professionnelles, encore doté de cette fonctionnalité. pour faire un bon moteur de modèle
même des pages Web très sollicitées. Les Toutefois TBS garde des performan- • http://cyberzoide.developpez.com/
performances dépendent aussi beaucoup ces du même ordre de grandeur que php4/template/
– Une liste comparative de moteurs
de la qualité de programmation et du tra- les modèles Smarty compilés. Hors
de modèle sous PHP, plus très
vail d'optimisation apportés au script et au compilation, TinyButStrong est le plus actuelle
modèle. rapide.

PHP Solutions N° 6/2006 www.phpsolmag.org 31

Vous aimerez peut-être aussi