SPIP - Contrib

[ar] [en] [es] [fr] [it]



Accueil du site > Outils pour plugins > Config (cfg)

Insérer un plugin dans une rubrique spécifique.

grâce à cfg !

mercredi 10 octobre 2007, par echo. Dernier ajout jeudi 11 octobre 2007



Une demande récurrente

Les utilisateurs chevronnés de SPIP ont souvent besoin d’ajouter un plugin spécifique à une rubrique dans l’espace privé.

Par exemple, la rubrique 66 doit faire office d’agenda, on aimerait donc avoir le formulaire de gestion des évènements uniquement si l’article appartient à cette rubrique 66, et quant au groupe de mots-clefs 5, il faudrait que ses mots clefs et ceux-là uniquement permettent de configurer une carte google.

Ici, nous allons seulement montrer comment modifier l’appel du pipeline du plugin GIS pour l’appliquer uniquement sur la ou les rubriques au choix du (ou de la) webmestre.

Qu’est ce qu’un pipeline?

Lors de la création d’un plugin SPIP, vous avez par exemple besoin d’insérer une boite à gauche, en haut, du code dans le head, ou un formulaire au milieu...on se sert alors d’un pipeline.

Au départ, on pense plutôt à un tuyau, et on a pas vraiment tort, puisque le pipeline va agir sur le flux de la page générée par SPIP.

Les explications et références directes sur les pipelines sont ici!

Chouette ! les devs de SPIP ont installés des points d’entrée le long du flux SPIP, et voila ! vous pouvez donc utiliser affiche_milieu ou post_typo et bien d’autres pipelines pour glisser votre code dans SPIP sans recopier toute la page pour la modifier.

Tout ça c’est du pipeline

Le plugin GIS joue très bien du pipeline, pour savoir où précisement, il faut aller voir dans le dossier /gis le fichier plugin.xml ou sont les définitions des entrées. Lignes 58 de plugins/GIS/plugin.xml

  1. <!-- Definitions des fonctions qui s'inserent dans les pipelines -->
  2. <pipeline>
  3.                 <nom>affiche_droite</nom>
  4.                 <inclure>gis_pipeline.php</inclure>
  5. </pipeline>

Ouvrons ce gis_pipeline.php pour y trouver la fonction d’inclusion qui nous intéresse.

  1. function gis_insertar_maparticle($flux){
  2.         if (_request('exec')=='articles'){
  3. include_spip('inc/parte_privada');
  4. $flux['data'] .= gis_cambiar_coord($flux['arg']['id_article']);
  5.         }
  6. return $flux;
  7. }

On décortique, et on voit que l’appel se fait uniquement si l’url comporte exec=articles l’autre bonne idée ici, c’est l’appel d’un autre fichier (include_spip('inc/parte_privada');) qui s’executera alors, c’est ici qu’il faut poser nos conditions !

Ah ah, vous commençez à comprendre que c’est en amont qu’il va falloir jouer maintenant, comment en effet, demander à la fonction gis_insertar_maparticle de choisir les articles de la rubrique que nous voulons ?

Comment CFG entre dans la danse du pipeline

Une fois la fonction de pipeline repérée, on crée le fichier cfg_gis.html pour permettre de choisir les rubriques.

Attention à le mettre dans le dossier fonds comme ceci plugins/gis/fonds/cfg_gis.html

