Carnet Wiki

extra2 sur une table externe

Version 1 — August 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;
}
?>

Retour à la version courante

Toutes les versions

  • 1 - JLuc, August 2010