Valider 78c9922c rédigé par rastapopoulos@spip.org's avatar rastapopoulos@spip.org
Parcourir les fichiers

Une nouvelle fonctionnalité générique dans bonux : optenir les infos de...

Une nouvelle fonctionnalité générique dans bonux : optenir les infos de n'importe quel type d'objet.

#INFO_<QUOI>{type_objet, id_objet}

Exemple : 
#INFO_TITRE{article, 2}
#INFO_TITRE{patate, #ENV{id_patate}}

Il y a une fontion PHP associé qu'on peut donc utiliser dans ses scripts : generer_info_entite($id_objet, $type_objet, $info).

Par défaut une info est tout simplement le champ SQL de l'objet mais c'est personnalisable par une fonction generer_<quoi>_entite().
En effet, il y a des infos qui sont calculées et ne sont donc pas le champ directement.

De plus, deux infos sont prisent en compte en interne par la fonction : l'URL via generer_url_entite() et le titre car SPIP permet de déclarer un titre autre que le champ SQL "titre".

La fonction respecte la magie de SPIP : l'information demandée va être automatiquement transformée s'il y a des traitements automatiques de déclarés pour cette info (cf. la gobale $table_des_traitements). Notamment pour gérer directement les textes <multi> et autres transformations.
parent d7505040
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -3,7 +3,7 @@
  <auteur>Cedric Morin, Mathieu Marcillaud, romy.tetue.net</auteur>
  <icon>img_pack/spip-bonux.png</icon>
  <licence>(c) 2008-2009 GPL</licence>
  <version>1.8.2</version>
  <version>1.8.3</version>
  <etat>stable</etat>
  <description>Le plugin qui lave plus SPIP que SPIP, avec des chouettes cadeaux dedans ! Interface douce, boucles POUR et CONDITION, tableaux, compteur, etc.</description>
  <lien>http://www.spip-contrib.net/SPIP-Bonux</lien>
+26 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -310,4 +310,30 @@ function balise_BOUTON_ACTION($p){
	$p->interdire_scripts = false;
	return $p;
}

/**
 * Generer n'importe quel info pour un objet : #INFO_ARTICLE{#ENV{id_article}, titre}
 * Utilise la fonction generer_info_entite(), se reporter a sa documentation
 */
function balise_INFO__dist($p){
	$info = $p->nom_champ;
	$type_objet = interprete_argument_balise(1,$p);
	$id_objet = interprete_argument_balise(2,$p);
	if ($info === 'INFO_' or !$type_objet or !$id_objet) {
		$msg = _T('zbug_balise_sans_argument', array('balise' => ' INFO_'));
		erreur_squelette($msg, $p);
		$p->interdire_scripts = false;
		return $p;
	} elseif ($f = charger_fonction($nom, 'balise', true)) {
		return $f($p);
	}else {
		$p->code = champ_sql($info, $p);
		if (strpos($p->code, '@$Pile[0]') !== false) {
			$info = strtolower(substr($info,5));
			$p->code = "generer_info_entite($id_objet, $type_objet, '$info')";
		}
		$p->interdire_scripts = false;
		return $p;
	}
}
?>
+75 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -85,4 +85,78 @@ function picker_identifie_id_rapide($ref,$rubriques=0,$articles=0){
	$titre = attribut_html(extraire_multi($titre));
	return json_export(array('type'=>$type,'id'=>"$type|$id",'titre'=>$titre));
}

/**
 * Donner n'importe quelle information sur un objet de maniere generique.
 *
 * La fonction va gerer en interne deux cas particuliers les plus utilises :
 * l'URL et le titre (qui n'est pas forcemment la champ SQL "titre").
 *
 * On peut ensuite personnaliser les autres infos en creant une fonction
 * generer_<nom_info>_entite($id_objet, $type_objet, $ligne).
 * $ligne correspond a la ligne SQL de tous les champs de l'objet, les fonctions
 * de personnalisation n'ont donc pas a refaire de requete.
 *
 * @param int $id_objet
 * @param string $type_objet
 * @param string $info
 * @return string
 */
function generer_info_entite($id_objet, $type_objet, $info){
	// On verifie qu'on a tout ce qu'il faut
	$id_objet = intval($id_objet);
	if (!($id_objet and $type_objet and $info))
		return '';
	
	// Si on demande l'url, on retourne direct la fonction
	if ($info == 'url')
		return generer_url_entite($id_objet, $type_objet);
	
	// Si on demande le titre, on le gere en interne
	if ($demande_titre = ($info == 'titre')){
		global $table_titre;
		$champ_titre = $table_titre[table_objet($type_objet)];
		if (!$champ_titre) $champ_titre = 'titre';
		$champ_titre = ", $champ_titre";
	}
	
	// Sinon on va tout chercher dans la table et on garde en memoire
	static $objets;
	
	// On ne fait la requete que si on a pas deja l'objet ou si on demande le titre mais qu'on ne l'a pas encore
	if (!$objets[$type_objet][$id_objet] or ($demande_titre and !$objets[$type_objet][$id_objet]['titre'])){
		include_spip('base/abstract_sql');
		include_spip('base/connect_sql');
		$objets[$type_objet][$id_objet] = sql_fetsel(
			'*'.$champ_titre,
			table_objet_sql($type_objet),
			id_table_objet($type_objet).' = '.intval($id_objet)
		);
	}
	$ligne = $objets[$type_objet][$id_objet];
	
	if ($demande_titre)
		$info_generee = $objets[$type_objet][$id_objet]['titre'];
	// Si la fonction generer_TRUC_entite existe, on l'utilise
	else if ($generer = charger_fonction("generer_${info}_entite", '', true))
		$info_generee = $generer($id_objet, $type_objet, $ligne);
	// Sinon on prend le champ SQL
	else
		$info_generee = $ligne[$info];
	
	// On va ensuite chercher les traitements automatiques a faire
	global $table_des_traitements;
	$maj = strtoupper($info);
	$traitement = $table_des_traitements[$maj];
	$table_objet = table_objet($type_objet);
	
	if (is_array($traitement)){
		$traitement = $traitement[isset($traitement[$table_objet]) ? $table_objet : 0];
		$traitement = str_replace('%s', '"'.str_replace('"', '\\"', $info_generee).'"', $traitement);
		eval("\$info_generee = $traitement;");
	}
	
	return $info_generee;
}

?>