Voiici le formulaire et les boucles SPIP adequates :

  1. #CACHE{0}
  2. <form method="post">[(#ENV{_cfg_}|form_hidden)]
  3. [(#REM) descriptif=
  4. <h4>GIS sur quels objets?</h4>
  5. Quel est l'objet qui doit &ecirc;tre trait&eacute;
  6. <br />
  7. <a href="http://www.spip-contrib.net/Plugin-Gis-escoitar" class="spip_out">Documentation GIS</a>
  8. ]
  9.  
  10. [(#REM) titre=GIS]
  11.  
  12. #SET{wichrub,#CONFIG{gis/rubriques_gis,'',''}}
  13. <h4>Afficher la carte GIS sur quels objets?</h4>
  14. <fieldset>
  15. <legend>Quelle rubrique?</legend>
  16.   <label>Choix de la ou des rubriques &agrave; utiliser:</label>
  17.   <select name="rubriques_gis[]" multiple="multiple" size="5">
  18. <option value="" [(#GET{wichrub}|?{'',' '})selected="selected"]>
  19. aucunes
  20. </option>
  21.   <BOUCLE_secteurs(RUBRIQUES) {racine} {par titre}>
  22. <option value="#ID_RUBRIQUE" [(#ID_RUBRIQUE|in_array{#GET{wichrub}}|?{' selected="selected"'})] style="font-weight: bold;">
  23. <strong>racine #ID_RUBRIQUE : #TITRE</strong>
  24. </option>
  25.  
  26. <BOUCLE_rubriques(RUBRIQUES) {id_parent} {par titre}>
  27. <option  [(#ID_RUBRIQUE|in_array{#GET{wichrub}}|?{' selected="selected"'})] value="#ID_RUBRIQUE">
  28. &nbsp;&nbsp;rubrique #ID_RUBRIQUE : #TITRE
  29. </option>
  30.                            <BOUCLE_sous_rubriques(BOUCLE_rubriques)></BOUCLE_sous_rubriques>
  31. </BOUCLE_rubriques>
  32.   </BOUCLE_secteurs>
  33.    </select>
  34. </fieldset>
  35.  
  36. <input type="submit" name="_cfg_ok" value="<:OK:>" />
  37. <input type="reset" value="<:Reset:>" />
  38. <input type="submit" name="_cfg_delete" value="<:Supprimer:>" />
  39. </form>

Ce qui nous importe ici c’est d’avoir définit l’array de la ou des rubriques pour lesquelles nous souhaitons que les articles est une carte GIS#SET{wichrub,#CONFIG{gis/rubriques_gis,'',''}} on remplit donc l’array en validant le formulaire !

le résultat à l’appel du fichier /ecrire/?exec=cfg&cfg=gis

Transformation de la fonction d’appel

Voila maintenant ce que devient la fonction gis_insertar_maparticle($flux)

  1. function gis_insertar_maparticle($flux){
  2. if (_request('exec')=='articles'){
  3. //on teste si cfg est actif
  4.  if (function_exists(lire_config)) {
  5. $arracfgrubriques_gis=lire_config("gis/rubriques_gis",' ');
  6. global $id_article;
  7. if ($id_article!=''){
  8.         //on cherche la rubrique de l'article
  9. $s = spip_query("SELECT id_rubrique FROM spip_articles WHERE id_article=$id_article");
  10. $row = spip_fetch_array($s);
  11. $id_rubrique = $row['id_rubrique'];
  12.         //et si la rubrique est dans l'arrayrub
  13. if (in_array($id_rubrique, $arracfgrubriques_gis)) {
  14. include_spip('inc/parte_privada');
  15. $flux['data'].= gis_cambiar_coord($flux['arg']['id_article']);
  16.                 }
  17.         }
  18.  }else {
  19.  include_spip('inc/parte_privada');
  20.  $flux['data'].= gis_cambiar_coord($flux['arg']['id_article'])
  21.  }
  22. }
  23. return $flux;
  24. }

Si cfg n’est pas actif, car parfois les utilisateurs ne l’ont pas, on ignore nos modifications, sinon on utilise ce fameux array $arracfgrubriques_gis=lire_config("gis/rubriques_gis",' '); et si l’article appartient à la rubrique de l’array, on modifie le flux.

Conclusion

Chaque développeur de plugins devrait intégrer ainsi ce merveilleux outil que Toggg a développé pour SPIP.


Répondre à cet article

  • Insérer un plugin dans une rubrique spécifique.

    21 novembre 2007 08:16, par chep

    bonjour, javais pas envie de me casser la tete parce que jetais pressé.

    jutilise sarka spip

    j’ai ajouté un lien ’carte’ dans menu-gauche qui va vers une rubrique qui est invisible dans le menu deroulant par le mot clé exclu_menu_rub je crois

    dans le descriptif de cette rubrique j’ai ecris carte_gis1

    et maintenant qd je clique sur le lien ya les marqueur des article de cette rubrique qui apparaisse. le visiteur de base ne vois pas la difference.....

    Et je peux qd meme ajouter un marqueur depuis n’importe quel article au cas ou j’ai besoin....

    Répondre à ce message

    Retour au début des forums

  • Insérer un plugin dans une rubrique spécifique.

    21 novembre 2007 08:15, par chep

    bonjour, javais pas envie de me casser la tete parce que jetais pressé.

    jutilise sarka spip

    j’ai ajouté un lien ’carte’ dans menu-gauche qui va vers une rubrique qui est invisible dans le menu deroulant par le mot clé exclu_menu_rub je crois

    dans le descriptif de cette rubrique j’ai ecris

    et maintenant qd je clique sur le lien ya les marqueur des article de cette rubrique qui apparaisse. le visiteur de base ne vois pas la difference.....

    Et je peux qd meme ajouter un marqueur depuis n’importe quel article au cas ou j’ai besoin....

    Répondre à ce message

    Retour au début des forums

  • selon mots clés

    18 octobre 2007 17:15, par ivandps

    Bonjour

    merci pour la contribe peut-on imaginer d’insérer le plugin sur les articles qui ont tel et tel mot clé ?

    Répondre à ce message

    • selon mots clés 18 octobre 2007 17:26, par echo

      Oui, je l’ai fait aussi sur GIS, je ne voulais pas que l’article soit illisible, le principe est le même, donc inutile que tu t’y recolles ! voici la boucle à insérer dans fonds/cfg_gis.html

      1. #SET{wichgroup,#CONFIG{gis/groupes_gis,'',''}}
      2. <fieldset>
      3. <legend>Quel groupe de mots?</legend>
      4.    <label>Choix du groupe de mots &agrave; utiliser :</label>
      5.    <select name="groupes_gis[]" multiple="multiple" size="5">
      6.      <option value="" [(#GET{wichgroup}|?{'',' '})selected="selected"]>aucuns</option>
      7.          <BOUCLE_gpmots(GROUPES_MOTS){par titre}>
      8.    <option value="#ID_GROUPE" [(#ID_GROUPE|in_array{#GET{wichgroup}}|?{' selected="selected"'})]>&nbsp;&nbsp;&nbsp;&nbsp;#ID_GROUPE . #TITRE</option>
      9.          </BOUCLE_gpmots>
      10.    </select>
      11. </fieldset>

      et pour récupérer les mots choisis, dans gis_pipeline.php

      1. function gis_gismot($flux){
      2.         if (_request('exec')=='mots_edit'){
      3. //on teste si cfg est actif
      4.         if (function_exists(lire_config)) {
      5.         $arracfggroupes_gis=lire_config("gis/groupes_gis",' ');
      6.        
      7.         global $id_mot;
      8.         if ($id_mot!=''){
      9.                 //on cherche le groupe du mot
      10.                         $s = spip_query("SELECT id_groupe FROM spip_mots WHERE id_mot=$id_mot");
      11.                         $row = spip_fetch_array($s);
      12.                         $id_groupe = $row['id_groupe'];
      13.                                         //si le groupe est dans l'array
      14.                 if (in_array($id_groupe, $arracfggroupes_gis)) {
      15.                    include_spip('inc/parte_privada');
      16.                 $flux['data'] .= gis_mots($flux['arg']['id_mot']);
      17.                 }
      18.                
      19.                
      20.         }      
      21.        
      22.         }else{
      23.        
      24.                 include_spip('inc/parte_privada');
      25.                 $flux['data'] .= gis_mots($flux['arg']['id_mot']);
      26.         }
      27.         return $flux;
      28.         }
      29. }

      ça marche bien !

      Répondre à ce message

    • selon mots clés 18 octobre 2007 17:39, par echo

      Arf, j’ai lu trop vite,

      Il faut rester générique, ç’est ça qui est intéressant, et choisir le groupe que l’on veut.

      J’ai pour ma part opté pour un groupe "lieu" dans lequel au surprise les mots clefs sont des lieux avec carte configurée, je demande à cfg de n’appliquer la carte que sur ce groupe (grace au code précédent) et je désactive la carte sur les articles (cfg= aucune rubrique), puis j’affilie le mot clef à l’article que je veux.

      ça marche ici http://www.contrelesaddictions.fr/ en un peu plus poussé encore puisque j’ai modifié le squelette pour faire apparaitre les évènements d’un lieu donné. Le groupe lieu est lié alors uniquement aux évènements.

      Répondre à ce message

    Retour au début des forums

  • Bonjour,

    merci pour cette contribution que je viens d’adapter au plugin Agenda en ajoutant des balises multilingues pour des traductions en anglais

    Voici le fichier : agenda_1_9_2\fonds\cfg_agenda.html :

    <script>
    #CACHE{0}
    <form method="post">[(#ENV{_cfg_}|form_hidden)]
    [(#REM) descriptif=
    <h4><multi>Agenda in which sections ?</multi></h4>
    <multi>Which section will be used?</multi>
    <br />
    <a href="http://www.spip-contrib.net/Plugin-Agenda" class="spip_out">Documentation Agenda</a>
    ]

    [(#REM) titre=Agenda]

    #SET{wichrub,#CONFIG{agenda/rubriques_agenda,'',''}}
    <h4><multi>[en]Show the agenda in the follwong sections?[fr]Afficher l'Agenda pour les articles de quelle rubrique?</multi></h4>
    <fieldset>
    <legend><multi>[en]Which section?[fr]Quelle rubrique?</multi></legend>
    <label><multi>[en]Selection of the section to use :[fr]Choix de la ou des rubriques &agrave; utiliser:</multi></label>
    <select name="rubriques_agenda[]" multiple="multiple" size="5">
    <option value="" [(#GET{wichrub}|?{'',' '})selected="selected"]>
    <multi>[en]none[fr]aucunes</multi>
    </option>
    <BOUCLE_secteurs(RUBRIQUES) {racine} {par titre}>
    <option value="#ID_RUBRIQUE" [(#ID_RUBRIQUE|in_array{#GET{wichrub}}|?{' selected="selected"'})] style="font-weight: bold;">
    <strong><multi>[en]root[fr]racine</multi> #ID_RUBRIQUE : #TITRE</strong>
    </option>

    <BOUCLE_rubriques(RUBRIQUES) {id_parent} {par titre}>
    <option [(#ID_RUBRIQUE|in_array{#GET{wichrub}}|?{' selected="selected"'})] value="#ID_RUBRIQUE">
    &nbsp;&nbsp;<multi>[en]section[fr]rubrique</multi> #ID_RUBRIQUE : #TITRE
    </option>
    <BOUCLE_sous_rubriques(BOUCLE_rubriques)></BOUCLE_sous_rubriques>
    </BOUCLE_rubriques>
    </BOUCLE_secteurs>
    </select>
    </fieldset>

    <input type="submit" name="_cfg_ok" value="<:OK:>" />
    <input type="reset" value="<:Reset:>" />
    <input type="submit" name="_cfg_delete" value="<:Supprimer:>" />
    </form>
    </script>

    et dans : \plugins\agenda_1_9_2\agenda.php la fonction Agenda_affiche_milieu (ligne 46) :

    <script>function Agenda_affiche_milieu($flux) {
    if (_request('exec')=='articles'){
    //on teste si cfg est actif
    if (function_exists(lire_config)) {
    $arracfgrubriques_gis=lire_config("agenda/rubriques_agenda",' ');
    global $id_article;
    if ($id_article!=''){
    //on cherche la rubrique de l'article
    $s = spip_query("SELECT id_rubrique FROM spip_articles WHERE id_article=$id_article");
    $row = spip_fetch_array($s);
    $id_rubrique = $row['id_rubrique'];
    //et si la rubrique est dans l'arrayrub
    if (in_array($id_rubrique, $arracfgrubriques_gis)) {
    include_spip('inc/calendar');
    include_spip('inc/agenda_gestion');
    $id_article = $flux['args']['id_article'];
    $flux['data'] .= Agenda_formulaire_article($id_article, article_editable($id_article),'articles');
    }
    }
    }else {
    include_spip('inc/calendar');
    include_spip('inc/agenda_gestion');
    $id_article = $flux['args']['id_article'];
    $flux['data'] .= Agenda_formulaire_article($id_article, article_editable($id_article),'articles');
    }
    }
    return $flux;
    }</script>

    et ajouter

    <script>'supprimer' => 'delete',</script>

    dans squelettes/lang/local_en.php

    Je ne suis pas certain que mon adaptation est parfaite. Notamment dans

    <script>[(#REM) descriptif=
    <h4><multi>Agenda in which sections ?</multi></h4>
    <multi>Which section will be used?</multi>
    <br />
    <a href="http://www.spip-contrib.net/Plugin-Agenda" class="spip_out">Documentation Agenda</a>
    ]</script>

    ou je n’ai pas résussi à mettre la traduction en français, car dés que je mets les

    <script>[]</script>

    il y a tout qui foire et si je mets

    <script><:agenda_section:></script>

    avec des traductions dans les fichiers langues dans squelettes/lang, les trad ne s’affichent pas. Je les ai donc laissé en anglais.

    Salutations

    Rainer

    Répondre à ce message

    Retour au début des forums



Suivre la vie du site RSS 2.0 | Plan du site | Espace privé | Charte et fonctionnement SPIP-Contrib | SPIP | L'autre.net