Carnet Wiki

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

Télécharger

JLuc - Mise à jour :13 août 2010 à 17h58min

Toutes les versions