Intégrer une table existante dans SPIP 3 avec la fabrique (suite) Autre objet, autres contraintes.

, par Matthieu Marcillaud

Nous l’avons vu dans Intégrer une table existante dans SPIP 3 avec la Fabrique, « La Fabrique » permet de créer des bases fonctionnelles de plugins gérant des objets éditoriaux. Nous allons continuer avec une autre problématique avec l’utilisation d’un autre objet, une table contenant des lieux.

Le principe va être le même et donc je ne vais pas détailler les mêmes choses. Cette table est volumineuse, et a des colonnes que nous allons également migrer dans des liaisons.

Voici ce que nous avons à migrer entre autres choses, qui diffèrent par rapport au premier article sur le sujet :

  • 1 champ « pertinence » qui ira en champs extras ’pertinence’ dans spip_gis
  • 1 champ « pays » qui contient un nom de pays, et sera migré vers un identifiant de pays

Et ce qu’il faudra faire en plus de la migration :

  • créer / gérer le champs extra sur spip_gis,
  • des saisies spécifiques dans cette table comme la sélection d’une ville dans la table spip_villes du même plugin. Ce n’est pas un lien dans ce qu’on me demande, ça aide simplement à retrouver certaines données comme l’insee de la ville, aussi stocké dans cette table de lieu.

Déclarer l’objet dans la Fabrique

