Coder un plugin simple avec cfg

Tutoriel pour faire un plugin simple configuré avec cfg : aa

Le plugin config (cfg) permet de gérer les paramètres de configuration d’un plugin de façon simple. Cet article propose de développer un plugin extra-simple (aa) pour apprendre à utiliser config.

Quelques rappels sur cfg

cfg est un outil pour gérer les paramètres de configuration d’un plugin (ou de n’importe quoi) avec le minimum d’effort :

  • La description des paramètres se fait en créant un unique fichier fonds/xxx.html qui donne le formulaire de gestion des paramètres ainsi que leur description/typage et la configuration du stockage.
  • Stocker les paramètres de configuration dans la table spip_meta mais sans l’alourdir par des dizaines d’entrées (autant que de paramètres) comme c’est le cas actuellement pour beaucoup de plugins. C’est fait en sérialisant la table arborescente de ces parametres.

Le principe est donc que chaque plugin stocke ses paramètres sous forme d’une entrée avec 2 champs : « nom » et « valeur » :

  • nom stocke l’identifiant unique du stockage, pour un plugin, son préfixe est le mieux indiqué.
  • valeur stocke un tableau php (array) contenant des éléments de la forme : « nom_variable_config » => « valeur_de_la_variable ». Ce tableau est enregistré sous sa forme sérialisée par spip, il est récupérable aussi bien dans l’espace public que dans l’espace privé. « valeur_de_la_variable » peut elle-même être un tableau constitué de la même façon, ce qui permet d’obtenir des arborescences de configuration.

Un plugin tutoriel pour utiliser cfg : aa

Pour mieux appréhender le fonctionnement de cfg vu du côté du développeur de plugin, la suite de cet article est construit comme un tutoriel pour réaliser un plugin utilisant cfg.
Ce plugin extra-simple permet de définir quel article afficher dans la page de sommaire. On ajoutera ensuite la possibilité de choisir quels éléments de l’article seront affichables (titre, sous-titre, chapo, texte).
ce plugin, appelons le « aa » pour « article accueil », devra donc permettre :

  • de choisir l’article à utiliser avec une interface simple présentant la liste de tous les articles du site.
  • de stocker dans spip_meta l’id_article choisi ainsi que les éléments affichables
  • de récupérer facilement la valeur de l’id_article dans les squelettes et/ou dans l’espace privé

Première étape : préparer le plugin

