From 0b59ea67aef6007acc4d30d78ceba528a5e0be64 Mon Sep 17 00:00:00 2001 From: Fil <fil@rezo.net> Date: Mon, 5 Mar 2007 11:34:57 +0000 Subject: [PATCH] introduction de la notation <INCLURE{fond=truc}{env}> qui passe tout l'environnement de la page incluante a la page incluse ; au passage j'ai nettoye plusieurs facilites dans le debugueur, la pagination etc, qui devenaient des bugs si on creusait un peu (notamment : avec #INCLURE le contexte affiche par le debugueur etait celui de la page incluante) --- ecrire/inc/filtres.php | 31 +++++++++++++++++++++++++++---- ecrire/public/balises.php | 26 ++++++++++++++++++-------- ecrire/public/compiler.php | 20 ++++++++++++++------ ecrire/public/criteres.php | 4 ++-- ecrire/public/debug.php | 11 +++-------- ecrire/public/parametrer.php | 4 ++++ 6 files changed, 68 insertions(+), 28 deletions(-) diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php index a8472a2f09..5a0343ee76 100644 --- a/ecrire/inc/filtres.php +++ b/ecrire/inc/filtres.php @@ -1608,14 +1608,14 @@ function calcul_bornes_pagination($courante, $nombre, $max = 10) { // // http://doc.spip.org/@calcul_pagination -function calcul_pagination($total, $nom, $pas, $liste = true, $modele='') { +function calcul_pagination($total, $nom, $position, $pas, $liste = true, $modele='') { static $ancres = array(); $bloc_ancre = ""; if ($pas<1) return; if (function_exists("pagination")) - return pagination($total, $nom, $pas, $liste); + return pagination($total, $nom, $position, $pas, $liste); $debut = 'debut'.$nom; $ancre='pagination'.$nom; @@ -1628,10 +1628,10 @@ function calcul_pagination($total, $nom, $pas, $liste = true, $modele='') { 'debut' => 'debut'.$nom, 'url' => parametre_url(self(),'fragment',''), // nettoyer l'id ahah eventuel 'total' => $total, - 'position' => intval(_request($debut)), + 'position' => intval($position), 'pas' => $pas, 'nombre_pages' => floor(($total-1)/$pas)+1, - 'page_courante' => floor(intval(_request($debut))/$pas)+1, + 'page_courante' => floor(intval($position)/$pas)+1, 'ancre' => $ancre, 'bloc_ancre' => $bloc_ancre ); @@ -1944,4 +1944,27 @@ function compacte($source, $format = null) { return $compacte($source); } + +// clone de http://php.net/var_export compatible < 4.2.0 et sans ob_xx +function spip_var_export($s) { + if (is_array($s)) { + foreach ($s as $k=>$v) + $s[$k] = spip_var_export($k) . ' => ' . spip_var_export($v); + return 'array(' . join(',',$s).')'; + } + + return is_null($s) + ? 'null' + : (is_bool($s) + ? ($s ? 'true' : 'false') + : (is_numeric($s) + ? "$s" + : (is_string($s) + ? "'".addslashes($s)."'" + : "'".gettype($s)."'" + ) + ) + ); +} + ?> diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php index 8238eabcbd..3d7cf54e3e 100644 --- a/ecrire/public/balises.php +++ b/ecrire/public/balises.php @@ -636,7 +636,7 @@ function balise_PAGINATION_dist($p, $liste='true') { } // s'il n'y a pas de total_parties, c'est qu'on se trouve - // dans un boucle recurive ou qu'on a oublie le critere {pagination} + // dans un boucle recursive ou qu'on a oublie le critere {pagination} if (!$p->boucles[$b]->total_parties) { erreur_squelette( _T('zbug_pagination_sans_critere', @@ -646,16 +646,17 @@ function balise_PAGINATION_dist($p, $liste='true') { return $p; } $__modele = interprete_argument_balise(1,$p); - $__modele = $__modele?",$__modele":""; + $__modele = $__modele?", $__modele":""; $p->boucles[$b]->numrows = true; $p->code = "calcul_pagination( (isset(\$Numrows['$b']['grand_total']) ? \$Numrows['$b']['grand_total'] : \$Numrows['$b']['total'] - ), ".$p->boucles[$b]->modificateur['debut_nom'].", " + ), ".$p->boucles[$b]->modificateur['debut_nom'].", + \$Pile[0]['debut'.".$p->boucles[$b]->modificateur['debut_nom']."]," . $p->boucles[$b]->total_parties - . ", $liste $__modele)"; + . ", $liste$__modele)"; $p->interdire_scripts = false; return $p; @@ -1172,6 +1173,7 @@ function balise_INSERT_HEAD_dist($p) { // l'inclusion est realisee au calcul du squelette, pas au service // ainsi le produit du squelette peut etre utilise en entree de filtres a suivre // on peut faire un #INCLURE{fichier} sans squelette +// (Incompatible avec les balises dynamiques) // http://doc.spip.org/@balise_INCLUDE_dist function balise_INCLUDE_dist($p) { if(function_exists('balise_INCLURE')) @@ -1182,16 +1184,24 @@ function balise_INCLUDE_dist($p) { // http://doc.spip.org/@balise_INCLURE_dist function balise_INCLURE_dist($p) { $champ = phraser_arguments_inclure($p, true); - $l = argumenter_inclure($champ, $p->descr, $p->boucles, $p->id_boucle, false); + $_contexte = argumenter_inclure($champ, $p->descr, $p->boucles, $p->id_boucle, false); - if (isset($l['fond'])) { - $p->code = "recuperer_fond('',array(".implode(',',$l)."))"; + if (isset($_contexte['fond'])) { + if (isset($_contexte['env'])) { + $flag_env = true; + unset($_contexte['env']); + } + $l = 'array(' . join(",\n\t", $_contexte) .')'; + if ($flag_env) { + $l = "array_merge(\$Pile[0],$l)"; + } + $p->code = "recuperer_fond('',".$l.")"; } else { $n = interprete_argument_balise(1,$p); $p->code = '(($c = find_in_path(' . $n . ')) ? spip_file_get_contents($c) : "")'; } - $p->interdire_scripts = false; + $p->interdire_scripts = false; // la securite est assuree par recuperer_fond return $p; } diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php index 51f815ce39..2b0db70787 100644 --- a/ecrire/public/compiler.php +++ b/ecrire/public/compiler.php @@ -45,9 +45,9 @@ function argumenter_inclure($struct, $descr, &$boucles, $id_boucle, $echap=true) $lang = ''; foreach($struct->param as $val) { $var = array_shift($val); - if ($var == 'lang') + if ($var == 'lang') { $lang = $val; - else + } else $l[$var] = ($echap?"\'$var\' => ' . argumenter_squelette(":"'$var' => ") . ($val ? calculer_liste($val[0], $descr, $boucles, $id_boucle) @@ -91,11 +91,19 @@ function calculer_inclure($struct, $descr, &$boucles, $id_boucle) { } } + $_contexte = argumenter_inclure($struct, $descr, $boucles, $id_boucle); + if (isset($_contexte['env'])) { + $flag_env = true; + unset($_contexte['env']); + } + $contexte = 'array(' . join(",\n\t", $_contexte) .')'; + if ($flag_env) { + $contexte = "array_merge('.spip_var_export(\$Pile[0]).',$contexte)"; + } + return "\n'<". - "?php\n\t\$contexte_inclus = array(" . - join(",\n\t", argumenter_inclure($struct, $descr, $boucles, $id_boucle)) . - ");" . - "\n\tinclude(" . + "?php\n\t\$contexte_inclus = $contexte;" + . "\n\tinclude(" . ($fichier ? "\\'$path\\'" : ('_DIR_RESTREINT . "public.php"')). ");" . "\n?'." . "'>'"; diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php index 8ce3ff0e1f..089e58d1fb 100644 --- a/ecrire/public/criteres.php +++ b/ecrire/public/criteres.php @@ -89,7 +89,7 @@ function critere_lang_select_dist($idb, &$boucles, $crit) { // http://doc.spip.org/@critere_debut_dist function critere_debut_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; - $boucle->limit = 'intval($GLOBALS["debut' . + $boucle->limit = 'intval($Pile[0]["debut' . $crit->param[0][0]->texte . '"]) . ",' . $crit->param[1][0]->texte . @@ -110,7 +110,7 @@ function critere_pagination_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $boucle->mode_partie = 'p+'; - $boucle->partie = 'intval(_request("debut".'.$debut.'))'; + $boucle->partie = 'intval($Pile[0][\'debut\'.'.$debut.'])'; $boucle->modificateur['debut_nom'] = $debut; $boucle->total_parties = $pas; if (!isset($boucle->modificateur['fragment'])) diff --git a/ecrire/public/debug.php b/ecrire/public/debug.php index 76b2285429..fa5faeb24a 100644 --- a/ecrire/public/debug.php +++ b/ecrire/public/debug.php @@ -197,13 +197,8 @@ function squelette_debug_compile($nom, $sourcefile, $code, $squelette) { $debug_objets['squelette'][$nom] = $squelette; $debug_objets['sourcefile'][$nom] = $sourcefile; - if (is_array($GLOBALS['contexte_inclus'])) - $debug_objets['contexte'][$nom] = $GLOBALS['contexte_inclus']; - else { - $debug_objets['contexte'][$nom] = calculer_contexte(); - if (!isset($debug_objets['principal'])) - $debug_objets['principal'] = $nom; - } + if (!isset($debug_objets['principal'])) + $debug_objets['principal'] = $nom; } // appelee a chaque analyse syntaxique de squelette @@ -390,7 +385,7 @@ function debug_dumpfile ($texte, $fonc, $type) { echo "\n<a href='$self&var_mode_objet=$nom_skel&var_mode_affiche=resultat#$nom_skel'>"._T('zbug_resultat')."</a>"; echo "\n<a href='$self&var_mode_objet=$nom_skel&var_mode_affiche=code#$nom_skel'>"._T('zbug_code')."</a></legend>"; - if (is_array($contexte = $debug_objets['contexte'][$nom_skel])) + if (is_array($contexte = $debug_objets['contexte'][$sourcefile])) echo afficher_debug_contexte($contexte); $i = 0; diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php index d6976ade05..94b85e7eec 100644 --- a/ecrire/public/parametrer.php +++ b/ecrire/public/parametrer.php @@ -316,6 +316,10 @@ function public_parametrer_dist($fond, $local='', $cache='') { $composer = charger_fonction('composer', 'public'); + // Le debugueur veut afficher le contexte + if ($GLOBALS['var_mode'] == 'debug') + $GLOBALS['debug_objets']['contexte'][$sourcefile] = $local; + if ($fonc = $composer($skel, $mime_type, $gram, $sourcefile)){ spip_timer($a = 'calcul page '.rand(0,1000)); $page = $fonc(array('cache' => $cache), array($local)); -- GitLab