'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 : * * 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; } ?>