On l’a déjà vu, donc nous cliquons :

  • « Ajouter un objet éditorial »
  • Pré-construire le contenu du formulaire avec la table que l’on désire
  • Modifier certaines infos (ici la construction de sait pas que le singulier est « lieu », il faut donc le renseigner : dans la description, ET dans la partie « tables » / « spécificités des tables hors normes » on l’on indique le nom de clé primaire « id_lieu » et le type « lieu ». [1]
  • Pour chaque champs de la table, remplir plus précisément les infos (noms explicites, saisies souhaité pour l’édition, pondération de recherche) et éventuellement vérifier que les déclarations SQL n’ont pas de NULL autorisés sans valeur par défaut
  • On active dans « fichiers échafaudés » prive/squelettes/contenu/lieux.html, qui offre simplement en plus un petit formulaire de recherche, qui sera pratique sur notre table volumineuse

Créer le champ pertinence dans GIS

Il faut :

  • déclarer le champs extra (dans paquet.xml et dans base/prefixe.php)
  • ajouter les codes d’installation / désinstallation de ce champ
  • l’ajouter sa valeur en même temps que la migration

Dans la Fabrique, on ajoute la ligne du pipeline dans paquet > codes à insérer > paquet.xml ainsi que la dépendence au plugin Champs Extras. [2] [3]

  1. <necessite nom="cextras" compatibilite="[3.0.0;]" />
  2. <pipeline nom="declarer_champs_extras" inclure="base/geoniche.php" />

Télécharger

On ajoute la fonction de déclaration du champs dans paquet > codes à insérer > bases > prefixe.php  :

  1. function geoniche_declarer_champs_extras($champs = array()) {
  2. $champs['spip_gis']['pertinence'] = array(
  3. 'saisie' => 'input', // Type du champs (voir plugin Saisies)
  4. 'options' => array(
  5. 'nom' => 'pertinence',
  6. 'label' => _T('geoniche:pertinence'),
  7. 'sql' => "int(2) NOT NULL DEFAULT 0",
  8. 'defaut' => '', // Valeur par défaut
  9. ),
  10. );
  11. return $champs;
  12. }

Télécharger

Ainsi que les procédures d’installation / désinstallation dans administrations.php que l’on peut ajouter avant l’importation des données.

  • installation :
    1. include_spip('inc/cextras');
    2. include_spip('base/geoniche');
    3. cextras_api_upgrade(geoniche_declarer_champs_extras(), $maj['create']);

    Télécharger

  • déinstallation :
    1. include_spip('inc/cextras');
    2. include_spip('base/geoniche');
    3. cextras_api_vider_tables(geoniche_declarer_champs_extras(), $maj['create']);

    Télécharger

Il restera, à posteriori à ajouter la chaîne de langue geoniche:pertinence.

Ajouter une saisie pour le champ INSEE

Dans la table lieux, il faut faire renseigner un champ INSEE de commune. On retrouvera une liste de ces valeurs à partir du code postal choisi.

La saisie (à placer dans saisies/insee.html) peut ressembler à cela :

  1. <select name="#ENV{nom}" id="champ_#ENV{nom}"[ class="(#ENV{class})"][ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"] >
  2. [(#ENV{cacher_option_intro}|non)<option value="">[(#ENV{option_intro})]</option>]
  3. <BOUCLE_insee(VILLES){par nom_ville_min}{zip}>
  4. <option value="#INSEE"[(#INSEE|=={#ENV{valeur,#ENV{defaut}}}|oui) selected="selected"]>#NOM_VILLE_MIN \(#INSEE\)</option>
  5. </BOUCLE_insee>
  6. </select>

Télécharger

Aussi, on ajoutera un petit javascript qui rechargera la liste des INSEE possibles dès que la valeur du code postal change, dans le squelette du formulaire d’édition :

  1. <script type="text/javascript">
  2. (function($){
  3. $('.formulaire_#FORM .editer_zip input').change(function(){
  4. val = $(this).val();
  5. var select_insee = $('.formulaire_#FORM .editer_insee select');
  6. insee = select_insee.val();
  7. select_insee.val("");
  8. $.get('[(#URL_PAGE{ajax-insees})]', {zip: val, insee: insee}, function(data){
  9. select_insee.html(data);
  10. });
  11. });
  12. })(jQuery);
  13. </script>

Télécharger

Ce squelette appelle une page « ajax-insees » qui peut contenir le strict minimum tel que :

  1. #HTTP_HEADER{Content-Type: text/html; charset=#CHARSET}
  2. <option value=""></option>
  3. <BOUCLE_insee(VILLES){par nom_ville_min}{zip}>
  4. <option value="#INSEE"[(#INSEE|=={#ENV{insee}}|oui) selected="selected"]>#NOM_VILLE_MIN \(#INSEE\)</option>
  5. </BOUCLE_insee>

Télécharger

Conserver une partie des informations ajoutées au plugin après sa création

Avec la version 1.12.0 de la fabrique arrive un petit utilitaire pour simplifier certaines opérations à effectuer après la création du plugin lors de l’exécution du script post_creation. C’est une classe PHP nommée « Futilitaire » et incluse dans inc/futilitaire.php du plugin Fabrique.

Elle contient pour l’instant 2 fonctions utiles :

  • deplacer_fichiers($liste) qui indique de deplacer du backup (l’ancienne création) vers la nouvelle création la liste des fichiers indiques. C’est donc une liste des fichiers que l’on a ajouté au plugin qui est a donner.
  • inserer_lignes($chemin, $start, $len, $code) qui permet d’ajouter des lignes de code dans un des fichiers présents, à partir de la ligne indiquée dans $start (peut être négatif pour partir de la fin du fichier), en supprimant $len lignes du fichier, et en insérant le contenu de $code à cet emplacement.

Voici un exemple :
Dans l’interface de la fabrique, dans Paquet > Scripts à exécuter > post_creation, j’ai simplement l’inclusion d’un fichier et l’exécution d’une fonction :

  1. include_once($destination_ancien_plugin . 'fabrique_geoniche_post_creation.php');
  2. fabrique_geoniche_post_creation($data, $destination_plugin, $destination_ancien_plugin);

Télécharger

Dans le plugin généré, j’ajoute donc ce fichier à la racine fabrique_geoniche_post_creation.php (vous l’appelez comme bon vous semble) contenant :

  1. <?php
  2.  
  3. include_spip('inc/futilitaire');
  4.  
  5. function fabrique_geoniche_post_creation($data, $destination_plugin, $destination_ancien_plugin) {
  6.  
  7. // charger le Futilitaire
  8. $futil = new Futilitaire($data, $destination_plugin, $destination_ancien_plugin);
  9.  
  10. // deplacer les fichiers crees, dont celui-ci
  11. $futil->deplacer_fichiers(array(
  12. 'fabrique_geoniche_post_creation.php',
  13. 'base/importer_spip_villes.php',
  14. 'base/importer_spip_villes_donnees.gz',
  15. 'base/importer_spip_lieux.php',
  16. 'base/importer_spip_lieux_donnees.gz',
  17. 'saisies/thematique.html',
  18. 'saisies-vues/thematique.html',
  19. 'saisies/insee.html',
  20. 'saisies-vues/insee.html',
  21. 'saisies-vues/ape.html',
  22. 'saisies/ape.html',
  23. 'ajax-insees.html',
  24. 'after.txt',
  25. ));
  26.  
  27. // ajouter du code dans lang/geoniche.php
  28. $lignes =
  29. <<<EOF
  30.  
  31. // P
  32. 'pertinence' => 'Pertinence',
  33. EOF;
  34.  
  35. $futil->ajouter_lignes('lang/geoniche_fr.php', -3, 0, fabrique_tabulations($lignes, 1));
  36.  
  37.  
  38. // ajouter du code dans formulaires/editer_lieux.html
  39. $lignes =
  40. <<<EOF
  41.  
  42. <script type="text/javascript">
  43. (function($){
  44. $('.formulaire_#FORM .editer_zip input').change(function(){
  45. val = $(this).val();
  46. var select_insee = $('.formulaire_#FORM .editer_insee select');
  47. insee = select_insee.val();
  48. select_insee.val("");
  49. $.get('[(#URL_PAGE{ajax-insees})]', {zip: val, insee: insee}, function(data){
  50. select_insee.html(data);
  51. });
  52. });
  53. })(jQuery);
  54. </script>
  55.  
  56. EOF;
  57.  
  58. $futil->ajouter_lignes('formulaires/editer_lieu.html', -1, 0, $lignes);
  59. }
  60.  
  61. ?>

Télécharger

Du coup, à chaque fois que je génère mon plugin via la Fabrique, je ne perds pas les fichiers indiqués et il me remet ce code là où je lui dis.

À vrai dire, cela a peu d’utilité certainement pour vous, à part le fait de se dire qu’on peut regénérer le plugin sans perdre de modifications, pour peu qu’on ai listé ici toutes les modifications que l’on a fait. Pour ma part, cela m’aide à pouvoir ajouter de nouvelles fonctions dans la fabrique sans perdre de petites modifications de code déjà réalisées.

Notes

[1Nota, la Fabrique 1.12.0 ou SPIP 3 ne savent pas gérer parfaitement une table dont le pluriel est identique au singulier tel que « un univers, des univers » (plus précisément où l’« objet » est identique au « type »), il faudra donc éviter ces noms là, sinon le plugin généré ne pourra pas lister tous les univers sur exec=univers (qui s’attend à afficher la vue d’un univers) et renverra un accès interdit. Il y a de multiples contournements possibles, mais j’ai préféré ne pas alourdir la Fabrique avec cela pour l’instant.

[2Le plugin construit a été renommé en « Géoniche »

[3On pourrait très bien ajouter ces codes après la création du plugin si on ne compte plus utiliser la Fabrique ensuite.

Coup de pouce

Pour me maintenir en éveil et en pleine forme physique et mentale, vous pouvez me faire le cadeau d'un jus de fruit pressé.

En plus de m'hydrater, de m'offrir une alimentation saine crudivore et frugivore, cela peut aussi me motiver à produire d'autres documentations ou peut-être à prendre des vacances ! :)

Vous pouvez également me « Flattrer » si vous utilisez le service en ligne très malin Flattr de microdonations qui permet d'allouer un budget mensuel à des créateurs de contenu. Votre budget est partagé chaque mois entre toutes les personnes que vous avez flattées ce mois là.