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.
- *
- *
- **/
- function get_champs_extras_site() {
- 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
- // on parcours un tableau de liens $connect => $url_site
- // et on tente de recuperer les valeurs depuis le site distant
- $url_site = $GLOBALS['correspondances_urls_connect'][$connect];
- include_spip('inc/distant');
- $code = recuperer_page($url_site . '?page=' . SCRIPT_RECUPERATION_CHAMPS_EXTERNES);
- $champs[$connect] = $code;
- } else {
- // c'est raté, on prend le site en cours, tant pis
- }
- } else {
- // par defaut, on retourne la valeur normale
- }
- }
- // exploser les cles !
- // si pas de cles, on part aussi gentiment
- // sortir gentiment si pas de champs declares
- // on ne peut pas traduire les cles
- // initialiser les noms corrects d'objet
- $objet = objet_type(table_objet($objet));
- // 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)
- foreach($c->enum as $cle=>$valeur) {
- }
- } else {
- foreach($liste as $l) {
- }
- }
- // sortir si trouve
- break;
- }
- }
- // et voici les valeurs !
- return $vals ? $vals : $cles;
- }
- ?>