• Webmestre
  • , modifié le 

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}.

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

ChampType d’objetSyntaxe 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.