Mon premier plugin dans lodel

Nous souhaitons afficher la météo d’une ville choisie, dans l’interface administrateur de notre site lodel bacasable. Un plugin est tout à fait adapté pour réaliser cette nouvelle fonctionnalité. Nous l’appellerons meteo.

Pour démarrer

Un coup d’œil dans la documentation lodel : http://www.lodel.org/wiki/index.php/Plugins

Premiers pas

Les fichiers de base seront situés dans le répertoire  share/plugins/custom/meteo

  • fichier config.xml : au départ, seul le trigger postview est configuré, il permet d’intercepter l’affichage de la page en intégrant l’ajout de la ligne Météo dans la liste des Outils sur la page d’administration du site (onglet Administration).
    NB : nous ajoutons dès à présent le trigger preview, même si nous ne l’utilisons pas tout de suite (voir le paragraphe Remarques ci-dessous)
<?xml version="1.0" encoding="utf-8" ?>
<LodelPlugin>
 <title>Meteo</title>
 <description>Affichage de la météo</description>
 <sql>0</sql>
 <hookType>class</hookType>
 <triggers>preview,postview</triggers>
 <parameters>
 </parameters>
</LodelPlugin>
  • fichier meteo.php : il contient la définition de la classe meteo, elle-même extension de la classe plugins. Pour ajouter la fonctionnalité Météo dans la liste des actions possibles, il suffit de modifier, avant l’affichage de la page, la liste des fonctionnalités disponibles en ajoutant l’item Météo après l’item Plugins. Météo pointe sur un lien du type ?do=_meteo_list, ce que lodel interprétera comme un appel à la fonction list du plugin meteo.
<?php
class meteo extends Plugins
{
public function enableAction(&$context, &$error) {}

public function disableAction(&$context, &$error) {}

public function preview(&$context) {}

public function postview (&$context)
 {
 if(!defined('backoffice-admin') || C::get('do') || C::get('lo')
    || ($context['view']['tpl'] != 'index')) return;
 if(!parent::_checkRights(LEVEL_REDACTOR)) { return; }       
 View::$page = preg_replace('/(Plugins<\/a><\/li>)/',
    '\\1<li><a href="./?do=_meteo_list">Météo</a></li>', View::$page);
 }

public function listAction (&$context, &$error)
 {
 echo "La météo du jour" ;
 return "_ajax" ;  
 }
}
?>
  • il faut maintenant activer ce plugins meteo au niveau de l’installation générale de lodel : le menu Configuration / Plugins permet d’activer le plugin meteo pour tous les sites (ne pas confondre avec installer sur tous les sites). Il faudra ensuite l’activer au niveau du site lodel bacasable (menu Administration / Outils / Plugins).
    En rechargeant la page d’administration du site, nous voyons bien apparaître l’item Météo sous le terme Plugins : un clic et La météo du jour s’affiche bien dans l’interface.

Le plus dur est fait, il faut maintenant adapter les scripts et permettre l’affichage personnalisé dans un iframe.

Mise en forme à l’aide d’un template

  • nous allons associer à ce plugin un template contenant des lignes au format html, il sera situé dans le sous-répertoire tpl du plugin. Appelons-le meteotpl.html (dans share/plugins/custom/meteo/tpl).
    <html>
     <head>
     <CONTENT VERSION="1.0" LANG="fr" CHARSET="utf-8"/>    
     <TITLE>La météo</TITLE>
     </head>
     <body>
     <h1>La météo du jour</h1>
     </body>
    </html>
  • la méthode preview doit être modifiée pour associer ce template meteotpl à la classe meteo
    public function preview (&$context)
    {
    // vérification que l'on est positionné ni dans l'interface d'administration
    // ni dans le template d'affichage de la météo
    if(!defined('backoffice-admin') || $context['view']['tpl'] != 'meteotpl') return;
    // ajout du fichier de template dans la classe qui gère le contexte    
    C::set('view.base_rep.meteotpl', 'meteo');    
    }
  • la fonction listAction du script meteo.php doit faire appel à ce template meteotpl
    public function listAction (&$context, &$error)
     {
     View::getView()->renderCached('meteotpl') ;
     return "_ajax" ;  
     }
    }
  • vider le cache et recharger la page : le titre est maintenant mis en forme
  • et maintenant, pour terminer, affichage de l’url http://france.meteofrance.com/ dans un iframe : il suffit de modifier le contenu de la balise body dans le fichier template meteotpl.html
    <html>
     <head>
     <CONTENT VERSION="1.0" LANG="fr" CHARSET="utf-8"/>
     <TITLE>La météo</TITLE>
     </head>
     <body>
     <iframe name="stats" SRC="http://france.meteofrance.com/" scrolling="yes"
      height="100%" width="100%" FRAMEBORDER="no"></iframe>
     </body>
    </html>

