Movable Type, la magie des templates
La force de Movable Type (“MT”), c’est son système de templates (“modèles”) et de balises qui permet de réaliser des constructions complexes sans recours à la programmation de scripts, allié à la possibilité de générer des contenus statiques et/ou dynamiques.
Le template est un fichier de description, une sorte de gabarit du document final, dans lequel sont insérées des balises qui seront traitées par le parseur au moment de la génération du fichier final. L’objet de cet article est de proposer un aperçu du fonctionnement de ce puissant système de templates.
(Note : comme la technologie Movable Type est à l’origine de Typepad, l’essentiel de ce qui suit vaut aussi pour les abonnés à la version “pro”, seuls autorisés à modifier les templates.)
Ce billet fait référence à la version 3.31 de Movable Type. Mais la logique vaut pour les versions ultérieures.
Les balises MT
Une balise MT, encadrée de “<” et “>”, ressemble beaucoup à une balise HTML. Toutes les balises MT commencent par “MT” (ou “$MT”) afin de les distinguer.
Comme pour le HTML, il y a des balises ponctuelles (comme <br />
ou <img />
) et des balises conteneurs (comme <p></p>
).
Exemples de balises MT :
<$MTBlogName$>
<$MTEntryTitle$>
<MTIfCommentsModerated> </MTIfCommentsModerated>
À noter, les “$” sont optionnels, ainsi :
<$MTBlogName$> = <MTBlogName>
(De façon conventionnelle, les variables sont avec “$”, les balises “conteneur”, sans.)
Le parseur
Lors de la génération d’un fichier par Movable Type, généralement une page HTML (mais pas toujours), le parseur/interpréteur réalise les opérations suivantes :
- Il charge le template correspondant au fichier à générer.
- Il fait une lecture de haut en bas du template et repère tout ce qui le concerne, c’est à dire les balises MT. C’est l’analyse lexicale (“tokenisation”) du template.
- Il valide la syntaxe (et stoppe s’il rencontre une erreur). Le template doit être correctement “construit” et respecter la “grammaire” propre à MT.
- Il traite les opérations demandées par les balises, ce qui implique la plupart du temps des interrogations de la base afin d’y récupérer des données.
- La page finale est construite. Les balises MT n’y figurent plus, elles ont été remplacées par le résultat des opérations demandées. Le fichier de sortie est placé à l’adresse physique qui accompagne le template.
Dans le cadre d’un blogue, le parseur de MT traite généralement des templates en HTML enrichi de balises MT, mais aussi des templates XML, comme pour générer le fil Atom, par exemple. En fait, il n’y a pas de restriction au niveau de MT sur le genre de fichier en entrée/sortie.
Vous pouvez ainsi générer du HTML, XHTML, PHP, XML, TXT, CSV, XLS, PDF, etc. Bref, tout fichier texte possible et imaginable…
Hello world!
Un court exemple est plus parlant que de longues explications. Voici un exemple de template MT très simple :
<$MTSetVar name="prénom" value="Laurent"$>
Hello World!
Bonjour <$MTGetVar name="prénom"$>. Il est <$MTDate format="%H heures %M"$>.
Nous utilisons la version <$MTVersion$> de Movable Type.
Il faut préciser à MT le nom et la destination du fichier de sortie, par exemple “test/hello-wolrd.txt”. Une fois la génération du fichier demandée (“build”), on trouvera dans le dossier “test” (créé s’il n’existe pas) le fichier “hello-world.txt” suivant :
Hello World!
Bonjour Laurent. Il est 13 heures 42.
Nous utilisons la version 3.31 de Movable Type.
Comme vous voyez, c’est facile à comprendre.
Différents types de templates
1. Les templates “indexes”
Ces templates ont la caractéristique commune de générer un fichier de sortie unique. On y trouvera par exemple votre page d’accueil (“index”), ou votre fil Atom (“atom.xml”). Pour chacun, on peut préciser :
- “Output File” : le chemin et nom du fichier de sortie.
- “Dynamic” : si sélectionné, il n’y a pas de fichier de sortie “physique”. Le résultat est généré dynamiquement, à la demande. Par défaut, le réglage est statique (un fichier est enregistré sur le disque dur). La quasi-totalité des autres logiciels de blogues fonctionnent sur un mode dynamique seul (PHP).
- “Linked” : les templates sont enregistrés, par défaut, dans la base de données. Il est toutefois possible de les enregistrer dans un fichier texte externe. C’est particulièrement utile dans un contexte multi-blogues, pour partager des templates communs. [Par exemple, j’ai créé mon propre template de fil RSS de commentaires (qui n’existe pas dans la configuration par défaut), je peux ainsi le partager entre les trois blogues qui composent “Embruns”, chaque bloque faisant référence au même fichier template externe. Les éventuelles corrections apportées au template sont alors communes aux trois blogues.]
- “Built w/Indexes” : en mode statique, demande à MT la reconstruction automatique du fichier de sortie lors de l’enregistrement d’un nouveau contenu (nouveau billet, nouveau commentaire, nouveau track-back). C’est indispensable pour votre page d’accueil par exemple, pour qu’elle reflète la publication de nouveaux billets. C’est inutile pour votre fichier feuille de styles. Si “Built w/Indexes” n’est pas sélectionné, on passe en mode manuel, c’est à l’utilisateur de demander la reconstruction lorsqu’il en a le besoin.
Exemple sur mon blogue “Carnet Web” (celui où est publié ce billet) :
Lors de la publication d’un nouveau contenu sur mon “Carnet Web”, les fichiers “Main Index”, “Master Archive Index” et tous les fils RSS sont reconstruits pour refléter les mises à jour. Les fichiers “Blogoliste”, les feuilles de styles et les javascripts, sont reconstruit seulement sur demande, après modification.
Mes fichiers “atom.xml”, “comments.rdf”, “index.xml” sont liés à des fichiers texte externes, afin de les synchroniser avec les deux autres blogues de l’installation, “Journal de bord” et “Mon quotidien”. Le “index.rdf” n’est pas lié parce que j’utilise le template de MT par défaut.
Aucun fichier n’est généré dynamiquement dans mon installation, ils sont tous “en dur”, ils ont une présence physique sur le disque dur du serveur.
Note : pour avoir accès au changement par template du réglage dynamique/statique, il faut avoir sélectionné “Dynamic Publishing: Set each template’s Build Options separately” dans l’onglet “Publishing” des “Settings”. Je trouve ça un peu idiot (pas intuitif), mais c’est comme ça.
2. Les templates “archives”
Ces templates ont la caractéristique commune de générer plusieurs fichiers de sortie. On y trouvera, par exemple, un template d’archive par catégorie. Le template “catégorie” est unique, mais il y aura autant de fichiers de sortie que de catégorie existantes. Pour chacun, on peut préciser :
- “Dynamic”.
- “Linked”.
En mode statique, les reconstructions sont gérées automatiquement par MT. Seuls les fichiers impactés par une modification de contenus seront reconstruits. Si un nouveau billet est publiée dans une catégorie “cuisine”, seul le fichier de catégorie correspondant à “cuisine” sera reconstruit. De même façon, lorsqu’un commentaire est ajouté à un billet, seul le fichier correspondant à l’archive de ce billet sera recréé.
Sur “Carnet Web”, j’ai deux templates d’archives : par catégorie, exemple “Movable Type”, et par billet individuel, comme la page que vous êtes en train de lire.
Sur “Journal de bord”, c’est un peu différent : j’ai un template d’archive par jour, exemple 29 juillet 2006, et un par mois, exemple juin 2006. Il n’y a pas d’archive unique par billet sur “Journal de bord”, ce qui est peu commun dans le monde des blogues… Seulement une archive par jour.
3. Les templates “system”
Ces templates “system” sont particuliers : il ne génèrent pas de fichiers, mais fonctionnent uniquement en mode dynamique (CGI), vous pouvez ni les détruire, ni les créer, vous pouvez uniquement les personnaliser. Ils gèrent principalement les résultats de recherche, les commentaires en pop-up (qui ne sont pas utilisés dans une installation classique).
4. Les templates “module”
Les modules permettent de synchroniser des morceaux de code communs à plusieurs templates. Il s’agit de morceaux de templates que vous pouvez appeler dans d’autres templates. C’est extrêmement puissant, ne vous privez donc pas de les utiliser. C’est utile pour les éléments qui sont identiques entre différents templates, comme le bandeau supérieur de vos pages, une navigation latérale, une liste de liens, ou encore le pied de page.
À noter : le plugin Widget y stocke aussi tous ses modules, que vous pouvez ainsi personnaliser facilement.
Pour inclure un module dans un template :
<$MTInclude module="Pied de page"$>
Réglages de publication
Movable Type n’a jamais été très intuitif avec ces réglages. Il devraient se trouver logiquement avec les templates “archives”, mais, ils sont dans le 4e onglet des “Settings”…
C’est donc dans les “Publishing Settings” que vous trouverez les “Archive Mapping”. Ils vous permettent de déterminer les types d’archives produits (individuel, quotidien, hebdomadaire, mensuel, par catégorie), d’affecter un template à chaque type d’archive choisi, et enfin, de déterminer pour chaque type un schéma d’URL.
Les possibilités de schémas d’URL d’archives sont très variées, et le schéma peut être différent pour chaque type d’archive…
Avec l’option “custom…”, les possibilités deviennent infinies. Vous pouvez faire exactement ce que vous voulez.
Exemple un peu “tordu” de schéma “custom…” pour les archives individuelles, que j’ai utilisé ici :
<$MTEntryCategory dirify="1"$>/<$MTEntryDate format="%Y%m%dT%H%MZ"$>.html
Ce qui donne, par exemple :
cma_cgm_tage/20041115T2359Z.html
(Oui, c’est de l’ISO 8601, je suis un gars un peu bizarre parfois.)
(Et, oui, vous avez bien vu, vous pouvez utiliser des balises MT dans les chemins et noms de fichiers. À vos risques et périls…)
Revenons maintenant à ce qu’il y a dans les templates, les balises…
Les balises “variable”
Les balises “variable” retournent… une variable.
Cela peut-être une variable dite “système”, auquel cas, elle peut être placée n’importe où.
Exemple de variables “système” :
<$MTBlogName$>
: le nom du blogue.<$MTBlogCCLicenseURL$>
: l’URL de la licence Creative Commons choisie pour le blogue.<$MTBlogCommentCount$>
: le nombre de commentaires publiés sur le blogue.<$MTBlogEntryCount$>
: le nombre de billets publiés sur le blogue.- Etc.
Cela peut-être aussi une variable dite “contextuelle”. Elle doit être utilisée dans un contexte particulier. Vous comprendrez mieux ce concept un plus loin, avec les balises “conteneur”.
Exemple de variables “contextuelles” :
<$MTEntryTitle$>
: le titre du billet.<$MTEntryAuthor$>
: le nom de l’auteur du billet.<$MTCommentDate$>
: la date d’un commentaire.<$MTEntryCommentCoun$>
: le nombre de commentaires du billet.- Etc.
Formatage des balises “variable”
Différents filtres peuvent être appliqués au résultat affiché par une balise “variable”. Tout passer en capitales, ou en minuscules, enlever les espaces, les balises HTML, ou encore les retours à la ligne, etc.
<$MTEntryTitle lower_case="1" remove_html="1"$>
Les variables “date et heure” (MTEntryDate, MTEntryModifiedDate, MTCommentDate, MTDate, etc.) disposent de règles de formatage particulières.
<MTEntryDate format="%A %e %B %Y - %k heures %M">
samedi 29 juillet 2006 - 9 heures 05
Vous pouvez régler la langue utilisée pour le nom des jours dans “Settings/Default Weblog Display Settings”.
Les balises “conteneur”
Elle sont doubles, à l’image du HTML, avec une balise “ouvrante” <MTBalise>
, suivie plus loin d’une balise “fermante” </MTBalise>
. N’oubliez pas la fermante, sinon, le parseur rendra son tablier…
Leur fonctionnement est essentiel à comprendre, ce sont elles qui définissent le fameux contexte évoqué précédemment pour les balises “variable”. C’est la principale difficulté pour un néophyte. Une fois que vous avez bien compris, vous êtes prêt à bâtir n’importe quel template.
Les balises “conteneur” définissent généralement une boucle d’itération. La plus essentielle est la balise <MTEntry>
Un exemple vaut mieux que de longs discours :
<ol>
<MTEntry>
<li><$MTEntryTitle$></li>
</MTEntry>
</ol>
Cette boucle toute simple (et d’une utilité discutable…) va demander à Movable Type d’examiner tous les billets de la base de données, l’un après l’autre (dans l’ordre où ils apparaissent dans la base données, puisqu’on ne lui a rien précisé de particulier). À chaque “tour de la boucle”, on écrira le titre du billet rencontré (MTEntryTitle). La boucle s’achèvera au dernier billet enregistré dans la base de données. Vous voilà donc devant une liste de tous les titres des billets de votre blogue.
Vous devinez alors pourquoi <$MTEntryTitle$>
a été qualifiée de balise “contextuelle”, elle ne peut être utilisée qu’à l’intérieur d’une boucle <MTEntry>
et son résultat sera différent à chaque itération dans la boucle.
Soyons plus directement opérationnel. Vous souhaitez mettre une liste des liens vers vos 12 derniers billets sur votre page d’accueil, du plus récent au plus vieux, sous le titre “Mes dernières œuvres…”. Cela donnera, par exemple, le code suivant :
<h3>Mes dernières œuvres...</h3>
<p>Découvrez mes derniers textes, qu'ils sont trop bons :</p>
<ul>
<MTEntries sort_order="descend" lastn="12">
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a>
</li>
</MTEntries>
</ul>
Vous comprenez ? Oui, c’est simple, c’est la magie des templates.
Dans cet exemple, vous avez vu apparaître des paramètres sur la boucle <MTEntry>
: “sort_order” qui va demander un classement du plus récent au plus ancien, et “lastn” qui va spécifier le nombre d’entrées souhaité. <MTEntry>
dispose ainsi de plusieurs paramètres optionnels qui permettent de faire des choses très fines.
- author : pour limiter à un auteur particulier.
- category : pour avoir les billets d’une catégorie (ou plusieurs) spécifiée.
- days : billets depuis un nombre de jours spécifié.
- lastn : les N derniers billets.
- offset : à utiliser avec lastn. Si vous voulez les 5 derniers billets sans compter les deux derniers (soit du 3e au 7e), vous écrirez [lastn=”5” offset=”2”].
- recently_commented_on : si vous voulez les 9 derniers billets commentés, vous ferez [recently_commented_on=”9”].
- sort_by : pour classer les billets sur un champ particulier de l’entrée, par exemple [sort_by=”title”] pour une liste alphabétique sur le titre.
- sort_order : sens de classement, par défaut “descend”. Pour un ordre inverse, “ascend”.
Vous voulez une liste de vos 5 dernières recettes de cuisine, publiées dans votre catégorie “Aux fourneaux”. Rien de plus simple :
<h3>Mes dernières recettes de cuisine</h3>
<ul>
<MTEntries sort_order="descend" lastn="5" category="Aux fourneaux">
<li>
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a>
</li>
</MTEntries>
</ul>
Les autres balises “conteneur” sont, entre autres, MTComments, pour lister des commentaires, MTCategories pour lister des catégories, MTArchiveList, pour lister des archives, etc. Je ne peux pas entrer dans le détail pour chacun de ces conteneurs, ce billet serait beaucoup trop long. Mais la logique de fonctionnement est la même.
Les balises “conditionnelles”
Il s’agit de boucles conditionnelles du type classique en programmation IF/THEN, avec, facultativement, ELSE. Si une condition est remplie, ce qui est à l’intérieur de la boucle est exécuté. Le ELSE facultatif correspond à “si la condition n’est pas remplie”.
Il y en a beaucoup : MTIfNonEmpty, MTIfNonZero, MTIfCommentsAccepted, MTIfCommentsActive, MTIfAllowCommentHTML, MTIfCommentsModerated, MTEntryIfAllowPings, MTEntryIfExtended, MTIfPingsAccepted, MTBlogIfCCLicense etc.
Exemple :
<MTEntryIfExtended>
<p><a href="<$MTEntryPermalink$>#more">Lire la suite...</a></p>
<MTElse>
<p>C'est la fin du billet !</p>
</MTElse>
</MTEntryIfExtended>
Contexte implicite
Movable Type sait parfois ce qu’il doit lister de manière implicite en fonction du contexte. Ainsi, une boucle <MTEntry>
fera référence à tous les billets du blogue sur une page d’accueil (sur tout template “indexes”, voir plus haut). Si vous l’utilisez sur un template de page d’archive par catégorie, <MTEntry>
ne listera que les entrées de la catégorie concernée, si vous l’utilisez sur un template d’archive par mois, <MTEntry>
ne listera que les entrées du mois concerné. Il n’y a pas besoin de lui préciser.
Plugins
Movable Type dispose de beaucoup de plugins réalisés par des développeurs tiers. La plupart de ces plugins consistent à offrir de nouvelles balises.
Par exemple, le vieux MTSwitch (qui fonctionne encore sous MT 3.31), qui offre un SWITCH/CASE bien pratique.
Exemple farfelu sur le nom du commentateur :
<MTSwitch value="[MTCommentName]">
<MTSwCase value="Eolas">Eolas, président !</MTSwCase>
<MTSwCase value="Loic">Vive les bretons.</MTSwCase>
<MTSwCase value="Olivier">Mon dictateur préféré.</MTSwCase>
</MTSwitch>
Ou encore, DateTags, qui vous permettra de faire :
Ça fait <$MTDeltaDays target="1/20/2001"$> jours
que nous supportons George W. Bush à la présidence des États-Unis.
Des plugins comme ça, il y en a des centaines, le plus dur est de trouver celui qui correspond à votre besoin.
Conclusion
Si vous n’êtes pas satisfait de gabarits prêts à l’emploi, si vous n’êtes pas un programmeur PHP, mais que vous connaissez cependant bien HTML, si la lecture de ce billet ne vous a pas paru trop pénible, si vous avez de réelles exigences de personnalisation, vous devriez envisager l’option Movable Type, au cas où vous ne l’utiliseriez pas déjà. C’est une solution particulièrement élégante et puissante.
Dédicace
Ce billet est dédié à Pep, il comprendra pourquoi.
Le prochain billet vous montrera la construction d’un template complet.
Gru
Tu exauces mes souhaits. A la rentrée je teste ça!
Thierry Bélanger Clermont
Merci pour ce billet. je vais tester dans les prochaines semaines.
Pep
Soit je suis parano, soit tu es machiavélique : En fournissant ces tutos, qui facilitent la compréhension et prise en main de MT, tu tentes d’influencer les testeurs.
C’est honteux ! ;-)
Jchris
En lisant avec beaucoup d’intérêt ce que font les balises de MT, je me dis que celles du “vieux” pMachine n’ont pas à rougir…! Sur feu Macdigit nous utilisions ExpressionEngine qui est également un superbe concentré de puissance… Bref, je regarde désormais MT d’un autre oeil… Beau billet.
cedric
Bon, puisque tu rales dans ton journal de bord, un petit commentaire ici (qui sert à rien) pour pas que t’es l’impression d’avoir écrit ca pour rien…
Lili
J’apprends donc que tu es la Kozlika de MT ;)
Laurent
Mouarf :-)
bobig
parfait ! ces posts vont être une belle source d’inspiration pour mon futur blog.
alohabobo
j’aime le “sans recours à la programmation de scripts” du début ;-) si c’est pas de la programmation ce que je viens de lire (balises conditionnelles, variables, etc …)
MiKE
Dotclear 2 a également un système assez intéressant de gestion de template et me parait plus…abordable ! Qu’en penses tu ?
Laurent
Plus abordable, je ne sais pas, mais, j’en pense que du bien.
Maxx
je me pose la question de l’utilisation de plusieurs blogues (?) pour réaliser Embruns, comme tu l’indiques vers le début de l’article (au moment d’aborder les templates). d’autant que Carnet Web + Journal de bord sont affichés sur la même interface. n’y avait-il pas moyen d’utiliser uniquement les catégories pour arriver à ce résultat ?
Laurent
On pourrait s’en sortir aussi avec des catégories. Pour ma part, il y a aussi des raisons historiques et le résultat de décisions successives dans l’orientation de mon site Web. “Journal de bord” ne devait être qu’un “link-log” au départ… Puis, il a engrangé les archives de Navire.net. Etc.
Pierre Abruzzini
Merci Ô Capitaine des mers embrumées des balises MT…
Ce tuto me fût bien utile… reste du boulot mais c’est en bonne voie.
Cyrille
Bonjour, je tente un transfert de mes blogs hébergés sur Typepad vers une solution Movable Type 3.33. Je voudrais conserver le formatage des notes Typepad pour ne pas casser mes liens permanents (et sauvegarder mon réferencement…). Il me semble que Movable Type utilisait le même format que Typepad jusqu’à une version récente. Je n’arrive pas à trouver de la doc sur le sujet. Le but de la manoeuvre étant d’en enlever les caractères “spéciaux” et accentués et limiter à 15 caractères le titre obtenu. Je ne veux pas forcement que les nouveaux billets utilisent le format “Typepad”. As-tu une piste ?
Jean Lançon
Honte à moi. 13 ans d’Internet et pas foutu de faire fonctionner MovableType sur mon dédié :(
Blah ?