Version 1 — Août 2010 — JLuc
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
<?php
/**
* Licence GPL / Matthieu Marcillaud, pour Alexandra Guiderdoni
*
* Nouvelle balise LISTER_VALEURS_EXTERNES pour Champs Extras
* afin de puiser les listes des champs extras sur une valeur
* de $connect qui n'appartient pas au site en cours.
*
* Soit le site B affichant des infos du site A
* 1) placer ce fichier sur les 2 sites, dans un chemin du path de SPIP,
* dans le dossier balise/
* par exemple dans le dossier squelettes/balise/lister_valeurs_externes.php
* 2) sur le site B, faire charger le fichier à chaque calcul (faire charger une correspondance connect/url) par spip,
* déclarer dans le fichier d'option la correspondance entre connect et
* l'url du site dans une globale 'correspondances_urls_connect'
* (Note : elle n'est pas de SPIP mais est créée pour l'occasion)
* $GLOBALS['correspondances_urls_connect'] = array(
* 'site1' => 'http://url_du_spip.org/',
* 'nom_connect' => 'url',
* );
* 3) sur le site A, ajouter un squelette dans un path de SPIP,
* par exemple dans le dossier squelettes/, nommé 'get_champs_extras.html',
* et contenant :
* [(#VAL|get_champs_extras_site)]
* associé à un fichier 'get_champs_extras_fonctions.php' contenant :
* <?php include_spip('balise/lister_valeurs_externes'); ?>
* 4) sur le site B, appeler dans son squelettes
* #LISTER_VALEURS_EXTERNES{champ_sql}
* La balise ira chercher le $connect en cours pour déterminer les valeurs
* a afficher.
*
*
**/
define('SCRIPT_RECUPERATION_CHAMPS_EXTERNES', 'get_champs_extras');
function get_champs_extras_site() {
$ce = pipeline('declarer_champs_extras', array());
$ce = serialize($ce);
return $ce;
}
function balise_LISTER_VALEURS_EXTERNES_dist($p) {
// prendre nom de la cle primaire de l'objet pour calculer sa valeur
$id_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
$objet = $p->boucles[$id_boucle]->id_table;
$_id_objet = $p->boucles[$id_boucle]->primary;
$id_objet = champ_sql($_id_objet, $p);
$connect = sql_quote($p->boucles[$id_boucle]->sql_serveur);
// recuperer les parametres : colonne sql (champ) et separateur
$p->code = "include_spip('balise/lister_valeurs_externes') . calculer_balise_LISTER_VALEURS_EXTERNES('$objet', '$_id_objet', $colonne, $id_objet, $valeur, $connect)";
$colonne = interprete_argument_balise(1, $p);
$separateur = interprete_argument_balise(2, $p);
if (!$separateur) $separateur = "', '";
// demander la colonne dans la requete SQL
// $colonne doit etre un texte 'nom'
$texte_colonne = $p->param[0][1][0]->texte;
$valeur = champ_sql($texte_colonne, $p);
// generer le code d'execution
$p->code = "calculer_balise_LISTER_VALEURS_EXTERNES('$objet', '$_id_objet', $colonne, $id_objet, $valeur, $connect)";
// retourne un array si #LISTER_VALEURS**
// sinon fabrique une chaine avec le separateur designe.
if ($p->etoile != "**") {
$p->code = "join($separateur, " . $p->code . ")";
}
return $p;
}
// retourne un tableau de la liste des valeurs choisies pour un champ extra de table donne
function calculer_balise_LISTER_VALEURS_EXTERNES($objet, $_id_objet, $colonne, $id_objet, $cles, $connect) {
// recuperer la liste des champs extras existants
static $champs = array();
if (!isset($champs[$connect])) {
// on parcours un tableau de liens $connect => $url_site
// et on tente de recuperer les valeurs depuis le site distant
if (array_key_exists($connect, $GLOBALS['correspondances_urls_connect'])) {
$url_site = $GLOBALS['correspondances_urls_connect'][$connect];
include_spip('inc/distant');
$code = recuperer_page($url_site . '?page=' . SCRIPT_RECUPERATION_CHAMPS_EXTERNES);
$code = @unserialize(trim($code));
if (is_array($code)) {
$champs[$connect] = $code;
} else {
// c'est raté, on prend le site en cours, tant pis
$champs[$connect] = pipeline('declarer_champs_extras', array());
}
} else {
// par defaut, on retourne la valeur normale
$champs[$connect] = pipeline('declarer_champs_extras', array());
}
}
// exploser les cles !
$cles = explode(',', $cles);
// si pas de cles, on part aussi gentiment
if (!$cles) return array();
// sortir gentiment si pas de champs declares
// on ne peut pas traduire les cles
if (!is_array($champs[$connect])) return $cles;
// initialiser les noms corrects d'objet
$objet = objet_type(table_objet($objet));
$vals = array();
// on cherche les champs s'appliquant a la meme table
foreach ($champs[$connect] as $c) {
if ($c->enum // sinon pas la peine de continuer
and $objet == objet_type(table_objet($c->table)) // attention aux cas compliques site->syndic !
and ($colonne == $c->champ)
and $c->sql) {
// HOP on a trouve le champs extra
// il faut calculer le bon retour...
// comparer $c->enum aux $cles
// 2 possibilites :
// - $c->enum = array (plugin)
// - $c->enum = string (interface)
if (is_array($c->enum)) {
foreach($c->enum as $cle=>$valeur) {
if (in_array($cle, $cles)) $vals[$cle] = $valeur; // et on suppose que c'est deja traduit
}
} else {
$liste = explode("\n", $c->enum);
foreach($liste as $l) {
list($cle, $valeur) = explode(',', $l, 2);
if (in_array($cle, $cles)) $vals[$cle] = _T(trim($valeur)); // et on traduit en meme temps...
}
}
// sortir si trouve
break;
}
}
// et voici les valeurs !
return $vals ? $vals : $cles;
}
?>