Carnet Wiki

extra2 sur une table externe

SPIP-Contrib :: Carnet Wiki :: 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. /**
  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