“Miscellanées”

movable type

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

Schéma 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 :

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 :

Exemple sur mon blogue “Carnet Web” (celui où est publié ce billet) :

Embruns: Index Templates.

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 :

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.

Embruns: Publishing-pref.

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…

Movable Type File Paths.

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” :

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” :

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.

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.

1. Le 30 juillet 2006,
Gru

Tu exauces mes souhaits. A la rentrée je teste ça!

2. Le 30 juillet 2006,
Thierry Bélanger Clermont

Merci pour ce billet. je vais tester dans les prochaines semaines.

3. Le 30 juillet 2006,
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 ! ;-)

4. Le 30 juillet 2006,
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.

5. Le 30 juillet 2006,
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…

6. Le 31 juillet 2006,
Lili

J’apprends donc que tu es la Kozlika de MT ;)

7. Le 31 juillet 2006,
Laurent

Mouarf :-)

8. Le 1 août 2006,
bobig

parfait ! ces posts vont être une belle source d’inspiration pour mon futur blog.

9. Le 3 août 2006,
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 …)

10. Le 3 août 2006,
MiKE

Dotclear 2 a également un système assez intéressant de gestion de template et me parait plus…abordable ! Qu’en penses tu ?

11. Le 3 août 2006,
Laurent

Plus abordable, je ne sais pas, mais, j’en pense que du bien.

12. Le 4 août 2006,
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 ?

13. Le 4 août 2006,
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.

14. Le 30 août 2006,
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.

15. Le 29 septembre 2006,
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 ?

16. Le 15 avril 2007,
Jean Lançon

Honte à moi. 13 ans d’Internet et pas foutu de faire fonctionner MovableType sur mon dédié :(

Blah ?