Un peu d’architecture
Pour comprendre comment créer un nouveau modèle de lettre d’actualités, il n’est pas inutile de comprendre comment fonctionne la création et la diffusion de la lettre. Derrière le scénario utilisateur de création, les mécanismes suivants sont mis en œuvre :
Sans entrer dans trop de détail, le schéma ci-dessus explique que la définition du contenu de la lettre (étape 1) se traduit par la génération d’un fichier qui contient les données devant figurer dans la lettre, mais en aucun cas la mise en page de ces données.
C’est à l’étape 2 que l’utilisateur choisi le modèle de lettre, sur la base de ceux qui sont listés dans le fichier templates.yaml. Ce choix de modèle détermine le squelette SPIP qui va être utilisé, et qui, combiné aux données de la lettre, permettra d’obtenir le rendu HTML qui sera envoyé aux abonnés.
La suite de l’article se focalise sur la manière de retrouver dans le squelette (le modèle de lettre) les données enregistrées dans le fichier descriptif de la lettre. Pour plus d’information sur la structure générale des squelettes SPIP on se reportera à la documentation des boucles et balises.
Les données de description de la lettre
Pour accéder aux données de la lettre, on insèrera les lignes suivantes au début du squelette (typiquement dans la section <head> :
[(#SET{textes,#LISTE{sujet,tedito,imgedito,edito,tart,tbrv,tcmp,tesp,tlieu,tobs}})]
[(#SET{tableaux,#LISTE{art,brv,cmp,esp,lieu,obs}})]
[(#SET{actu,[(#ENV{id}|actualites{#GET{textes},#GET{tableaux}})]})]
La séquence ci-dessus permet de renseigner la variable actu avec un tableau associatif. Ce tableau met en regard les noms des champs du formulaire de création et les valeurs associées. La correspondance est donnée ci-dessous. Dans le squelette de lettre, on peut accéder au contenu de ces variables par la syntaxe #GET{actu/nom-de-champ}.
| Champ | Signification |
|---|---|
| sujet | Sujet du mail envoyé et titre de la lettre |
| tedito | Titre de l’éditorial |
| imgedito | URL absolue de l’image associée à l’éditorial |
| edito | Texte de l’éditorial en notation SPIP |
| tart | Titre de la section des articles rédactionnels |
| tbrv | Titre de la section des brèves |
| tcmp | Titre de la section des campagnes d’observation |
| tesp | Titre de la section des espèces |
| tlieu | Titre de la section des lieux |
| tobs | Titre de la section des observations |
D’autres champs ne contiennent pas directement de valeurs, mais plutôt des listes d’identifiants, et s’utilisent au sein des boucles SPIP :
| Champ | Type d’objet | Syntaxe de boucle |
|---|---|---|
| art | article rédactionnel | <BOUCLE_a(ARTICLES) {composition=redaction} {id_article IN #GET{actu/art}}> |
| brv | brève | <BOUCLE_b(BREVES) {id_breve IN #GET{actu/brv}}> |
| cmp | campagne d’observation | <BOUCLE_c(BIODIV_CAMPAGNES) {id_campagne IN #GET{actu/cmp}}> |
| esp | fiche espèce | <BOUCLE_e(ARTICLES) {composition=espece} {id_article IN #GET{actu/esp}}> |
| lieu | fiche lieu | <BOUCLE_x(ARTICLES) {composition=lieu} {id_article IN #GET{actu/lieu}}> |
| obs | observation | <BOUCLE_o(BIODIV_OBSERVATIONS) {id_observation IN #GET{actu/obs}}> |
Les autres données
Comme tout squelette, une lettre d’information peut accéder aux balises générales du site. Toutefois, il est recommandé de ne pas utiliser les balises #FORMULAIRE_....
Vous pouvez également accéder aux variables de configuration des plugins.
Un exemple
Le source HTML ci dessous donne un exemple simplissime d’un squelette de lettre. Pour des raisons de lisibilité, l’exemple ne comporte aucun élément de style : vous devrez les ajouter selon votre charte graphique.
#CACHE{0}<!DOCTYPE html>
<html>
<head>
[(#SET{textes,#LISTE{sujet,tedito,imgedito,edito,tart,tbrv,tcmp,tesp,tlieu,tobs}})]
[(#SET{tableaux,#LISTE{art,brv,cmp,esp,lieu,obs}})]
[(#SET{actu,[(#ENV{id}|actualites{#GET{textes},#GET{tableaux}})]})]
<title>#GET{actu/sujet}</title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
</head>
<body>
<h1>#GET{actu/sujet}</h1>
[(#REM) Afficher l'éditorial avec l'image et le titre
si le contenu fait plus de 5 caractères.
]
<BOUCLE_edi(CONDITION) {si #GET{actu/edito}|strlen|>{5} }>
<h2>[(#GET{actu/tedito})]</h2>
<img src="[(#GET{actu/imgedito})]"/>
<div>
[(#REM) Afficher le contenu du texte
- en interprétant les raccourcis typographiques de SPIP
- en contraignant les images à entrer dans un rectangle de 620 par 300,
- en transformant les liens internes à SPIP en liens absolus
- en forçant tous les liens à s'ouvrir dans une nouvelle fenêtre
]
[(#GET{actu/edito}|propre|image_reduire{620,300}|liens_absolus|liens_ouvrants)]
</div>
</BOUCLE_edi>
[(#REM) Afficher la section des articles s'il y a au moins une référence]
<B_a>
<h2>[(#GET{actu/tart})]</h2>
<BOUCLE_a(ARTICLES) {composition=redaction} {id_article IN #GET{actu/art}}>
<div>
[(#REM) Afficher le logo de l'article réduit à 256x256, quand il existe ]
[<img src="(#LOGO_ARTICLE||image_reduire{256,256}|extraire_attribut{src}|url_absolue)"/>]
<p><strong>#TITRE</strong> - #DATE</p>
<a href="[(#URL_ARTICLE|url_absolue)]">Lire ...</a>
</div>
</BOUCLE_a>
<footer>
<p>Une lettre d'actualités de <a href="#URL_SITE_SPIP">#NOM_SITE_SPIP</a>.
Disponible <a href="[(#SELF|url_absolue)]">directement sur le site</a>.</p>
</footer>
</body>
</html>
Dans cet exemple, seuls l’éditorial et les articles choisis ont été pris en compte. Néanmoins, le même principe s’appliquerait aux autres types d’objets. Cet exemple est distribué avec le plugin Sibactu et peut être retrouvé sous plugins/sibactu/squelettes/exemple_lettre.html. Pour l’activer, vous devez créer une entrée dans le fichier templates.yaml.