Encore plus loin : ajout de paramètres

Nous souhaitons paramétrer les prévisions en fonction de notre ville de résidence. Tout ceci, uniquement dans l’interface d’administration, sans modification des scripts.
Par exemple, pour Marseille, l’url est de la forme

http://france.meteofrance.com/france/meteo?PREVISIONS_PORTLET.path=previsionsville/130550

Comme nous modifions en profondeur  les caractéristiques du plugin, il faut détruire le plugin dans la table plugins du site bacasable et dans la table mainplugins de l’installation générale.

  • modification du fichier config.xml : ajout d’un paramètre ville (par défaut le code correspond à la ville de Marseille)
    <?xml version="1.0" encoding="utf-8" ?>
    <LodelPlugin>
     <title>Meteo</title>
     <description>Affichage de la météo</description>
     <sql>0</sql>
     <hookType>class</hookType>
     <triggers>preview,postview</triggers>
     <parameters>
     <param name="ville" title="Ville" type="text" defaultValue="130550" allowedValues="" required="true"/>
     </parameters>
    </LodelPlugin>
  • activation du plugin au niveau de l’installation générale et au niveau du site bacasable
  • modification de la méthode preview pour récupérer la valeur du paramètre ville : il est stocké dans l’attribut _config de l’objet. L’url est construite en tenant compte de cette valeur, elle est stockée dans le contexte C.
    public function preview (&$context)
    {
    if(!defined('backoffice-admin') || $context['view']['tpl'] != 'meteotpl') return;
    C::set('view.base_rep.meteotpl', 'meteo');    
    $ville = $this->_config['ville']['value'] ;
    C::set('urlmeteo', "http://france.meteofrance.com/france/meteo?PREVISIONS_PORTLET.path=previsionsville/".$ville) ;
    }
  • modification du template pour intégrer la variable urlmeteo en faisant appel à la variable lodelscript associée [#URLMETEO]
    <html>
     <head>
     <CONTENT VERSION="1.0" LANG="fr" CHARSET="utf-8"/>    
     <TITLE>La météo</TITLE>
     </head>
     <body>
     <iframe name="stats" SRC="[#URLMETEO]" scrolling="yes" height="100%" width="100%" FRAMEBORDER="no"></iframe>
     </body>
    </html>
  • exécution !
    • sur la page http://france.meteofrance.com/, nous indiquons la ville qui nous concerne et repérons son identifiant numérique (formulaire Rechercher), par exemple 212310 pour Dijon
    • dans l’interface d’administration du site bacasable, nous sélectionnons le menu Plugins / Configurer correspondant au plugin meteo et nous indiquons la valeur 212310
    • le lien bacasable/lodel/admin/?do=_meteo_list correspondant à l’item Météo affiche bien la météo de la ville de Dijon.

Remarques et astuces

  • activation du plugin uniquement par l’administrateur lodel
public function enableAction(&$context, &$error)
     {
     if(!parent::_checkRights(LEVEL_ADMINLODEL)) { return; }
     }
  • en cas de modification importante du plugin, ajout de trigger par exemple, il faut le détruire directement dans la table mainplugins du serveur lodel et dans la table plugins du site.
  • en cas d’erreur, vider manuellement le cache : CACHE/triggers

Migration 0.7 – 0.9 : points pratiques

Hier, nous avons installé Lodel 0.9. Aujourd’hui, le programme est plus compliqué : migrer des sites en 0.7 vers des sites en 0.9. Toujours avec l’aide du développeur de Lodel, ce qui accélère grandement les choses.
Les structures sont différentes entre la version 0.7 et 0.8 : par exemple, l’identifiant est unique en 0.8 et représentent un objet. En 0.7, le français est la langue de base, en 0.8, c’est l’anglais. Tout ceci nécessite quelques adaptations, qui seront rendues plus faciles grâce aux scripts de migration fournis, mais il est indispensable de bien connaître le modèle éditorial (ME) de l’ancienne version et le modèle éditorial pour la nouvelle version : c’est pourquoi, il est conseillé de faire en amont un travail complet de définition du modèle éditorial pour limiter les adaptations pour chaque site du paquet de sites à migrer. Les évolutions futures du modèle seront ensuite plus facile à mettre en oeuvre. En pratique, il est conseillé de définir un ME propre sur un site vide, de l’exporter au format XML dans le répertoire définit à l’installation de lodel et d’importer ce ME à l’étape d’import XML après la migration.

Au niveau des données

Il faut d’abord effectuer dans l’interface d’administration du site à migrer (0.7) un export des données. Ces données sont ensuite importées dans un lodel 0.7 utilisé uniquement pour la migration.
Le script va casser la base de données, il donc indispensable de travailler sur une copie du site en production pour que le site en production reste accessible. Après le passage de ce script, la base peut fonctionner en 0.8. Le script n’efface pas les données, les tables originelles sont copiées dans des tables nommées nom-table_old.

Migration

Tout ce qui est relatif au modèle éditorial porte pour l’exemple sur celui de Revues.org.

Copier le script https://sourcesup.cru.fr/scm/viewvc.php/*checkout*/branches/version_0_7-bugfixes-branch/export_to_08.php?root=lodel à la racine du site en 0.7 (par exemple dans le répertoire mondomaine/monsite07). Copier également le script https://sourcesup.cru.fr/scm/viewvc.php/*checkout*/branches/version_0_7-bugfixes-branch/lodel/scripts/07to08.php?root=lodel dans le répertoire lodel/scripts (mondomaine/monsite07/lodel/scripts).

Prêt? Alors lancez http://mondomaine/monsite07/export_to_08.php

A priori, il n’y a pas besoin de modifier les champs g_title et g_name, donc laisser la valeur par défaut. Le troisième champ sert à déplacer les documents annexes et les sources, on les déplacera manuellement dans une étape ultérieure. En résumé, on décoche tout.

La base de données est maintenant prête à être utilisée en 0.9. Il faut donc faire un dump de celle-ci, et l’importer dans un site en 0.9.

Nous pouvons maintenant effectuer la mise à jour du modèle éditorial via l’import XML.

Il va falloir indiquer à lodel comment se correspondent les champs entre les deux versions : l’ancien modèle éditorial est présenté à gauche, le nouveau est à droite.

Si le ME a été transformé par rapport au modèle par défaut, ne pas indiquer de correspondance et laisser le champ vide (dans la colonne nouveau ME), lodel ajoutera le champ.

Les classes du ME correspondent à des tables de la base de données. Chaque champ doit être compris dans un groupe de champs.

En 0.8, la classe documents est transformée en classe textes.

  • étape 1 : mise à jour des groupes de champs
  • étape 2 : mise à jour des classes. la classe documents n’a pas d’équivalent dans le ME et devient textes.
  • étape 3 : mise à jour des champs
  • étape 4 : conversion des types
    • plan = information
    • chercheur = individu
    • volume = rubrique
    • colloque = rubrique
    • regroupement = souspartie
    • docannexe-lienfichier = fichierannexe
    • docannexe* = lienannexe
    • breve = billet
    • presentation = information
    • regroupement-documentsannexes : pas d’équivalent
    • articlevide = article
    • objetdelarecension : pas d’équivalent
    • motcle = motclesfr
    • periode = chrono
  • étape 5 :
    Si jamais vous recevez comme nous l’erreur “unknown column mask”, pas de souci, une petite modif de table dans mysql : alter table tablefields_oldME add mask text not null
  • étape 6 : on y est presque, il s’agit de faire la concordance pour les textes simples
    • lien = url
    • datepubli = date

La mise à jour du ME est presque terminée. On peaufine en lançant un dernier script complete.php qui est une compilation des scripts disponibles sur http://www.lodel.org/wiki/index.php/Migration_Lodel_0.7_vers_Lodel_0.8.

Il reste encore à transférer à la main les documents annexes et les fichiers sources (on l’avait laissé à faire pour plus tard…) : il faut copier en respectant les permissions sur les répertoires (donc utiliser les options p et r pour la commande cp). Donc, copier le répertoire docannexe de l’ancien site vers le nouveau site, ainsi que le répertoire lodel/sources. En 0.9, puisque la langue de base est l’anglais, docannexe contient un sous-répertoire file, ne pas renommer la copie du répertoire fichier du site en 0.7 : les répertoires file et fichier cohabiteront sans problème dans le répertoire docannexe et assureront la continuité dans le nommage des documents annexes.

Une dernière question sur l’indexation pour terminer la matinée…

Pour activer le moteur de recherche interne, il faut affecter la variable searchEngine à true dans le fichier lodelconfig.php global. Pour autoriser l’indexation d’un site, dans l’interface d’administration, cliquer sur le lien reconstruire l’index. Puis, après la création ou la mise à jour d’une entité, l’indexation automatique sera lancée .

Installation de Lodel 0.9 : points pratiques

Tout utilisateur rêve de pouvoir installer un logiciel en étant guidé pas à pas par son développeur : j’ai eu ce privilège au cours d’une formation donnée par la Cléo à des membres de l’EHESS, étape préalable à la migration de leurs sites lodel 0.7 en lodel 0.9 . Voici quelques notes, les explications données sont claires dans le déroulement de l’installation mais il y a toujours des petits bonus à glaner.

SourceSup

Lodel est un logiciel libre disponible sur SourceSup : http://sourcesup.cru.fr/ . Lodel est en bonne position dans les logiciels les plus téléchargés, donc on le trouve facilement à partir de la page d’accueil.

Il est conseillé de créer un compte pour pouvoir rapporter des problèmes (onglet Tickets / Bugs) et formuler des demandes (onglet Tickets / Feature Requests).

Au passage, s’abonner à la liste lodel-users@cru.fr (onglet Listes).

Installation

Il est conseillé d’installer à partir d’une version stable dans sourcesup. On peut aussi télécharger une version de développement (onglet Subversion), il faudra alors ajouter soi-même des liens symboliques sur 3 répertoires :

* mkdir monlodel
* cd monlodel
* svn  co  http://subversion.cru.fr/lodel/branches/version_0_9-bugfixes-branch/ . (j'oublie souvent le .)
* ln  -s  lodeladmin  lodeladmin-0.9
* ln  -s  share  share-0.9
* ln  -s  lodel  lodel-0.9

Passer dans l’interface web pour paramétrer le site global : http://monsite.fr/monlodel/lodeladmin

  • dans les premières étapes, j’ai noté qu’il faut sélectionner (comme dans le type d’installation qui sera faite à l’EHESS, plusieurs labos), l’installation multi-sites. Les droits sur les répertoires CACHE et lodeladmin/CACHE doivent être donnés à l’utilisateur Apache dont le nom dépend du système, en général www-data : chown  www-data  <nom_repertoire>
    Il n’y a qu’un type d’installation, l’installation par défaut. Pour avoir une autre possibilité, il aurait fallu placer au préalable, dans le répertoire lodel/install/plateform, un fichier de configuration adapté du fichier par défaut.
  • base de données : le serveur est localhost en général. La base générale lodel_base devra avoir été créée au préalable par l’administrateur directement sur le serveur. Pour un serveur dédié, il est inutile de mettre un préfixe aux bases (chez un hébergeur privé, le préfixe permet de ne pas avoir de conflit dans le nom des bases).
    Le script d’installation vérifie ensuite les droits et installe ses propres tables dans lodel_base.
  • créer un administrateur général du site lodel.
  • au fil de l’install :
    • le chemin est détecté automatiquement : ne pas le modifier à priori
    • pour les droits : ne pas laisser le droit en écriture pour le groupe et ne laisser aucun droit pour “les autres”
    • les fonctions d’archivages dépendent du serveur : Pclzip livré par défaut fonctionne bien mais est plus lent que zip et unzip. Indiquer en général zip et unzip sans oublier de cocher cette option.
    • l’url est l’endroit où va être accessible lodel, le chemin d’accès à lodeladmin, mais pas aux sites. Pour avoir un accès par l’url dans le navigateur, il faudra créer un lien symbolique vers lodeladmin.
    • l’extension des scripts dépend de la configuration du serveur web : en général choisir php.
    • utiliser plutôt des liens symboliques qui faciliteront les mises à jour des scripts lodel lorsqu’on a beaucoup de sites (une mise à jour dans le répertoire de base plutôt que le répertoire de chaque site).
    • le répertoire d’import est utilisé pour stocker les sauvegardes compressées des données et/ou des modèles éditoriaux. Il est conseillé de le créer sur le serveur avant cette étape. Il doit être accessible en lecture/écriture à l’utilisateur web et se trouver si possible à l’extérieur de la racine du serveur web pour ne pas être directement accessible dans le navigateur.
  • le fichier de configuration : il est prêt dans lodeladmin/CACHE. Il faut le copier à la main et le renommer (mv  lodeladmin/CACHE/lodelconfig-cfg.php  lodelconfig.php) et restreindre les droits (chmod  400  lodelconfig.php)

Ajouter un site

  • utiliser l’interface lodeladmin : http://monsite.fr/monlodel/lodeladmin pour accéder à l’action Gérer les sites . Puis au lien Ajouter un site . Notez qu’en haut à droite est affiché le tableau de bord avec l’utilisateur connecté.
  • dans les paramètres du site : le titre est libre, le nom du site web ne doit comporter que des caractères simples, par exemple monsite. Dans le cas d’une installation multi-sites, ne pas cocher l’option Installer le site web à la racine du site. L’url du site est à préciser si le site du labo n’est pas un sous-site du site global. Par exemple marevue.revues.org (il faut que les modifications aient été faites auparavant au niveau du DNS). Le sous-titre est facultatif.
  • base de données : copier le code de création de la base, passer sous mysql en ligne de commande et coller le code (attention, il y a deux commandes CREATE et GRANT). Quitter mysql.
  • créer le répertoire web pour le site : à la racine de lodel, dans le répertoire monlodel (mkdir  monsite) et donner les droits à l’utilisateur web (chown  www-data  monsite).
  • création de l’arborescence lodel pour le site : cliquer sur le bouton Copie des fichiers (“on sécurisera après…”).
  • importation du modèle éditorial : si on souhaite utiliser un modèle générique pour tous les sites, il faut le copier auparavant dans le répertoire d’import défini ci-dessus.
  • sécurisation : lodel doit pouvoir écrire dans les répertoires CACHE docannexe et lodel/sources (documents convertis) . Et sinon : chmod  555  monsite

Et enfin

  • on peut connecter Lodel à un annuaire LDAP, ce n’est pas fait en natif, à suivre…
  • de nouvelles fonctionnalités peuvent être ajoutées avec des plugins
  • ServOO permet convertir des documents au format DOC, RTF, SXW et de les incorporer dans lodel : les informations sur le serveur servOO peuvent être ajoutées dans la configuration du site ou de manière globale dans le fichier de configuration de lodel lodelconfig.php . Lodel fera appel à l’un ou à l’autre selon leur disponibilité.
$servoourl="http://servoo1.revues.org";
$servoousername="user1_servoo";
$servoopasswd="abcdef";

S’il y a plusieurs servoo, on recopie ce bloc en incrémentant le nom des variables :

$servoourl2="http://servoo2.revues.org";
$servoousername2="user2_servoo";
$servoopasswd2="ab45ef";

L’installation de Servoo est compliquée : il utiliser Xfvb qui est un simulateur d’interface graphique et installer vnc. La machine qui héberge doit avoir de bonnes capacités mémoire et un processeur performant.
Pas de mise à jour à faire, simplement des redémarrages fréquents.

Une architecture de travail idéale : l’exemple de revues.org

Nous disposons de trois espaces, sur trois serveurs différents. Les versions (maquettes et lodel) sont gérées sous SVN :

  • espace de développement DEV (fichiers svn de type branche) : modifications principalement sur les maquettes (fichiers css et php des templates)
  • espace de travail EDT (fichiers svn de type trunk) : espace accessible aux revues avant la mise en production (protection par fichier htaccess)
  • espace de production PROD (fichiers svn de type tags) : modification des contenus par les revues.

Des miroirs sont en place ainsi que des backups pendant la journée et des sauvegardes sur bande pendant la nuit.