diff --git a/ecrire/balise/formulaire_ecrire_auteur.php b/ecrire/balise/formulaire_ecrire_auteur.php index 6619ee4a024842776a6089727d9e0a22d2e40948..d53690b30b644d8db5b0605dd446fcb1a243f7d2 100644 --- a/ecrire/balise/formulaire_ecrire_auteur.php +++ b/ecrire/balise/formulaire_ecrire_auteur.php @@ -24,17 +24,23 @@ function balise_FORMULAIRE_ECRIRE_AUTEUR ($p) { } // http://doc.spip.org/@balise_FORMULAIRE_ECRIRE_AUTEUR_stat -function balise_FORMULAIRE_ECRIRE_AUTEUR_stat($args, $filtres) { +function balise_FORMULAIRE_ECRIRE_AUTEUR_stat($args, $context_compil) { include_spip('inc/filtres'); - // Pas d'id_auteur ni d'id_article ? Erreur de squelette $id = intval($args[1]); - if (!$args[0] AND !$id) - return erreur_squelette( - _T('zbug_champ_hors_motif', - array ('champ' => '#FORMULAIRE_ECRIRE_AUTEUR', - 'motif' => 'AUTEURS/ARTICLES')), ''); - + if (!$args[0] AND !$id) { + include_spip('public/interfaces'); + $p = new Contexte; + $p->descr = array('sourcefile' => $context_compil[0], + 'nom' => $context_compil[1]); + $p->id_boucle = $context_compil[2]; + $p->ligne = $context_compil[3]; + $p->lang = $context_compil[4]; + $msg = array('zbug_champ_hors_motif', + array ('champ' => 'FORMULAIRE_ECRIRE_AUTEUR', + 'motif' => 'AUTEURS/ARTICLES')); + return erreur_squelette($msg, $p); + } // Si on est dans un contexte article, // sortir tous les mails des auteurs de l'article if (!$args[0] AND $id) { diff --git a/ecrire/balise/formulaire_signature.php b/ecrire/balise/formulaire_signature.php index 83f6b18972de221e4e1d2ab3a9e2a2a843b8bb19..7c728e410a4ecb9261957db91b262811ce02b0a3 100644 --- a/ecrire/balise/formulaire_signature.php +++ b/ecrire/balise/formulaire_signature.php @@ -31,15 +31,22 @@ function balise_FORMULAIRE_SIGNATURE ($p) { // Verification des arguments (contexte + filtres) // http://doc.spip.org/@balise_FORMULAIRE_SIGNATURE_stat -function balise_FORMULAIRE_SIGNATURE_stat($args, $filtres) { +function balise_FORMULAIRE_SIGNATURE_stat($args, $context_compil) { // pas d'id_article => erreur de squelette - if (!$args[0]) - return erreur_squelette( - _T('zbug_champ_hors_motif', - array ('champ' => '#FORMULAIRE_SIGNATURE', - 'motif' => 'ARTICLES')), ''); - + if (!$args[0]) { + include_spip('public/interfaces'); + $p = new Contexte; + $p->descr = array('sourcefile' => $context_compil[0], + 'nom' => $context_compil[1]); + $p->id_boucle = $context_compil[2]; + $p->ligne = $context_compil[3]; + $p->lang = $context_compil[4]; + $msg = array('zbug_champ_hors_motif', + array ('champ' => 'FORMULAIRE_SIGNATURE', + 'motif' => 'ARTICLES')); + return erreur_squelette($msg, $p); + } // article sans petition => pas de balise else if (!$args[1]) return ''; diff --git a/ecrire/balise/formulaire_site.php b/ecrire/balise/formulaire_site.php index 58ddc38d0a0a9b320366ed268c2900085d71a720..bea717ca477476229052979e0aa3098fd5c57937 100644 --- a/ecrire/balise/formulaire_site.php +++ b/ecrire/balise/formulaire_site.php @@ -21,15 +21,22 @@ function balise_FORMULAIRE_SITE ($p) { } // http://doc.spip.org/@balise_FORMULAIRE_SITE_stat -function balise_FORMULAIRE_SITE_stat($args, $filtres) { +function balise_FORMULAIRE_SITE_stat($args, $context_compil) { // Pas d'id_rubrique ? Erreur de squelette - if (!$args[0]) - return erreur_squelette( - _T('zbug_champ_hors_motif', - array ('champ' => '#FORMULAIRE_SITE', - 'motif' => 'RUBRIQUES')), ''); - + if (!$args[0]) { + include_spip('public/interfaces'); + $p = new Contexte; + $p->descr = array('sourcefile' => $context_compil[0], + 'nom' => $context_compil[1]); + $p->id_boucle = $context_compil[2]; + $p->ligne = $context_compil[3]; + $p->lang = $context_compil[4]; + $msg = array('zbug_champ_hors_motif', + array ('champ' => 'FORMULAIRE_SITE', + 'motif' => 'RUBRIQUES')); + return erreur_squelette($msg, $p); + } // Verifier que les visisteurs sont autorises a proposer un site return (($GLOBALS['meta']["proposer_sites"] != 2) ? '' : $args); diff --git a/ecrire/lang/spip_fr.php b/ecrire/lang/spip_fr.php index 73ba324ad7730f0f2372f1096dbb45e77972e005..bdcb40aaf4ee3f690de55bf9f3333c5b422ff2fb 100644 --- a/ecrire/lang/spip_fr.php +++ b/ecrire/lang/spip_fr.php @@ -750,7 +750,7 @@ et vous reconnecter au site. 'zbug_boucle_recursive_undef' => 'Boucle récursive non définie : @nom@', 'zbug_calcul' => 'calcul', 'zbug_champ_hors_boucle' => 'Champ @champ@ hors boucle', -'zbug_champ_hors_motif' => 'Champ @champ@ hors d\'une boucle de motif @motif@', +'zbug_champ_hors_motif' => 'Champ @champ@ hors d\'un contexte @motif@', 'zbug_code' => 'code', 'zbug_critere_inconnu' => 'Critère inconnu @critere@', 'zbug_distant_interdit' => 'Externe interdit', # Contexte : une base de données "externe", pas gérée par SPIP, mais que SPIP 1.8 sait utiliser dans ses boucles -- seul problèmes certaines manipulations sont interdites sur ces bases-là. diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php index 124d7a469ffdd7baa2a7dcb2bd70e7c8d5160f69..8682b02cce91b28d48d305484a749ad86d601464 100644 --- a/ecrire/public/composer.php +++ b/ecrire/public/composer.php @@ -272,8 +272,16 @@ if ($lang_select) lang_select(); ?' .'>'); -function synthetiser_balise_dynamique($nom, $args, $file, $lang, $ligne) { - $r = sprintf(CODE_INCLURE_BALISE, $lang, $file, $nom, join(", ", array_map('argumenter_squelette', $args)), $ligne); +// Cette fonction fabrique l'appel d'une balise dynamique a l'aide du contexte +// de compilation prepare par calculer_balise_dynamique dans references.php: +// 0: sourcefile +// 1: codefile +// 2: id_boucle +// 3: ligne +// 4: langue + +function synthetiser_balise_dynamique($nom, $args, $file, $context_compil) { + $r = sprintf(CODE_INCLURE_BALISE, $context_compil[4], $file, $nom, join(", ", array_map('argumenter_squelette', $args)), $context_compil[3]); return $r; } @@ -292,7 +300,7 @@ function argumenter_squelette($v) { // verifier leurs arguments et filtres, et calculer le code a inclure // http://doc.spip.org/@executer_balise_dynamique -function executer_balise_dynamique($nom, $args, $autres, $lang, $ligne) { +function executer_balise_dynamique($nom, $args, $context_compil) { if (!$file = find_in_path(strtolower($nom) .'.php', 'balise/', true)) { // regarder si une fonction generique n'existe pas if (($p = strpos($nom,"_")) @@ -307,7 +315,7 @@ function executer_balise_dynamique($nom, $args, $autres, $lang, $ligne) { // Y a-t-il une fonction de traitement des arguments ? $f = 'balise_' . $nom . '_stat'; if (function_exists($f)) - $r = $f($args, $autres); + $r = $f($args, $context_compil); else $r = $args; if (!is_array($r)) @@ -327,12 +335,10 @@ function executer_balise_dynamique($nom, $args, $autres, $lang, $ligne) { } if (!_DIR_RESTREINT) $file = _DIR_RESTREINT_ABS . $file; - return synthetiser_balise_dynamique($nom, $r, $file, $lang, $ligne); + return synthetiser_balise_dynamique($nom, $r, $file, $context_compil); } } - - // http://doc.spip.org/@lister_objets_avec_logos function lister_objets_avec_logos ($type) { global $formats_logos; diff --git a/ecrire/public/interfaces.php b/ecrire/public/interfaces.php index 8f27b59d009899753e5723198282de6bf8bfe2d8..6fe1b0cdd68c9326d476516882e55e02d26aecb3 100644 --- a/ecrire/public/interfaces.php +++ b/ecrire/public/interfaces.php @@ -155,6 +155,13 @@ class Polyglotte { var $ligne = 0; } +class Contexte { + var $descr = array(); + var $id_boucle = ''; + var $ligne = 0; + var $lang = ''; +} + global $table_criteres_infixes; $table_criteres_infixes = array('<', '>', '<=', '>=', '==', '===', '!=', '!==', '<>', '?'); diff --git a/ecrire/public/references.php b/ecrire/public/references.php index 49b4dc4fa77311f4a5e701a241697b07dc06ee60..6f4b0c08d2ebef3c6b4e2756f8757dc7a072afc0 100644 --- a/ecrire/public/references.php +++ b/ecrire/public/references.php @@ -164,9 +164,10 @@ function calculer_champ($p) { // Pour une balise nommmee NOM, elle demande a charger_fonction de chercher // s'il existe une fonction balise_NOM ou balise_NOM_dist // eventuellement en chargeant le fichier balise/NOM.php. -// Si ce n'est pas le cas, hormis le cas historique des balise LOGO_*, -// elle estime que c'est une reference a une colonne de table connue. -// Les surcharges via charger_fonction sont donc possibles. +// Si la balise est de la forme PREFIXE_SUFFIXE (cf LOGO_* et URL_*) +// elle fait de meme avec juste le PREFIXE. +// Si pas de fonction, c'est une reference a une colonne de table SQL connue. +// Les surcharges des colonnes SQL via charger_fonction sont donc possibles. // http://doc.spip.org/@calculer_balise function calculer_balise($nom, $p) { @@ -231,13 +232,11 @@ function calculer_balise_DEFAUT_dist($nom, $p) { // On leur adjoint les arguments explicites de la balise (cf #LOGIN{url}) // et d'eventuelles valeurs transmises d'autorite par la balise. // (cf http://trac.rezo.net/trac/spip/ticket/1728) -// La fonction nomme ci-dessous recevra a l'execution la valeur de tout ca. +// La fonction nommee ci-dessous recevra a l'execution la valeur de tout ca. define('CODE_EXECUTER_BALISE', "executer_balise_dynamique('%s', array(%s%s), - array(%s), - \$GLOBALS['spip_lang'], - %s)"); + array(%s))"); // http://doc.spip.org/@calculer_balise_dynamique function calculer_balise_dynamique($p, $nom, $l, $supp=array()) { @@ -254,11 +253,18 @@ function calculer_balise_dynamique($p, $nom, $l, $supp=array()) { $param = compose_filtres_args($p, $c, ','); } else $param = ""; $collecte = join(',', collecter_balise_dynamique($l, $p, $nom)); + $supp = array_merge(array( + _q($p->descr['sourcefile']), + _q($p->descr['nom']), + _q($p->id_boucle), + intval($p->ligne), + _q($GLOBALS['spip_lang'])), + $supp); + $p->code = sprintf(CODE_EXECUTER_BALISE, $nom, $collecte, ($collecte ? $param : substr($param,1)), # virer la virgule - join(',', $supp), - $p->ligne); + join(',', $supp)); $p->interdire_scripts = false; return $p;