From 2f26f866107247fe90ff29b819d60d9dfa4bc7ff Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Thu, 17 Aug 2006 07:54:49 +0000
Subject: [PATCH] le modele #LESAUTEURS n'a plus besoin d'une fonction
 balise_LESAUTEURS_dist(); meilleure recuperation du contexte des modeles - a
 noter, un truc rigolo : on a ainsi cree les balises #DOC, #IMG pour la boucle
 (DOCUMENTS)

---
 dist/modeles/lesauteurs.html  | 14 ++++++++--
 dist/modeles/traductions.html | 31 ++++++++++++---------
 ecrire/public/balises.php     | 52 ++++++++++++++---------------------
 ecrire/public/references.php  | 18 ++++++------
 4 files changed, 60 insertions(+), 55 deletions(-)

diff --git a/dist/modeles/lesauteurs.html b/dist/modeles/lesauteurs.html
index 316eb642d7..069894b2b0 100644
--- a/dist/modeles/lesauteurs.html
+++ b/dist/modeles/lesauteurs.html
@@ -1,2 +1,12 @@
-<BOUCLE_auteurs(AUTEURS) {id_article} {par nom} {", "}>[
-<a href="#URL_AUTEUR">(#NOM)</a>]</BOUCLE_auteurs>
\ No newline at end of file
+[(#REM)
+
+	Modele pour #LESAUTEURS :
+	* s'il s'agit d'un article normal, on boucle sur les auteurs de l'article
+	* s'il s'agit d'un article syndique, on affiche la valeur du champ,
+	  passee dans #ENV par le compilo, en la securisant avec safehtml.
+
+]
+<BOUCLE_auteurs(AUTEURS) {id_article} {par nom} {", "}>
+<a href="#URL_AUTEUR">#NOM</a></BOUCLE_auteurs>
+
+<BOUCLE_syndic(SYNDIC_ARTICLES) {id_syndic_article}>[(#ENV**{lesauteurs}|safehtml)]</BOUCLE_syndic>
diff --git a/dist/modeles/traductions.html b/dist/modeles/traductions.html
index f0d913cd82..8b0a953db3 100644
--- a/dist/modeles/traductions.html
+++ b/dist/modeles/traductions.html
@@ -1,13 +1,18 @@
-<BOUCLE_article(ARTICLES){id_article}>
- [(#REM) Traductions de l'article ]
- <B_traductions>
- <div class="traductions">
- 	<p><:trad_article_traduction:></p>
- 	<ul>
- 		<BOUCLE_traductions(ARTICLES) {traduction} {par lang}>
- 		<li lang="#LANG" xml:lang="#LANG" dir="#LANG_DIR"[ class="(#EXPOSE)"]>&#91;<#EXPOSE{span,a href="#URL_ARTICLE"} rel="alternate" hreflang="#LANG" title="[(#LANG|traduire_nom_langue)][ : (#TITRE|couper{80}|texte_backend)]">#LANG</#EXPOSE{span,a}>&#93;</li>
- 		</BOUCLE_traductions>
- 	</ul>
- </div>
- </B_traductions>
-</BOUCLE_article>
\ No newline at end of file
+[(#REM)
+
+	Modele pour les traductions d'un article
+
+]<BOUCLE_article(ARTICLES){id_article}>
+<B_traductions>
+<div class="traductions">
+<p><:trad_article_traduction:></p>
+<ul><BOUCLE_traductions(ARTICLES) {traduction} {par lang}>
+	<li lang="#LANG" xml:lang="#LANG" dir="#LANG_DIR"[ class="(#EXPOSE)"]>&#91;[(#EXPOSE{
+		<span>,
+		<a href="#URL_ARTICLE" rel="alternate" hreflang="#LANG"
+		title="[(#LANG|traduire_nom_langue)][ - (#TITRE|texte_backend)]">}
+	)]#LANG#EXPOSE{</span>,</a>}&#93;</li></BOUCLE_traductions>
+</ul>
+</div>
+</B_traductions>
+</BOUCLE_article>
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index c780b486d3..aebaf4e8da 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -543,44 +543,32 @@ function balise_RANG_dist ($p) {
 }
 
 
-// #LESAUTEURS
-// les auteurs d'un article (ou d'un article syndique)
-// http://www.spip.net/fr_article902.html
-// http://www.spip.net/fr_article911.html
-// http://doc.spip.org/@balise_LESAUTEURS_dist
-function balise_LESAUTEURS_dist ($p) {
-	// Cherche le champ 'lesauteurs' dans la pile
-	$_lesauteurs = champ_sql('lesauteurs', $p); 
-
-	// Si le champ n'existe pas (cas de spip_articles), on donne la
-	// construction speciale sql_auteurs(id_article) ;
-	// dans le cas contraire on prend le champ 'les_auteurs' (cas de
-	// spip_syndic_articles)
-	if ($_lesauteurs AND $_lesauteurs != '$Pile[0][\'lesauteurs\']') {
-		$p->code = $_lesauteurs;
-	} else {
-		$p->code = "recuperer_fond(
-   'modeles/lesauteurs',
-   array('id_article' => ".champ_sql('id_article', $p).")
-  )";
-	}
-
-	$p->interdire_scripts = false; // securite apposee par recuperer_fond()
-	return $p;
-}
-
 // #MODELE
 // fonction speciale d'appel a un modele modeles/truc.html pour la balise #TRUC
+// exemples : #LESAUTEURS, #TRADUCTIONS, #DOC, #IMG...
 // http://doc.spip.org/@balise_MODELE_dist
 function balise_MODELE_dist($p){
+	$nom = strtolower($p->nom_champ);
+	$contexte = array();
 
- $nom = strtolower($p->nom_champ);
-	$p->code = "recuperer_fond(
-  'modeles/".$nom."',
-  \$GLOBALS['contexte']
- )";
+	// Si le champ existe dans la pile, on le met dans le contexte
+	// (exemple : #LESAUTEURS dans spip_syndic_articles)
+	$contexte[$nom] = champ_sql($nom, $p);
+
+	// Reserver la cle primaire de la boucle courante
+	if ($primary = $p->boucles[$p->id_boucle]->primary) {
+		$id = champ_sql($primary, $p);
+		$contexte[$primary] = $id;
+	}
+
+	// Preparer le code du contexte (id + champ)
+	foreach($contexte as $var=>$code)
+		$contexte[$var] = "'$var' => $code";
+
+	$p->code = "recuperer_fond('modeles/".$nom."',
+		array(".join(',', $contexte)."))";
+	$p->interdire_scripts = false; // securite assuree par le squelette
 
-	#$p->interdire_scripts = true;
 	return $p;
 }
 
diff --git a/ecrire/public/references.php b/ecrire/public/references.php
index 148b37f5f0..113ec94084 100644
--- a/ecrire/public/references.php
+++ b/ecrire/public/references.php
@@ -198,13 +198,14 @@ function calculer_champ($p) {
 // http://doc.spip.org/@calculer_balise
 function calculer_balise($nom, $p) {
 
-	$f = charger_fonction($nom, 'balise', true);
+	// S'agit-t-il d'une balise_XXXX[_dist]() ?
+	if ($f = charger_fonction($nom, 'balise', true))
+		return $f($p);
 
-	if ($f) return $f($p);
+	// S'agit-t-il d'un modele ?
+	if (find_in_path('modeles/'.strtolower($nom).'.html'))
+		return balise_MODELE_dist($p);
 
- if(find_in_path('modeles/'.strtolower($nom).'.html'))
-  return balise_MODELE_dist($p);
- 
 	// S'agit-il d'un logo ? Une fonction speciale les traite tous
 	if (ereg('^LOGO_', $nom)) {
 		$res = calculer_balise_logo($p);
@@ -217,10 +218,11 @@ function calculer_balise($nom, $p) {
 
 	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
 	// il faut recracher {...} quand ce n'est finalement pas des args
-	if ($p->fonctions AND (!$p->fonctions[0][0]) AND $p->fonctions[0][1])
+	if ($p->fonctions AND (!$p->fonctions[0][0]) AND $p->fonctions[0][1]) {
+		$code = addslashes($p->fonctions[0][1]);
+		$p->code .= " . '$code'";
+	}
 
-	  {	$code = addslashes($p->fonctions[0][1]);
-		$p->code .= " . '$code'";}
 	// ne pas passer le filtre securite sur les id_xxx
 	if (strpos($nom, 'ID_') === 0)
 		$p->interdire_scripts = false;
-- 
GitLab