Avant de commencer la partie spécifique à cfg, il faut créer le petit nécessaire à tout plugin :

  • un sous-répertoire aa/ dans plugins/
  • un fichier plugins/aa/plugin.xml avec le code qui va bien :
    <plugin>
        <nom> 
            <multi>
               [fr]Article accueil
               [en]Article summary
    	</multi>
        </nom>
        <auteur>
            <multi>
               [fr] cy_altern
    _ &copy; 2007 - Distribué sous licence GNU/LGPL
               [en]cy_altern - distributed under GNU/GPL licence
    	</multi>
        </auteur>
        <version>
              0.1
        </version>
        <etat>
              dev
        </etat>
        <description>
            <multi>
               [fr]Un exemple de plugin pour apprendre ß utiliser cfg
               [en]An example to learn cfg.
            </multi>
        </description>
        <lien>
               [Documentation sur ->http://www.spip-contrib.net/?article1605],
               et si vous avez cfg: [Configuration->.?exec=cfg&amp;cfg=aa]
        </lien>
        <icon>plugin-24.gif</icon>
        <prefix>
              aa
        </prefix>
    </plugin>

    Notez la manière d’internationaliser les textes en les préfixant comme [en], [fr], etc.

Le lien donné pour la configuration sera accessible depuis administration plugin en ouvrant l’onglet aa. Il n’appelle pas un fichier du plugin comme c’est usuel (de la forme ->sousmenu[’aa’] pour appeller  ?exec=aa) mais il renvoie directement sur l’interface de cfg : ->sousmenu[’cfg&cfg=aa’] renvoie sur  ?exec=cfg&cfg=aa.
Cela permet donc de comprendre que ce plugin n’aura pas à créer sa propre interface de configuration puisqu’il bénéficie de celle créée automatiquement par cfg

Voila, cet élément étant créé, il est désormais possible de passer à l’interface de configuration/enregistrement des paramètres du plugin.

Deuxième étape : « brancher » le plugin aa sur cfg

C’est là que les choses deviennent un vrai bonheur :

  • cfg est conçu de telle manière que lorsque l’on appelle  ?exec=cfg&cfg=aa, le fichier exec_cfg (l’interface de cfg) appelle le fichier fonds/cfg_aa.html et inclut automatiquement son contenu dans un formulaire tout préparé. Ce sous-répertoire fonds/ peut être situé dans squelettes/ ou dans le répertoire de n’importe quel plugin, ici donc plugins/aa/fonds/cfg_aa.html
  • la validation de ce formulaire permettra de faire la sérialisation des données du formulaire et le stockage dans spip_meta sans que le developpeur du plugin ait à coder une ligne.
  • enfin, cerise sur le gateau, cfg fonctionne déja de façon squeletisée dans l’espace privé

Conséquence de ces caractéristiques : le fichier /fonds/cfg_aa.html sera codé comme un fichier de squelette (BOUCLEs, #BALISES, filtres sont tous possibles). Ce fichier devra contenir les champs de formulaires (<input>, <select>, <text>...) nécessaires pour définir les paramètres de configuration à stocker : le « name » d’un élément correspond au nom de la variable à stocker, le « value » permettant de définir la valeur de cette variable de configuration.

Pour notre plugin aa, dans un premier temps on ne souhaite stocker qu’une seule valeur : l’id_article de l’article qui servira de page d’accueil. Il faut donc proposer à l’utilisateur une liste à choix unique (un <select>) pour choisir l’article parmi tous ceux existants.
Ce qui donne (en BOUCLEs) :

<select name="id_aa">
    <BOUCLE_articles(ARTICLES){par titre}>
        <option value="#ID_ARTICLE">#ID_ARTICLE . #TITRE</option>
    </BOUCLE_articles>
</select>

Notez les structures qui nous intéressent spécialement :
<select name=« id_aa »> qui permet de définir que l’on souhaite stocker une variable « id_aa », attention name=xxx doit suivre immédiatement <select ou <input type=...
<option value=« #ID_ARTICLE »> qui permet d’envoyer le id_article du <option> sélectionnée comme valeur du paramètre id_aa.

Afin que le choix de l’article soit plus facile, on construit le <select> de façon à ce que les articles soient classés par rubriques de façon arborescente. En pompant le code de /dist/plan.html pour faire l’appel récursif des rubriques, on arive donc à ceci pour cfg_aa.html :

  • tête de fichier : le cache et le formulaire de début de cfg
    #CACHE{0}
    <form method="post">[(#ENV{_cfg_}|form_hidden)]

Facultativement, cfg permet également de construire automatiquement un cadre contenant un descriptif du plugin et de donner un titre (<title> dans le HEAD de la page) :

<!-- descriptif=
<h4>Tutoriel utilisation de cfg</h4>
Ici vous pouvez configurer l'article qui sera affich&eacute; en page sommaire.<br />
<br /><a href="http://extranet-eze.dyndns.org/portail/spip_SVN/spip.php?article112" class="spip_out">Documentation provisoire (&agrave; verser sur contrib ?)</a>
-->
<!-- titre=plugin aa titre -->

Il suffit de respecter la syntaxe < !— descriptif=... ou < !— titre=... et de faire suivre le « = » du texte/code HTML de l’élément.

  • la partie en boucles pour créer le <select> :
    <fieldset><legend><:article:> <:sommaire:></legend>
      <label>Choix de l'article &agrave; utiliser :</label>
      <select name="id_aa">
        <option value="">Racine</option>
        <BOUCLE_secteurs(RUBRIQUES) {racine} {par titre}>
          <option value="">&nbsp;&nbsp;<strong>rubrique : #TITRE</strong></option>
          <BOUCLE_articles_racine(ARTICLES) {id_rubrique} {par titre}>
            <option value="#ID_ARTICLE">&nbsp;&nbsp;&nbsp;&nbsp;#ID_ARTICLE . #TITRE</option>
          </BOUCLE_articles_racine>
          <BOUCLE_rubriques(RUBRIQUES) {id_parent} {par titre}>
            <option value="" style="font-weight: bold;">&nbsp;&nbsp;rubrique #ID_RUBRIQUE : #TITRE</option>
             <BOUCLE_articles(ARTICLES) {id_rubrique} {par titre}>
               <option value="#ID_ARTICLE">&nbsp;&nbsp;&nbsp;&nbsp;#ID_ARTICLE . #TITRE</option>
             </BOUCLE_articles>
       <BOUCLE_sous_rubriques(BOUCLE_rubriques)></BOUCLE_sous_rubriques>
          </BOUCLE_rubriques>
        </BOUCLE_secteurs>
      </select>
    </fieldset>
  • fin du fichier : fin du formulaire de cfg :
    <input type="submit" name="_cfg_ok" value="<:OK:>" />
    <input type="reset" value="<:Reset:>" />
    <input type="submit" name="_cfg_delete" value="<:Supprimer:>" />
    </form>

Et hop ! avec ce simple fichier, le plugin est opérationnel :  ?exec=cfg&cfg=aa donne accès à l’interface de configuration suivante :

Troisième étape : récupérer les données de configuration

Il s’agit donc maintenant de récupérer dans un fichier de squelette la valeur de « id_aa » pour la passer à une boucle ARTICLES qui affichera le contenu de l’aricle sélectionné.
De façon simple cfg crée automatiquement une balise #CONFIG qui permet de récupérer les données de configuration du plugin aa. On peut donc créer la BOUCLE suivante dans le fichier de squelette « sommaire.html » par exemple :

[(#REM) test plugin aa]
<div class="liste-articles">			
  <BOUCLE_truc(ARTICLES){id_article=(#CONFIG{aa/id_aa})}>
    <div class="cartouche">
  	#DEBUT_SURLIGNE
        [(#LOGO_ARTICLE||image_reduire{200,200})],''})]
  	[<h1 class="#EDIT{titre} titre">(#TITRE)</h1>]
  	[<p class="#EDIT{soustitre} soustitre">(#SOUSTITRE)</p>]
  	[<p class="#EDIT{chapo} chapo">(#CHAPO)</p>]]
  	#FIN_SURLIGNE
    </div>
   [<div class="#EDIT{texte} texte">(#TEXTE|image_reduire{520,0})</div>]	
 </BOUCLE_truc>
</div>

Alternativement il est possible de mettre la BOUCLE_truc dans un fichier de squelette et de l’appeller par un inclure dans lequel on passe l’id_article stocké par id_aa :

   [(#INCLURE{fond=aa}{id_article=[(#CONFIG{aa/id_aa})]})]

Outre le fait que tout fonctionne comme prévu (le contenu de l’article sélectionné s’affiche dans la page sommaire, dans les 2 cas la seule partie qui nous intéresse est le (#CONFIG{aa/id_aa}) qui permet de récupérer directement la valeur de id_aa pour la passer en paramètre id_article : {id_article=...}.
Notez donc la syntaxe propre à la balise #CONFIG :
#CONFIG{prefix_plugin/nom_variable_config} (avec le « / » comme séparateur) sera substitué par la valeur saisie via le name=« nom_variable_config » de la page  ?exec=cfg&cfg=prefix_plugin.
On peut également appeller #CONFIG{nom_plugin} si l’on souhaite récupérer directement le tableau (array) des paramètres de configuration stockés.

Quatrième étape : améliorer l’ergonomie de l’interface de configuration

Etant donné que le fichier /fonds/cfg_aa.html est un fichier de squelette « comme les autres », on peut utiliser la balise #CONFIG pour que le <select name=« id_aa »> puisse avoir comme <option> sélectionnée l’article dont l’id_article est stockée dans spip_meta (la config en cours quoi !). Ce qui nous donne :

   <option value="#ID_ARTICLE" [(#CONFIG{aa/id_aa}|=={#ID_ARTICLE}|?{selected="selected",''})]>&nbsp;&nbsp;&nbsp;&nbsp;#ID_ARTICLE . #TITRE</option>

Ce code utilise donc un filtre de test d’égalité (|==) sur la valeur de l’ID_ARTICLE en cours dans la BOUCLE : si cet id_article est égal à #CONFIG{aa/id_aa} , alors cette option est celle sélectionnée à l’affichage de la page :
<option value="#ID_ARTICLE" selected="selected">

Cinquième étape : récupérer les variables de configuration dans les fichiers de l’espace privé

Dans la majorité des plugins (contrairement à aa) il est nécessaire de devoir récupérer les paramètres de configuration dans les fichiers php du plugin (exec_truc.php par exemple).
Pour cela cfg fourni la fonction lire_config() qui s’utilise de la façon suivante :

   echo lire_config('aa/chapo');

pour récupérer la valeur de la variable « chapo » du plugin « aa ». Le tableau php (array) complet des valeurs stockées est appelé par lire_config(’aa’).

On peut donc utiliser toutes les formes classiques d’interrogation de l’array php retourné par lire_config(’aa’) :
Un simple print_r() :

  echo '<strong>lire_config(aa) retourne :</strong> ';
  print_r(lire_config('aa'));

ou une structure de contrôle plus sophistiquée :

	foreach(lire_config('aa') as $cle => $val) {
	    echo '<br />$cle = '.$cle.' $val = '.$val;
	}

qui permet de constater que les valeurs de l’array lire_config(’aa’) sont indexées avec le nom des variables stockées comme clés.

A titre d’exemple on peut donc faire dans le plugin aa une interface d’administration qui permettra d’illustrer ces notions.
Pour cela on crée un sous-répertoire « exec » dans le dossier de aa et on crée dedans le fichier aa_admin.php qui sera donc appelé par .../ecrire/ ?exec=aa_admin. Un code minimal pour tester lire_config() donnerait :

<?php 
function exec_aa_admin() {
   include_spip("inc/presentation");
// vérifier les droits
   global $connect_statut;
   global $connect_toutes_rubriques;
   if ($connect_statut != '0minirezo' OR !$connect_toutes_rubriques) {    
       debut_page(_T('titre'), "saveauto_admin", "plugin");
       echo _T('avis_non_acces_page');
       fin_page();
       exit;
   }

   echo debut_page(_T('aa:titre_page'));	 
   echo "<br />";
   echo gros_titre(_T('aa:gros_titre_page'));
   echo debut_gauche();
	
   echo debut_boite_info();
   echo 'contenu de la boite info du plugin aa';
   echo fin_boite_info();
	
   echo debut_raccourcis();
   echo 'contenu de la boite des raccourcis du plugin aa';
   echo fin_raccourcis();
		
   echo debut_droite();
   echo debut_cadre_trait_couleur("plugin-24.gif", false, "", _T('titre_boite_principale'));       
   echo debut_cadre_couleur();
// simple test de lire_config()
   echo '<strong>lire_config(aa) retourne :</strong> ';
   print_r(lire_config('aa'));
   echo '<br /><br /><strong>lire_config(aa/id_aa) =</strong> '.lire_config('aa/id_aa');
   echo '<br /><br /><strong>lire_config(aa/chapo) =</strong> '.lire_config('aa/chapo');
	
   echo '<br /><br /><strong>une boucle dans lire_config(aa)</strong> ';
   foreach(lire_config('aa') as $cle => $val) {
       echo '<br />$cle = '.$cle.' $val = '.$val;
   }
	
   echo fin_page();
}				 
?>

Ce qui donne l’interface suivante :

Sixième étape : ajouter la sélection des éléments de l’article accueil à afficher

Pour rendre ce plugin un peu plus complet on souhaite pouvoir choisir les éléments (logo, titre, sous-titre, chapo et texte) qui seront affichés.
Pour cela 2 mofications :

  • ajouter des paramètres de configuration dans cfg_aa.html :
    <fieldset><legend>Eléments à utiliser :</legend>
      <label>Logo</label>
      <input type="checkbox" name="logo" [checked="(#ENV{logo})"] />
      <label>Titre</label>
      <input type="checkbox" name="titre" [checked="(#ENV{titre})"] />
      <label>Sous-titre</label>
      <input type="checkbox" name="soustitre" [checked="(#ENV{soustitre})"] />	 
      <label>Chapeau</label>
      <input type="checkbox" name="chapo" [checked="(#ENV{chapo})"] />
      <label>Texte</label>
      <input type="checkbox" name="texte" [checked="(#ENV{texte})"] />
    </fieldset>

On crée donc un <input type=« checkbox » name=« element_a_selectionner » ...> pour chacun des éléments pouvant êtres choisis...
...et on récupère la configuration en cours en utilisant une nouvelle caractéristque de cfg : lorsque l’on est dans le squelette du fond du plugin (ie ici cfg_aa.html), alors on récupère directement les valeurs de #CONFIG{prefix_plugin/nom_variable} dans #ENV{nom_variable} . Cela permet de simplifier par rapport au test |== utilisé dans la 5e étape pour récupérer la config en cours des différents paramètres :
... [checked="(#ENV{chapo})"] suffit pour faire afficher checked=« on » si le chapo est sélectionné dans la config en cours.


Avec #ENV on peut également donner des valeurs « par défaut » aux variables de configuration : #ENV{nom_variable, valeur_defaut} Par exemple pour créer un champ texte gérant la variable « truc » et ayant « toto » comme texte par défaut, on écrira :

<input type="text" name="truc" value="#ENV{truc, toto}">
  • ajouter un test sur la configuration de l’affichage des éléments (logo, titre...) dans le squelette :
       [(#LOGO_ARTICLE||image_reduire{200,200})]

    devient

    [(#CONFIG{aa/logo}|=={on}|?{[(#LOGO_ARTICLE||image_reduire{200,200})],''})]

    ce qui permet de n’afficher le logo que si il est coché dans le plugin.
    En appliquant ce type de test sur l’ensemble de la BOUCLE_truc on obtient alors :

    <BOUCLE_truc(ARTICLES){id_article=(#CONFIG{aa/id_aa})}>
        <div class="cartouche">
        #DEBUT_SURLIGNE
    [(#CONFIG{aa/logo}|=={on}|?{[(#LOGO_ARTICLE||image_reduire{200,200})],''})]
     [(#CONFIG{aa/titre}|=={on}|?{[<h1 class="#EDIT{titre} titre">(#TITRE)</h1>],''})]
    [(#CONFIG{aa/soustitre}|=={on}|?{[<p class="#EDIT{soustitre} soustitre">(#SOUSTITRE)</p>],''})]
    [(#CONFIG{aa/chapo}|=={on}|?{[<p class="#EDIT{chapo} chapo">(#CHAPO)</p>],''})]
        #FIN_SURLIGNE
        </div>
        [(#CONFIG{aa/texte}|=={on}|?{[<div class="#EDIT{texte} texte">(#TEXTE|image_reduire{520,0})</div>],''})]		 		
    </BOUCLE_truc>

De cette manière le contenu de la page sommaire devient facilement modifiable tant au niveau du contenu (article choisi) que des éléments à afficher...

Septième étape : ajouter un bouton dans l’espace privé pour l’administration

Ce bouton permettra d’accéder directement à la page de configuration de aa.

D’abord, rajouter à la fin de plugin.xml, juste avant </plugin> :

    <pipeline>
    	<nom>ajouter_boutons</nom>
        <inclure>aa_pipelines.php</inclure>
    </pipeline>	

Cette balise <pipeline>...</pipeline> demande à spip d’exécuter la fonction aa_ajouter_boutons() (défaut) du fichier aa_pipelines.php situé dans plugins/aa/ lors de la fabrication de l’espace privé. Cela insérera un bouton de raccourcis pour accéder à l’interface de config du plugin aa dans la partie privée.

Le fichier aa_pipelines.php qui contient le minimum pour créer un bouton « Article accueil » dans le sous-menu de « édition » :

<?php
function aa_ajouter_boutons($boutons_admin) {
    // si on est admin
    if ($GLOBALS['connect_statut'] == "0minirezo") {
       // on voit le bouton comme  sous-menu de "naviguer"
       $boutons_admin['naviguer']->sousmenu['cfg&cfg=aa']= new Bouton("plugin-24.gif", _T('Article accueil') );
    }
    return $boutons_admin;
}
?>

Rappel ce bouton ($boutons_admin[’naviguer’]) n’appelle pas un fichier du plugin comme dans les autres plugins (de la forme ->sousmenu[’aa’] pour appeller  ?exec=aa) mais qu’il renvoie directement sur l’interface de cfg : ->sousmenu[’cfg&cfg=aa’] renvoie sur  ?exec=cfg&cfg=aa.
cela confirme à nouveau que ce plugin n’aura pas à créer sa propre interface de configuration puisqu’il bénéficie de celle créée automatiquement par cfg

Liens pour récupérer l’intégrale de aa et cfg :
-  aa en zip
-  cfg en zip
-  aa sur la zone : svn ://zone.spip.org/spip-zone/_plugins_/_dev_/aa
-  cfg sur la zone : svn ://zone.spip.org/spip-zone/_plugins_/_test_/cfg

cfg est en cours de documentation et est toujours en développement, toutefois, les fonctionnalités présentées ici sont totalement stabilisées et peuvent être utilisées sans risque. cfg permet beaucoup plus, nous avons préféré rester ici sur un modèle simple.

Discussion

18 discussions

  • 1

    Bonjour,

    Je me suis basé sur les explications de cette page pour créer un plug-in très simple, mon tout premier plug-in. Un grand merci pour ces explications qui m’ont grandement facilité la tâche.

    Il s’agit de créer une balise personnalisée statique dont le contenu peut être défini via un onglet de cfg.

    Cela fonctionne correctement sauf que, du côté public, lorsque j’insère la balise personnalisée, le contenu s’insère avant le <!DOCTYPE html..., alors que le squelette l’appelle à un autre endroit.
    Et je ne comprends pas pourquoi...

    Quelqu’un peut-il m’expliquer pourquoi et comment résoudre ce problème ?

    • Je me réponds à moi-même...

      Finalement, j’ai trouvé une méthode qui me permet de contourner cette difficulté. Il s’agit de mettre l’appel à la balise personnalisée dans un fichier include créé à cette occasion.
      De ce fait, le contenu de la balise s’affiche en début du fichier inclus et non pas au début avant le DOCTYPE...

      Néanmoins si quelqu’un a une explication, je reste toujours preneur.

    Répondre à ce message

  • super, en moins de deux heures j’ai l’impression d’avoir fais un plugin tout seul... en suivant pas à pas c’est trop facile, les étapes du tutoriel sont bien mises en valeur par des résultats intermédiaires, je m’en vais tout de suite coder mon « vrai » premier plugin...

    juste dans la troisième partie, un bout de code est en trop ?

    DEBUT_SURLIGNE
    [(#LOGO_ARTICLE||image_reduire{200,200})],''})]
    [<h1 class="#EDIT{titre} titre">(#TITRE)</h1>]
    [<p class="#EDIT{soustitre} soustitre">(#SOUSTITRE)</p>]
    [<p class="#EDIT{chapo} chapo">(#CHAPO)</p>]]
    FIN_SURLIGNE

    devrait peut-être donner :

    DEBUT_SURLIGNE
    [(#LOGO_ARTICLE||image_reduire{200,200})]
    [<h1 class="#EDIT{titre} titre">(#TITRE)</h1>]
    [<p class="#EDIT{soustitre} soustitre">(#SOUSTITRE)</p>]
    [<p class="#EDIT{chapo} chapo">(#CHAPO)</p>]
    FIN_SURLIGNE

    mais c’est pas très grave...
    je trouve ce tutoriel vraiment exceptionnel,
    merci

    Répondre à ce message

  • Merci pour ce tutorial ; je viens de coder le plugin « Autorité » en le suivant pas à pas. Impeccable.

    Répondre à ce message

  • 2

    Bonjour,
    d’abord merci pour ce plugin, je commence à m’en servir et ça roule (presque) tout seul :)

    J’ai deux questions :

    1. Est-il possible de placer l’icône perso du plugin dans le menu des plugins gérés par CFG ?
    2. Sur l’internationalisation de la partie [(#REM) descriptif = ... ], il s’affiche la balise de langue et non son contenu (ça marche bien pour le formulaire), mon code (avec ou sans <multi>) :
      [(#REM) descriptif=<h4>Exp&eacute;rimental</h4>
      <p><multi><:monplugin:descriptif_cfg:></multi></p>
      ]

    Quelqu’un aurait des pistes ?

    • auto-réponse pour 2 :

      enlever la balise de commentaire SPIP ([(#REM) ...]) et la remplacer par celle du HTML :

      <!-- descriptif=... <:truc:bla_bla:> ... -->

      et on peut même mettre du code PHP dans ces commentaires, genre

      <!-- descriptif=... <:truc:bla_bla:> ...
      <?php
       icone_horizontale (_T('truc:retour_au_plugin'), generer_url_ecrire('truc'), 'icone.png');
      ?>
      ... -->

      c’est trop fort :))

    • auto-réponse 1

      simplement, comme pour le titre :

      <!-- icone=img_pack/csvexport-24.png -->

    Répondre à ce message

  • 1

    Attention, pour le code dans le fichire plugin.xml appelant l’espace de configuration du plugin, il faut remplacer :

    <lien>[Documentation->lien vers site de documentation], et [Configuration- 
     >.?exec=cfg&cfg=aa]</lien>

    par :

    <lien>[Documentation->lien vers site de documentation], et [Configuration- 
     >.?exec=cfg&ampcfg=aa]</lien>

    le « & » tout seul est remplacé par « &amp » , sinon en cas de commit sur spip-zone ça bloque la zone. Attention n’oubliez pas d’ajouter un «  ; » a la fin de « amp ». (c’est pas mis dans l’exemple que je donne car spip interpretre le machin et transforme le « &amp » en « & » tout court.

    Répondre à ce message

  • Sur SPIP 1.9.2c, il y a un problème dans le fichier compat_cfg.php à la ligne 64 : la fonction spip_query() devrait être appelée et non pas la fonction spip_query_db() comme c’est le cas.

    Curieusement, ce bug n’apparait pas lorsqu’on est identifié dans l’espace privé, mais uniquement lorsqu’on est anonyme et uniquement dans le cadre des pages de gestion des langues avec le plugin « langue préférée »...

    Si quelqu’un peut me dire si il y a quelque chose que je n’ai pas compris ?
    J’ai juste remplacé spip_query_db() par spip_query() et ça marche...

    Répondre à ce message

  • Bonjour

    Si je ne m’abuse maintenant on peut faire #ENV{id_aa} au lieu de #CONFIG{aa/id_aa}

    Ce qui simplfie pas mal la syntaxe non ?

    Répondre à ce message

  • 1
    Evelyne Desandre

    Bonjour,

    J’ai installé ce plugin sur un spip 1.9.2b [9381]. Quand je veux configurer (www.monsite.org/ecrire/?exec=cfg) j’ai ce message d’erreur (voir ci-dessous). Je suis allée chercher la dernière version svn sur spip zone et l’ai installée, après avoir effacé la version précédente.

    Le message d’erreur persiste néanmoins et je ne peux donc pas configurer certains autres plugins. Que puis-je faire pour résoudre ce problème ? Dois-je par exemple effacer certaines données (de la base ou d’ailleurs) avant de réinstaller ?

    D’avance merci.

    Line

    # Erreur(s) dans le squelette

    * Erreur : filtre « !=’’ » non défini,
    * Erreur : filtre « !=’’ » non défini,
    * Erreur : filtre « !=’’ » non défini,
    * Erreur : filtre « !=’’ » non défini,
    * Erreur : filtre « !=’’ » non défini,

    • Evelyne Desandre

      Bonjour

      Désolée pour le bruit. L’erreur venait de la Barre Typo enrichie. J’ai téléchagé la dernière version et tout est renté dans l’ordre.

    Répondre à ce message

  • Bonjour,

    J’ai une petite question concernant le plugin CFG.

    Dans un fichier placé dans le répertoire ’fonds’, commençant par ’cfg_’.

    Dans ce fichier je passe un formulaire avec ’action=« #SELF »’ et je passe
    les paramètres nécessaires pour CFG avec le filtre correspondant
    (placant les hidden dans le formulaire).

    Je rajoute un champs ’hidden’, par exemple : type="hidden" value="true">

    Et ensuite je place du code PHP :

    <?php
        if (_request('create') == 'yes') {
    
           $result = spip_query('alter table .........');
           if (! $result) {
              echo mysql_error();
            } else {
              echo 'Le champs a bien été créé.';
           }
    
        } else {
           .............
    
        }
    ?>

    Et la quand je clique sur le bouton ’submit’, j’ai une belle surprise.

    Je prends une erreur :
    Duplicate column .....

    Le code a été exécuté deux fois !!!!!!

    La première fois, il cré bien la colonne dans la table et la deuxième
    fois, il obtient une erreur.

    Je n’arrive pas à comprendre pourquoi il exécute deux fois le code PHP !!!!

    Quelqu’un aurait-il une explication à ce phénomène ?

    merci d’avance

    Répondre à ce message

  • Bonjour,

    j’ai créé un plugin avec cfg.

    Quand je passe ’_cfg_delete’, il me supprime toute l’entrée dans la table spip_meta correspondant à mon plugin.
    Je voudrais tout simplement supprimer une des valeurs de cette entrée dans le tableau serializé !!!

    merci d’avance

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom