Carnet SPIP

extra2 sur une table externe

SPIP-Contrib :: Carnet SPIP :: Recherche :

extra2 sur une table externe

Création d’une balise #LISTER_VALEURS_EXTERNES

En attendant éventuelle publication officielle, voici le fichier lister_valeurs_externes.php dans squelettes/balise tel que transmis dans http://pastebin.com/V6XuYCbs

  1. <?php
  2. /**
  3.  * Licence GPL / Matthieu Marcillaud, pour Alexandra Guiderdoni
  4.  *
  5.  * Nouvelle balise LISTER_VALEURS_EXTERNES pour Champs Extras
  6.  * afin de puiser les listes des champs extras sur une valeur
  7.  * de $connect qui n'appartient pas au site en cours.
  8.  *
  9.  * Soit le site B affichant des infos du site A
  10.  *              1) placer ce fichier sur les 2 sites, dans un chemin du path de SPIP,
  11.  *                      dans le dossier balise/
  12.  *                      par exemple dans le dossier squelettes/balise/lister_valeurs_externes.php
  13.  *              2) sur le site B, faire charger le fichier à chaque calcul (faire charger une correspondance connect/url) par spip,
  14.  *                      déclarer dans le fichier d'option la correspondance entre connect et
  15.  *                      l'url du site dans une globale 'correspondances_urls_connect'
  16.  *                      (Note : elle n'est pas de SPIP mais est créée pour l'occasion)
  17.  *                      $GLOBALS['correspondances_urls_connect'] = array(
  18.  *                              'site1' => 'http://url_du_spip.org/',
  19.  *                              'nom_connect' => 'url',
  20.  *                      );
  21.  *              3) sur le site A, ajouter un squelette dans un path de SPIP,
  22.  *                      par exemple dans le dossier squelettes/, nommé 'get_champs_extras.html',
  23.  *                      et contenant :
  24.  *                      [(#VAL|get_champs_extras_site)]
  25.  *                      associé à un fichier 'get_champs_extras_fonctions.php' contenant :
  26.  *                      <?php include_spip('balise/lister_valeurs_externes'); ?>
  27.  *              4) sur le site B, appeler dans son squelettes
  28.  *                      #LISTER_VALEURS_EXTERNES{champ_sql}
  29.  *                      La balise ira chercher le $connect en cours pour déterminer les valeurs
  30.  *                      a afficher.
  31.  *                     
  32.  *
  33. **/
  34. define('SCRIPT_RECUPERATION_CHAMPS_EXTERNES', 'get_champs_extras');
  35. function get_champs_extras_site() {
  36.         $ce = pipeline('declarer_champs_extras', array());
  37.         $ce = serialize($ce);
  38.         return $ce;
  39. }
  40. function balise_LISTER_VALEURS_EXTERNES_dist($p) {
  41.         // prendre nom de la cle primaire de l'objet pour calculer sa valeur
  42.         $id_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
  43.         $objet = $p->boucles[$id_boucle]->id_table;
  44.         $_id_objet = $p->boucles[$id_boucle]->primary;
  45.         $id_objet = champ_sql($_id_objet, $p);
  46.         $connect = sql_quote($p->boucles[$id_boucle]->sql_serveur);
  47.        
  48.         // recuperer les parametres : colonne sql (champ) et separateur
  49.         $p->code = "include_spip('balise/lister_valeurs_externes') . calculer_balise_LISTER_VALEURS_EXTERNES('$objet', '$_id_objet', $colonne, $id_objet, $valeur, $connect)";
  50.         $colonne = interprete_argument_balise(1, $p);
  51.         $separateur = interprete_argument_balise(2, $p);
  52.         if (!$separateur) $separateur = "', '";
  53.        
  54.         // demander la colonne dans la requete SQL
  55.         // $colonne doit etre un texte 'nom'
  56.         $texte_colonne = $p->param[0][1][0]->texte;
  57.         $valeur = champ_sql($texte_colonne, $p);
  58.        
  59.         // generer le code d'execution
  60.         $p->code = "calculer_balise_LISTER_VALEURS_EXTERNES('$objet', '$_id_objet', $colonne, $id_objet, $valeur, $connect)";
  61.        
  62.         // retourne un array si #LISTER_VALEURS**
  63.         // sinon fabrique une chaine avec le separateur designe.
  64.         if ($p->etoile != "**") {
  65.                 $p->code = "join($separateur, " . $p->code . ")";
  66.         }
  67.        
  68.         return $p;
  69. }
  70. // retourne un tableau de la liste des valeurs choisies pour un champ extra de table donne
  71. function calculer_balise_LISTER_VALEURS_EXTERNES($objet, $_id_objet, $colonne, $id_objet, $cles, $connect) {
  72.         // recuperer la liste des champs extras existants
  73.         static $champs = array();
  74.         if (!isset($champs[$connect])) {
  75.                 // on parcours un tableau de liens $connect => $url_site
  76.                 // et on tente de recuperer les valeurs depuis le site distant
  77.                 if (array_key_exists($connect, $GLOBALS['correspondances_urls_connect'])) {
  78.                         $url_site = $GLOBALS['correspondances_urls_connect'][$connect];
  79.                         include_spip('inc/distant');
  80.                         $code = recuperer_page($url_site . '?page=' . SCRIPT_RECUPERATION_CHAMPS_EXTERNES);
  81.                         $code = @unserialize(trim($code));
  82.                         if (is_array($code)) {
  83.                                 $champs[$connect] = $code;
  84.                         } else {
  85.                                 // c'est raté, on prend le site en cours, tant pis
  86.                                 $champs[$connect] = pipeline('declarer_champs_extras', array());
  87.                         }
  88.                 } else {
  89.                         // par defaut, on retourne la valeur normale
  90.                         $champs[$connect] = pipeline('declarer_champs_extras', array());
  91.                 }
  92.                
  93.         }
  94.         // exploser les cles !
  95.         $cles = explode(',', $cles);
  96.         // si pas de cles, on part aussi gentiment
  97.         if (!$cles) return array();
  98.                
  99.         // sortir gentiment si pas de champs declares
  100.         // on ne peut pas traduire les cles
  101.         if (!is_array($champs[$connect])) return $cles;
  102.        
  103.         // initialiser les noms corrects d'objet
  104.         $objet = objet_type(table_objet($objet));
  105.         $vals = array();
  106.        
  107.         // on cherche les champs s'appliquant a la meme table  
  108.         foreach ($champs[$connect] as $c) {
  109.                
  110.                 if ($c->enum // sinon pas la peine de continuer
  111.                 and $objet == objet_type(table_objet($c->table)) // attention aux cas compliques site->syndic !
  112.                 and ($colonne == $c->champ)
  113.                 and $c->sql) {
  114.                         // HOP on a trouve le champs extra
  115.                         // il faut calculer le bon retour...
  116.                         // comparer $c->enum aux $cles
  117.                        
  118.                         // 2 possibilites :
  119.                         // - $c->enum = array (plugin)
  120.                         // - $c->enum = string (interface)
  121.                         if (is_array($c->enum)) {
  122.                                 foreach($c->enum as $cle=>$valeur) {
  123.                                         if (in_array($cle, $cles)) $vals[$cle] = $valeur; // et on suppose que c'est deja traduit
  124.                                 }
  125.                         } else {
  126.                                 $liste = explode("\n", $c->enum);
  127.                                 foreach($liste as $l) {
  128.                                         list($cle, $valeur) = explode(',', $l, 2);
  129.                                         if (in_array($cle, $cles)) $vals[$cle] = _T(trim($valeur)); // et on traduit en meme temps...
  130.                                 }
  131.                         }
  132.                         // sortir si trouve
  133.                         break;
  134.                 }
  135.         }
  136.        
  137.         // et voici les valeurs !
  138.         return $vals ? $vals : $cles;
  139. }
  140. ?>