diff --git a/inc-admin.php3 b/inc-admin.php3 index 829c9c17a743e8e516eb6a48a3ab77210dc0bc82..10c7f04da1e348bd69a4a09ed29dbe13b2ff640e 100644 --- a/inc-admin.php3 +++ b/inc-admin.php3 @@ -180,26 +180,24 @@ function affiche_contexte_erreur($texte) { // ajouter &var_debug=oui pour voir les erreurs et en parler sur spip@rezo.net function affiche_erreurs_execution_page() { - global $tableau_des_erreurs, $affiche_boutons_admin; - echo "<div style='height: 100%; width: 100%; position: absolute; top: 10px; z-index: 1000; background-color: pink;'>"; - if (!$affiche_boutons_admin) - echo "<h2>",(_T('info_travaux_titre')), "</h2>"; - else { - echo "<h2>", - _L("Squelette invalide"), - "</h2>", - "<p>", - _L("PHP a rencontré les erreurs suivantes :"), - "<code><ul>"; - foreach ($tableau_des_erreurs as $err) { - echo "<li>$err[2] $err[3] $err[1]", - "<small>$err[4]</small><br><br>", - "</li>\n"; - } - echo "</ul></code>"; - $GLOBALS['bouton_admin_debug'] = true; + global $tableau_des_erreurs, $affiche_boutons_admin; + + if ($affiche_boutons_admin) { + echo "<div style='position: absolute; top: 10px; + z-index: 1000; background-color: pink;'>"; + echo "<h2>", + _L("Erreur(s) dans le squelette"), + "</h2>", + "<code><ul>"; + foreach ($tableau_des_erreurs as $err) { + echo "<li>$err[2] $err[3] $err[1]", + "<small>$err[4]</small><br><br>", + "</li>\n"; + } + echo "</ul></code>"; + echo "</div>"; + $GLOBALS['bouton_admin_debug'] = true; } - echo "</div>"; } // @@ -253,24 +251,25 @@ function erreur_requete_boucle($query, $id_boucle, $type) { // -// Erreur de syntaxe des squelettes : afficher le code fautif +// Erreur de syntaxe des squelettes : memoriser le code fautif // -function erreur_squelette($message, $lieu) { +function erreur_squelette($message='', $lieu='') { global $auteur_session; static $runs; - + + if (is_array($message)) list($message, $lieu) = $message; + spip_log("Erreur squelette: $message | $lieu (" . $GLOBALS['fond'].".html)"); $GLOBALS['bouton_admin_debug'] = true; spip_error_handler(1," $message $lieu ", '','','?'); // Eviter les boucles infernales if (++$runs > 4) { - if (!$HTTP_COOKIE_VARS['spip_admin'] AND - !$auteur_session AND - !$GLOBALS['var_debug']) - $messages = "<h2>".(_T('info_travaux_titre')). "</h2>"; - die ("<div style='position: fixed; top: 10px; left: 10px; - z-index: 10000; background-color: pink;'>$message</div>"); + if ($HTTP_COOKIE_VARS['spip_admin'] OR + $auteur_session['statut'] == '0minirezo' OR + $GLOBALS['var_debug']) + die ("<div style='position: fixed; top: 10px; left: 10px; + z-index: 10000; background-color: pink;'>$message</div>"); } } diff --git a/inc-compilo-index.php3 b/inc-compilo-index.php3 index a2d6e3ce840b4a2062fed4102a517de9f5e65b86..c2a5f14406a3b9789f0f4511962e545fb42de3c7 100644 --- a/inc-compilo-index.php3 +++ b/inc-compilo-index.php3 @@ -31,7 +31,7 @@ function index_pile($idb, $nom_champ, &$boucles, $explicite='') { $c = strtolower($nom_champ); // attention: entre la boucle nommee 0, "" et le tableau vide, - // il y a incoh�rences qu'il vaut mieux �viter + // il y a incoherences qu'il vaut mieux eviter while ($boucles[$idb]) { # spip_log("Cherche: $nom_champ '$idb' '$c'"); $r = $boucles[$idb]->type_requete; diff --git a/inc-compilo.php3 b/inc-compilo.php3 index 10378a7083615d799b478ff5f937d20d164afe63..1c8ef4c1907a9649c40518ef889f938b3267129c 100644 --- a/inc-compilo.php3 +++ b/inc-compilo.php3 @@ -12,29 +12,21 @@ define("_INC_COMPILO", "1"); // Definition de la structure $p, et fonctions de recherche et de reservation // dans l'arborescence des boucles include_local("inc-compilo-index.php3"); # index ? structure ? pile ? -#include_local("inc-index-squel.php3"); # (anciens noms des fichiers) // definition des boucles include_local("inc-boucles.php3"); -#include_local("inc-reqsql-squel.php3"); // definition des criteres include_local("inc-criteres.php3"); -#include_local("inc-arg-squel.php3"); // definition des balises include_local("inc-balises.php3"); -#include_local("inc-logo-squel.php3"); -#include_local("inc-vrac-squel.php3"); // gestion des balises de forums include_local("inc-forum.php3"); -#include_local("inc-form-squel.php3"); // definition de l'API include_local("inc-compilo-api.php3"); -#include_local("inc-bcl-squel.php3"); -#include_local("inc-champ-squel.php3"); # definition des tables include_ecrire('inc_serialbase.php3'); @@ -439,7 +431,7 @@ function calculer_liste($tableau, $descr, &$boucles, $id_boucle='', $niv=1) { $p->params, $id_boucle, $boucles); - $commentaire = "<INCLURE($p->fichier)>"; + $commentaire = '<INCLURE('.$p->fichier.')>'; $avant=''; $apres=''; $altern = "''"; @@ -454,16 +446,18 @@ function calculer_liste($tableau, $descr, &$boucles, $id_boucle='', $niv=1) { ereg_replace("-","_", $nom) . $descr['nom'] . '($Cache, $Pile, $doublons, $Numrows, $SP)'; $commentaire=''; - $avant = calculer_liste($p->cond_avant, $newdescr, $boucles, $id_boucle, $niv+2); - $apres = calculer_liste($p->cond_apres, $newdescr, $boucles, $id_boucle, $niv+2); - $altern = calculer_liste($p->cond_altern, $newdescr, $boucles, $id_boucle, $niv+1); + $avant = calculer_liste($p->cond_avant, + $newdescr, $boucles, $id_boucle, $niv+2); + $apres = calculer_liste($p->cond_apres, + $newdescr, $boucles, $id_boucle, $niv+2); + $altern = calculer_liste($p->cond_altern, + $newdescr, $boucles, $id_boucle, $niv+1); break; // balise SPIP default: - // cette structure pourrait etre completee d�s le phras� (a faire) - + // cette structure pourrait etre completee des le phrase' (a faire) $p->id_boucle = $id_boucle; $p->boucles = &$boucles; $p->id_mere = $descr['id_mere']; @@ -473,8 +467,10 @@ function calculer_liste($tableau, $descr, &$boucles, $id_boucle='', $niv=1) { $code = calculer_champ($p); $commentaire = '#' . $p->nom_champ . $p->etoile; - $avant = calculer_liste($p->cond_avant, $descr, $boucles, $id_boucle, $niv+1); - $apres = calculer_liste($p->cond_apres, $descr, $boucles, $id_boucle, $niv+1); + $avant = calculer_liste($p->cond_avant, + $descr, $boucles, $id_boucle, $niv+1); + $apres = calculer_liste($p->cond_apres, + $descr, $boucles, $id_boucle, $niv+1); $altern = "''"; break; @@ -526,7 +522,7 @@ function calculer_squelette($squelette, $nom, $gram, $sourcefile) { # include_local('inc-compilo-debug.php3'); # afftable($racine); # affboucles($boucles); - + // tableau des informations sur le squelette $descr = array('nom' => $nom, 'documents' => false); @@ -541,48 +537,48 @@ function calculer_squelette($squelette, $nom, $gram, $sourcefile) { // Commencer par reperer les boucles appelees explicitement // car elles indexent les arguments de maniere derogatoire foreach($boucles as $id => $boucle) { - if ($boucle->type_requete == 'boucle') { - $rec = &$boucles[$boucle->param]; - if (!$rec) { - return array(_T('info_erreur_squelette'), - ($boucle->param . - _L(' boucle recursive non definie'))); - } - $rec->externe = $id; - $descr['id_mere'] = $id; - $boucles[$id]->return = - calculer_liste(array($rec), - $descr, - $boucles, - $boucle->param); - } - } - foreach($boucles as $id => $boucle) - { - $type = $boucle->type_requete; - if ($type != 'boucle') - { - $boucles[$id]->id_table = $table_des_tables[$type]; - if ($boucles[$id]->id_table) { - $boucles[$id]->primary = $table_primary[$type]; - } else { - // table non Spip. - $boucles[$id]->id_table = $type; - $serveur = $boucle->sql_serveur; - $boucles[$id]->primary = $tables_des_serveurs_sql[$serveur ? $serveur : 'localhost'][$type]['key']["PRIMARY KEY"]; - } - if ($boucle->param) { - $res = calculer_criteres($id, $boucles); - if (is_array($res)) return $res; # erreur + if ($boucle->type_requete == 'boucle') { + $rec = &$boucles[$boucle->param]; + if (!$rec) { + return array(_T('info_erreur_squelette'), + ($boucle->param + . _L(' boucle recursive non definie'))); + } else { + $rec->externe = $id; + $descr['id_mere'] = $id; + $boucles[$id]->return = + calculer_liste(array($rec), + $descr, + $boucles, + $boucle->param); + } } - $descr['id_mere'] = $id; - $boucles[$id]->return = - calculer_liste($boucle->milieu, + } + foreach($boucles as $id => $boucle) { + $type = $boucle->type_requete; + if ($type != 'boucle') { + $boucles[$id]->id_table = $table_des_tables[$type]; + if ($boucles[$id]->id_table) { + $boucles[$id]->primary = $table_primary[$type]; + } else { + // table non Spip. + $boucles[$id]->id_table = $type; + $serveur = $boucle->sql_serveur; + $boucles[$id]->primary = $tables_des_serveurs_sql[$serveur ? $serveur : 'localhost'][$type]['key']["PRIMARY KEY"]; + } + if ($boucle->param) { + $res = calculer_criteres($id, $boucles); + if (is_array($res)) + return $res; # erreur + } + $descr['id_mere'] = $id; + $boucles[$id]->return = + calculer_liste($boucle->milieu, $descr, $boucles, $id); - } - } + } + } } // idem pour la racine @@ -598,15 +594,17 @@ function calculer_squelette($squelette, $nom, $gram, $sourcefile) { $code = ''; if ($boucles) { + foreach($boucles as $id => $boucle) { - // appeler la fonction de definition de la boucle + // appeler la fonction de definition de la boucle $f = 'boucle_'.strtoupper($boucle->type_requete); - // si pas de definition perso, definition spip + // si pas de definition perso, definition spip if (!function_exists($f)) $f = $f.'_dist'; - // laquelle a une definition par defaut - if (!function_exists($f)) $f = 'boucle_DEFAUT'; + // laquelle a une definition par defaut + if (!function_exists($f)) $f = 'boucle_DEFAUT'; $boucles[$id]->return = $f($id, $boucles); } + foreach($boucles as $id => $boucle) { // Reproduire la boucle en commentaire diff --git a/inc-criteres.php3 b/inc-criteres.php3 index 7dd9ea3de8db760fc7d62be8756510587c1f018e..0d30be9d8b8970958adb02c8beeacfc04e119c7c 100644 --- a/inc-criteres.php3 +++ b/inc-criteres.php3 @@ -15,7 +15,7 @@ function critere_racine_dist($idb, &$boucles, $param, $not) { $boucle = &$boucles[$idb]; if ($param != 'racine' OR $not) - return array(_T('info_erreur_squelette'), $param); + erreur_squelette(_T('info_erreur_squelette'), $param); $boucle->where[] = $boucle->id_table.".id_parent='0'"; @@ -27,7 +27,7 @@ function critere_exclus_dist($idb, &$boucles, $param, $not) { $boucle = &$boucles[$idb]; if ($param != 'exclus' OR $not) - return array(_T('info_erreur_squelette'), $param); + erreur_squelette(_T('info_erreur_squelette'), $param); $boucle->where[] = $boucle->id_table . '.' . $boucle->primary."!='\"." . calculer_argument_precedent($idb,$boucle->primary, $boucles) . @@ -42,7 +42,7 @@ function critere_doublons_dist($idb, &$boucles, $param, $not) { if (!preg_match("/(doublons|unique)[[:space:]]*([a-z_0-9]*)/i", $param, $match)) - return array(_T('info_erreur_squelette'), $param); + erreur_squelette(_T('info_erreur_squelette'), $param); $boucle->doublons = $boucle->type_requete . $match[2]; $boucle->where[] = '" .' . @@ -61,7 +61,7 @@ function critere_lang_select_dist($idb, &$boucles, $param, $not) { $lang_select = ($lang_select=='oui')?'non':'oui'; $boucle->lang_select = $lang_select; } - else return array(_T('info_erreur_squelette'), $param); + else erreur_squelette(_T('info_erreur_squelette'), $param); } // {debut_xxx} @@ -73,7 +73,7 @@ function critere_debut_dist($idb, &$boucles, $param, $not) { $boucle->limit = 'intval($GLOBALS["'.$debut_lim.'"]).",'.$match[2] .'"' ; } - else return array(_T('info_erreur_squelette'), $param); + else erreur_squelette(_T('info_erreur_squelette'), $param); } // {recherche} @@ -116,10 +116,10 @@ function critere_inverse_dist($idb, &$boucles, $param, $not) { if ($boucle->order) $boucle->order .= ".' DESC'"; else - return array(_L("inversion d'un ordre inexistant"), - "BOUCLE" . $idb); + erreur_squelette(_L("inversion d'un ordre inexistant"), + "BOUCLE" . $idb); } else - return array(_T('info_erreur_squelette'), $param); + erreur_squelette(_T('info_erreur_squelette'), "{$param} BOUCLE$idb"); } // {traduction} @@ -140,7 +140,7 @@ function critere_traduction_dist($idb, &$boucles, $param, $not) { $boucles) . ".\"'))"; } else - return array(_T('info_erreur_squelette'), $param); + erreur_squelette(_T('info_erreur_squelette'), $param); } // {origine_traduction} @@ -151,7 +151,7 @@ function critere_origine_traduction_dist($idb, &$boucles, $param, $not) { $boucle->where[] = $boucle->id_table.".id_trad = " . $boucle->id_table . '.' . $boucle->primary; else - return array(_T('info_erreur_squelette'), $param); + erreur_squelette(_T('info_erreur_squelette'), $param); } @@ -160,7 +160,7 @@ function critere_origine_traduction_dist($idb, &$boucles, $param, $not) { function critere_meme_parent_dist($idb, &$boucles, $param, $not) { $boucle = &$boucles[$idb]; if ($param != 'meme_parent') - return array(_T('info_erreur_squelette'), $param); + erreur_squelette(_T('info_erreur_squelette'), $param); else { if ($boucle->type_requete == 'rubriques') { $boucle->where[] = $boucle->id_table.".id_parent='\"." @@ -175,7 +175,7 @@ function critere_meme_parent_dist($idb, &$boucles, $param, $not) { $boucle->where[] = $boucle->id_table.".id_parent > 0"; $boucle->plat = true; } else - return array(_L("{meme_parent} ne s'applique qu'aux boucles (FORUMS) ou (RUBRIQUES)"), "BOUCLE" . $idb); + erreur_squelette(_L("{meme_parent} ne s'applique qu'aux boucles (FORUMS) ou (RUBRIQUES)"), "BOUCLE" . $idb); } } @@ -199,7 +199,7 @@ function critere_branche_dist($idb, &$boucles, $param, $not) { else $boucle->where[] = $where; } else - return array(_T('info_erreur_squelette'), $param); + erreur_squelette(_T('info_erreur_squelette'), $param); } // Tri : {par xxxx} @@ -207,7 +207,7 @@ function critere_branche_dist($idb, &$boucles, $param, $not) { function critere_par_dist($idb, &$boucles, $param, $not) { $boucle = &$boucles[$idb]; if ($not) - return array(_T('info_erreur_squelette'), $param); + erreur_squelette(_T('info_erreur_squelette'), $param); preg_match('/par[[:space:]]*(.*)/ims', $param, $regs); $tri = trim($regs[1]); @@ -275,9 +275,12 @@ function calculer_criteres ($idb, &$boucles) { // fonction critere standard ? if (!function_exists($f)) $f = 'calculer_critere_DEFAUT'; + + // Applique le critere $res = $f($idb, $boucles, $param, $not); - if (is_array($res)) return $res; # erreur - + + // gestion d'erreur + if (is_array($res)) erreur_squelette($res); } } @@ -327,7 +330,8 @@ function calculer_critere_DEFAUT($idb, &$boucles, $param, $not) { if ($match[3]) { if (strtoupper($op) != 'IN') { $val = calculer_param_dynamique($match[6], $boucles, $idb); - if (is_array($val)) return $val; + // gestion d'erreur + if (is_array($val)) erreur_squelette($val); } else { // traitement special des valeurs textuelles @@ -335,7 +339,7 @@ function calculer_critere_DEFAUT($idb, &$boucles, $param, $not) { $val2 = split(" *, *", $val2[1]); foreach ($val2 as $v) { $v = calculer_param_dynamique($v, $boucles, $idb); - if (is_array($v)) return $v; + if (is_array($v)) erreur_squelette($v); if (strpos('"0123456789',$v[0]) !== false) $val3[] = $v; else