@@ -48,7 +48,7 @@ discard block |
||
| 48 | 48 | $GLOBALS['connexions'][$server_db] = $link; |
| 49 | 49 | |
| 50 | 50 | $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
| 51 | - = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 51 | + = $GLOBALS['spip_'.$server_db.'_functions_'.$GLOBALS['spip_sql_version']]; |
|
| 52 | 52 | |
| 53 | 53 | $minipage = new Spip\Afficher\Minipage\Installation(); |
| 54 | 54 | echo $minipage->installDebutPage(); |
@@ -68,18 +68,18 @@ discard block |
||
| 68 | 68 | //echo "\n-->\n"; |
| 69 | 69 | |
| 70 | 70 | if (($db_connect == '0') && $link) { |
| 71 | - echo "<div class='success'><b>" . _T('info_connexion_ok') . '</b></div>'; |
|
| 71 | + echo "<div class='success'><b>"._T('info_connexion_ok').'</b></div>'; |
|
| 72 | 72 | echo info_progression_etape(2, 'etape_', 'install/'); |
| 73 | 73 | |
| 74 | - echo info_etape(_T('menu_aide_installation_choix_base') . aider('install2', true)); |
|
| 74 | + echo info_etape(_T('menu_aide_installation_choix_base').aider('install2', true)); |
|
| 75 | 75 | |
| 76 | 76 | echo "\n", '<!-- ', sql_version($server_db), ' -->'; |
| 77 | 77 | [$checked, $res] = install_etape_2_bases($login_db, $server_db); |
| 78 | 78 | |
| 79 | 79 | $hidden = (defined('_SPIP_CHMOD') |
| 80 | 80 | ? '' |
| 81 | - : ("\n<input type='hidden' name='chmod' value='" . spip_htmlspecialchars($chmod) . "' />")) |
|
| 82 | - . predef_ou_cache($adresse_db . ($port ? ':' . $port : ''), $login_db, $pass_db, $server_db); |
|
| 81 | + : ("\n<input type='hidden' name='chmod' value='".spip_htmlspecialchars($chmod)."' />")) |
|
| 82 | + . predef_ou_cache($adresse_db.($port ? ':'.$port : ''), $login_db, $pass_db, $server_db); |
|
| 83 | 83 | |
| 84 | 84 | echo install_etape_2_form($hidden, $checked, $res, 3); |
| 85 | 85 | } else { |
@@ -87,8 +87,8 @@ discard block |
||
| 87 | 87 | |
| 88 | 88 | echo "<div class='error'>"; |
| 89 | 89 | echo info_etape(_T('info_connexion_base')); |
| 90 | - echo '<h3>' . _T('avis_connexion_echec_1') . '</h3>'; |
|
| 91 | - echo '<p>' . _T('avis_connexion_echec_2') . '</p>'; |
|
| 90 | + echo '<h3>'._T('avis_connexion_echec_1').'</h3>'; |
|
| 91 | + echo '<p>'._T('avis_connexion_echec_2').'</p>'; |
|
| 92 | 92 | |
| 93 | 93 | echo "<p style='font-size: small;'>", |
| 94 | 94 | _T('avis_connexion_echec_3'), |
@@ -120,8 +120,8 @@ discard block |
||
| 120 | 120 | . ' ' |
| 121 | 121 | ]; |
| 122 | 122 | } |
| 123 | - $res = '<b>' . _T('avis_lecture_noms_bases_1') . '</b> |
|
| 124 | - ' . _T('avis_lecture_noms_bases_2') . '<p>'; |
|
| 123 | + $res = '<b>'._T('avis_lecture_noms_bases_1').'</b> |
|
| 124 | + ' . _T('avis_lecture_noms_bases_2').'<p>'; |
|
| 125 | 125 | |
| 126 | 126 | $checked = false; |
| 127 | 127 | if ($login_db) { |
@@ -138,10 +138,10 @@ discard block |
||
| 138 | 138 | if ($ok) { |
| 139 | 139 | $res .= _T('avis_lecture_noms_bases_3') |
| 140 | 140 | . '<ul>' |
| 141 | - . '<li><input name="choix_db" value="' . $test_base . "\" type='radio' id='stand' checked='checked' />" |
|
| 142 | - . "<label for='stand'>" . $test_base . "</label></li>\n" |
|
| 141 | + . '<li><input name="choix_db" value="'.$test_base."\" type='radio' id='stand' checked='checked' />" |
|
| 142 | + . "<label for='stand'>".$test_base."</label></li>\n" |
|
| 143 | 143 | . '</ul>' |
| 144 | - . '<p>' . _T('info_ou') . ' '; |
|
| 144 | + . '<p>'._T('info_ou').' '; |
|
| 145 | 145 | $checked = true; |
| 146 | 146 | } |
| 147 | 147 | } |
@@ -154,19 +154,19 @@ discard block |
||
| 154 | 154 | "\n<input type='hidden' name='etape' value='$etape' />" |
| 155 | 155 | . $hidden |
| 156 | 156 | . (defined('_INSTALL_NAME_DB') |
| 157 | - ? '<h3>' . _T('install_nom_base_hebergeur') . ' <tt>' . _INSTALL_NAME_DB . '</tt>' . '</h3>' |
|
| 158 | - : "\n<fieldset><legend>" . _T('texte_choix_base_1') . "</legend>\n" |
|
| 157 | + ? '<h3>'._T('install_nom_base_hebergeur').' <tt>'._INSTALL_NAME_DB.'</tt>'.'</h3>' |
|
| 158 | + : "\n<fieldset><legend>"._T('texte_choix_base_1')."</legend>\n" |
|
| 159 | 159 | . $res |
| 160 | 160 | . "\n<input name=\"choix_db\" value=\"new_spip\" type='radio' id='nou'" |
| 161 | 161 | . ($checked ? '' : " checked='checked'") |
| 162 | - . " />\n<label for='nou'>" . _T('info_creer_base') . "</label></p>\n<p>" |
|
| 162 | + . " />\n<label for='nou'>"._T('info_creer_base')."</label></p>\n<p>" |
|
| 163 | 163 | . "\n<input type='text' name='table_new' class='text' value=\"spip\" size='20' /></p></fieldset>\n" |
| 164 | 164 | ) |
| 165 | 165 | |
| 166 | 166 | . ((defined('_INSTALL_TABLE_PREFIX') || $GLOBALS['table_prefix'] != 'spip') |
| 167 | - ? '<h3>' . _T('install_table_prefix_hebergeur') . ' <tt>' . $GLOBALS['table_prefix'] . '</tt>' . '</h3>' |
|
| 168 | - : '<fieldset><legend>' . _T('texte_choix_table_prefix') . "</legend>\n" |
|
| 169 | - . "<p><label for='table_prefix'>" . _T('info_table_prefix') . '</label></p><p>' |
|
| 167 | + ? '<h3>'._T('install_table_prefix_hebergeur').' <tt>'.$GLOBALS['table_prefix'].'</tt>'.'</h3>' |
|
| 168 | + : '<fieldset><legend>'._T('texte_choix_table_prefix')."</legend>\n" |
|
| 169 | + . "<p><label for='table_prefix'>"._T('info_table_prefix').'</label></p><p>' |
|
| 170 | 170 | . "\n<input type='text' id='tprefix' name='tprefix' class='text' value='" |
| 171 | 171 | . 'spip' # valeur par defaut |
| 172 | 172 | . "' size='20' /></p></fieldset>" |
@@ -10,167 +10,167 @@ |
||
| 10 | 10 | \***************************************************************************/ |
| 11 | 11 | |
| 12 | 12 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 13 | - return; |
|
| 13 | + return; |
|
| 14 | 14 | } |
| 15 | 15 | |
| 16 | 16 | include_spip('base/abstract_sql'); |
| 17 | 17 | |
| 18 | 18 | function install_etape_2_dist() { |
| 19 | - $adresse_db = defined('_INSTALL_HOST_DB') |
|
| 20 | - ? _INSTALL_HOST_DB |
|
| 21 | - : _request('adresse_db'); |
|
| 19 | + $adresse_db = defined('_INSTALL_HOST_DB') |
|
| 20 | + ? _INSTALL_HOST_DB |
|
| 21 | + : _request('adresse_db'); |
|
| 22 | 22 | |
| 23 | - if (preg_match(',(.*):(.*),', (string) $adresse_db, $r)) { |
|
| 24 | - [, $adresse_db, $port] = $r; |
|
| 25 | - } else { |
|
| 26 | - $port = ''; |
|
| 27 | - } |
|
| 23 | + if (preg_match(',(.*):(.*),', (string) $adresse_db, $r)) { |
|
| 24 | + [, $adresse_db, $port] = $r; |
|
| 25 | + } else { |
|
| 26 | + $port = ''; |
|
| 27 | + } |
|
| 28 | 28 | |
| 29 | - $login_db = defined('_INSTALL_USER_DB') |
|
| 30 | - ? _INSTALL_USER_DB |
|
| 31 | - : _request('login_db'); |
|
| 29 | + $login_db = defined('_INSTALL_USER_DB') |
|
| 30 | + ? _INSTALL_USER_DB |
|
| 31 | + : _request('login_db'); |
|
| 32 | 32 | |
| 33 | - $pass_db = defined('_INSTALL_PASS_DB') |
|
| 34 | - ? _INSTALL_PASS_DB |
|
| 35 | - : _request('pass_db'); |
|
| 33 | + $pass_db = defined('_INSTALL_PASS_DB') |
|
| 34 | + ? _INSTALL_PASS_DB |
|
| 35 | + : _request('pass_db'); |
|
| 36 | 36 | |
| 37 | - $server_db = defined('_INSTALL_SERVER_DB') |
|
| 38 | - ? _INSTALL_SERVER_DB |
|
| 39 | - : _request('server_db'); |
|
| 37 | + $server_db = defined('_INSTALL_SERVER_DB') |
|
| 38 | + ? _INSTALL_SERVER_DB |
|
| 39 | + : _request('server_db'); |
|
| 40 | 40 | |
| 41 | - $name_db = defined('_INSTALL_NAME_DB') |
|
| 42 | - ? _INSTALL_NAME_DB |
|
| 43 | - : ''; |
|
| 41 | + $name_db = defined('_INSTALL_NAME_DB') |
|
| 42 | + ? _INSTALL_NAME_DB |
|
| 43 | + : ''; |
|
| 44 | 44 | |
| 45 | - $chmod = _request('chmod'); |
|
| 45 | + $chmod = _request('chmod'); |
|
| 46 | 46 | |
| 47 | - $link = spip_connect_db($adresse_db, $port, $login_db, $pass_db, $name_db, $server_db); |
|
| 48 | - $GLOBALS['connexions'][$server_db] = $link; |
|
| 47 | + $link = spip_connect_db($adresse_db, $port, $login_db, $pass_db, $name_db, $server_db); |
|
| 48 | + $GLOBALS['connexions'][$server_db] = $link; |
|
| 49 | 49 | |
| 50 | - $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
|
| 51 | - = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 50 | + $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
|
| 51 | + = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 52 | 52 | |
| 53 | - $minipage = new Spip\Afficher\Minipage\Installation(); |
|
| 54 | - echo $minipage->installDebutPage(); |
|
| 53 | + $minipage = new Spip\Afficher\Minipage\Installation(); |
|
| 54 | + echo $minipage->installDebutPage(); |
|
| 55 | 55 | |
| 56 | 56 | |
| 57 | 57 | // prenons toutes les dispositions possibles pour que rien ne s'affiche ! |
| 58 | 58 | |
| 59 | - /* |
|
| 59 | + /* |
|
| 60 | 60 | * /!\ sqlite3/PDO : erreur sur join(', ', $link) |
| 61 | 61 | * L'objet PDO ne peut pas etre transformee en chaine |
| 62 | 62 | * Un echo $link ne fonctionne pas non plus |
| 63 | 63 | * Il faut utiliser par exemple print_r($link) |
| 64 | 64 | */ |
| 65 | - //echo "\n<!--\n", join(', ', $link), " $login_db "; |
|
| 66 | - $db_connect = 0; // revoirfunction_exists($ferrno) ? $ferrno() : 0; |
|
| 67 | - //echo join(', ', $GLOBALS['connexions'][$server_db]); |
|
| 68 | - //echo "\n-->\n"; |
|
| 65 | + //echo "\n<!--\n", join(', ', $link), " $login_db "; |
|
| 66 | + $db_connect = 0; // revoirfunction_exists($ferrno) ? $ferrno() : 0; |
|
| 67 | + //echo join(', ', $GLOBALS['connexions'][$server_db]); |
|
| 68 | + //echo "\n-->\n"; |
|
| 69 | 69 | |
| 70 | - if (($db_connect == '0') && $link) { |
|
| 71 | - echo "<div class='success'><b>" . _T('info_connexion_ok') . '</b></div>'; |
|
| 72 | - echo info_progression_etape(2, 'etape_', 'install/'); |
|
| 70 | + if (($db_connect == '0') && $link) { |
|
| 71 | + echo "<div class='success'><b>" . _T('info_connexion_ok') . '</b></div>'; |
|
| 72 | + echo info_progression_etape(2, 'etape_', 'install/'); |
|
| 73 | 73 | |
| 74 | - echo info_etape(_T('menu_aide_installation_choix_base') . aider('install2', true)); |
|
| 74 | + echo info_etape(_T('menu_aide_installation_choix_base') . aider('install2', true)); |
|
| 75 | 75 | |
| 76 | - echo "\n", '<!-- ', sql_version($server_db), ' -->'; |
|
| 77 | - [$checked, $res] = install_etape_2_bases($login_db, $server_db); |
|
| 76 | + echo "\n", '<!-- ', sql_version($server_db), ' -->'; |
|
| 77 | + [$checked, $res] = install_etape_2_bases($login_db, $server_db); |
|
| 78 | 78 | |
| 79 | - $hidden = (defined('_SPIP_CHMOD') |
|
| 80 | - ? '' |
|
| 81 | - : ("\n<input type='hidden' name='chmod' value='" . spip_htmlspecialchars($chmod) . "' />")) |
|
| 82 | - . predef_ou_cache($adresse_db . ($port ? ':' . $port : ''), $login_db, $pass_db, $server_db); |
|
| 79 | + $hidden = (defined('_SPIP_CHMOD') |
|
| 80 | + ? '' |
|
| 81 | + : ("\n<input type='hidden' name='chmod' value='" . spip_htmlspecialchars($chmod) . "' />")) |
|
| 82 | + . predef_ou_cache($adresse_db . ($port ? ':' . $port : ''), $login_db, $pass_db, $server_db); |
|
| 83 | 83 | |
| 84 | - echo install_etape_2_form($hidden, $checked, $res, 3); |
|
| 85 | - } else { |
|
| 86 | - echo info_progression_etape(1, 'etape_', 'install/', true); |
|
| 84 | + echo install_etape_2_form($hidden, $checked, $res, 3); |
|
| 85 | + } else { |
|
| 86 | + echo info_progression_etape(1, 'etape_', 'install/', true); |
|
| 87 | 87 | |
| 88 | - echo "<div class='error'>"; |
|
| 89 | - echo info_etape(_T('info_connexion_base')); |
|
| 90 | - echo '<h3>' . _T('avis_connexion_echec_1') . '</h3>'; |
|
| 91 | - echo '<p>' . _T('avis_connexion_echec_2') . '</p>'; |
|
| 88 | + echo "<div class='error'>"; |
|
| 89 | + echo info_etape(_T('info_connexion_base')); |
|
| 90 | + echo '<h3>' . _T('avis_connexion_echec_1') . '</h3>'; |
|
| 91 | + echo '<p>' . _T('avis_connexion_echec_2') . '</p>'; |
|
| 92 | 92 | |
| 93 | - echo "<p style='font-size: small;'>", |
|
| 94 | - _T('avis_connexion_echec_3'), |
|
| 95 | - '</p></div>'; |
|
| 96 | - } |
|
| 93 | + echo "<p style='font-size: small;'>", |
|
| 94 | + _T('avis_connexion_echec_3'), |
|
| 95 | + '</p></div>'; |
|
| 96 | + } |
|
| 97 | 97 | |
| 98 | - echo $minipage->installFinPage(); |
|
| 98 | + echo $minipage->installFinPage(); |
|
| 99 | 99 | } |
| 100 | 100 | |
| 101 | 101 | // Liste les bases accessibles, |
| 102 | 102 | // avec une heuristique pour preselectionner la plus probable |
| 103 | 103 | |
| 104 | 104 | function install_etape_2_bases($login_db, $server_db) { |
| 105 | - $res = install_etape_liste_bases($server_db, $login_db); |
|
| 106 | - if ($res) { |
|
| 107 | - [$checked, $bases] = $res; |
|
| 108 | - |
|
| 109 | - return [ |
|
| 110 | - $checked, |
|
| 111 | - "<label for='choix_db'><b>" |
|
| 112 | - . _T('texte_choix_base_2') |
|
| 113 | - . '</b><br />' |
|
| 114 | - . _T('texte_choix_base_3') |
|
| 115 | - . '</label>' |
|
| 116 | - . "<ul>\n<li>" |
|
| 117 | - . implode("</li>\n<li>", $bases) |
|
| 118 | - . "</li>\n</ul><p>" |
|
| 119 | - . _T('info_ou') |
|
| 120 | - . ' ' |
|
| 121 | - ]; |
|
| 122 | - } |
|
| 123 | - $res = '<b>' . _T('avis_lecture_noms_bases_1') . '</b> |
|
| 105 | + $res = install_etape_liste_bases($server_db, $login_db); |
|
| 106 | + if ($res) { |
|
| 107 | + [$checked, $bases] = $res; |
|
| 108 | + |
|
| 109 | + return [ |
|
| 110 | + $checked, |
|
| 111 | + "<label for='choix_db'><b>" |
|
| 112 | + . _T('texte_choix_base_2') |
|
| 113 | + . '</b><br />' |
|
| 114 | + . _T('texte_choix_base_3') |
|
| 115 | + . '</label>' |
|
| 116 | + . "<ul>\n<li>" |
|
| 117 | + . implode("</li>\n<li>", $bases) |
|
| 118 | + . "</li>\n</ul><p>" |
|
| 119 | + . _T('info_ou') |
|
| 120 | + . ' ' |
|
| 121 | + ]; |
|
| 122 | + } |
|
| 123 | + $res = '<b>' . _T('avis_lecture_noms_bases_1') . '</b> |
|
| 124 | 124 | ' . _T('avis_lecture_noms_bases_2') . '<p>'; |
| 125 | 125 | |
| 126 | - $checked = false; |
|
| 127 | - if ($login_db) { |
|
| 128 | - // Si un login comporte un point, le nom de la base est plus |
|
| 129 | - // probablement le login sans le point -- testons pour savoir |
|
| 130 | - $test_base = $login_db; |
|
| 131 | - $ok = sql_selectdb($test_base, $server_db); |
|
| 132 | - $test_base2 = str_replace('.', '_', (string) $test_base); |
|
| 133 | - if (sql_selectdb($test_base2, $server_db)) { |
|
| 134 | - $test_base = $test_base2; |
|
| 135 | - $ok = true; |
|
| 136 | - } |
|
| 137 | - |
|
| 138 | - if ($ok) { |
|
| 139 | - $res .= _T('avis_lecture_noms_bases_3') |
|
| 140 | - . '<ul>' |
|
| 141 | - . '<li><input name="choix_db" value="' . $test_base . "\" type='radio' id='stand' checked='checked' />" |
|
| 142 | - . "<label for='stand'>" . $test_base . "</label></li>\n" |
|
| 143 | - . '</ul>' |
|
| 144 | - . '<p>' . _T('info_ou') . ' '; |
|
| 145 | - $checked = true; |
|
| 146 | - } |
|
| 147 | - } |
|
| 148 | - |
|
| 149 | - return [$checked, $res]; |
|
| 126 | + $checked = false; |
|
| 127 | + if ($login_db) { |
|
| 128 | + // Si un login comporte un point, le nom de la base est plus |
|
| 129 | + // probablement le login sans le point -- testons pour savoir |
|
| 130 | + $test_base = $login_db; |
|
| 131 | + $ok = sql_selectdb($test_base, $server_db); |
|
| 132 | + $test_base2 = str_replace('.', '_', (string) $test_base); |
|
| 133 | + if (sql_selectdb($test_base2, $server_db)) { |
|
| 134 | + $test_base = $test_base2; |
|
| 135 | + $ok = true; |
|
| 136 | + } |
|
| 137 | + |
|
| 138 | + if ($ok) { |
|
| 139 | + $res .= _T('avis_lecture_noms_bases_3') |
|
| 140 | + . '<ul>' |
|
| 141 | + . '<li><input name="choix_db" value="' . $test_base . "\" type='radio' id='stand' checked='checked' />" |
|
| 142 | + . "<label for='stand'>" . $test_base . "</label></li>\n" |
|
| 143 | + . '</ul>' |
|
| 144 | + . '<p>' . _T('info_ou') . ' '; |
|
| 145 | + $checked = true; |
|
| 146 | + } |
|
| 147 | + } |
|
| 148 | + |
|
| 149 | + return [$checked, $res]; |
|
| 150 | 150 | } |
| 151 | 151 | |
| 152 | 152 | function install_etape_2_form($hidden, $checked, $res, $etape) { |
| 153 | - return generer_form_ecrire('install', ( |
|
| 154 | - "\n<input type='hidden' name='etape' value='$etape' />" |
|
| 155 | - . $hidden |
|
| 156 | - . (defined('_INSTALL_NAME_DB') |
|
| 157 | - ? '<h3>' . _T('install_nom_base_hebergeur') . ' <tt>' . _INSTALL_NAME_DB . '</tt>' . '</h3>' |
|
| 158 | - : "\n<fieldset><legend>" . _T('texte_choix_base_1') . "</legend>\n" |
|
| 159 | - . $res |
|
| 160 | - . "\n<input name=\"choix_db\" value=\"new_spip\" type='radio' id='nou'" |
|
| 161 | - . ($checked ? '' : " checked='checked'") |
|
| 162 | - . " />\n<label for='nou'>" . _T('info_creer_base') . "</label></p>\n<p>" |
|
| 163 | - . "\n<input type='text' name='table_new' class='text' value=\"spip\" size='20' /></p></fieldset>\n" |
|
| 164 | - ) |
|
| 165 | - |
|
| 166 | - . ((defined('_INSTALL_TABLE_PREFIX') || $GLOBALS['table_prefix'] != 'spip') |
|
| 167 | - ? '<h3>' . _T('install_table_prefix_hebergeur') . ' <tt>' . $GLOBALS['table_prefix'] . '</tt>' . '</h3>' |
|
| 168 | - : '<fieldset><legend>' . _T('texte_choix_table_prefix') . "</legend>\n" |
|
| 169 | - . "<p><label for='table_prefix'>" . _T('info_table_prefix') . '</label></p><p>' |
|
| 170 | - . "\n<input type='text' id='tprefix' name='tprefix' class='text' value='" |
|
| 171 | - . 'spip' # valeur par defaut |
|
| 172 | - . "' size='20' /></p></fieldset>" |
|
| 173 | - ) |
|
| 174 | - |
|
| 175 | - . bouton_suivant())); |
|
| 153 | + return generer_form_ecrire('install', ( |
|
| 154 | + "\n<input type='hidden' name='etape' value='$etape' />" |
|
| 155 | + . $hidden |
|
| 156 | + . (defined('_INSTALL_NAME_DB') |
|
| 157 | + ? '<h3>' . _T('install_nom_base_hebergeur') . ' <tt>' . _INSTALL_NAME_DB . '</tt>' . '</h3>' |
|
| 158 | + : "\n<fieldset><legend>" . _T('texte_choix_base_1') . "</legend>\n" |
|
| 159 | + . $res |
|
| 160 | + . "\n<input name=\"choix_db\" value=\"new_spip\" type='radio' id='nou'" |
|
| 161 | + . ($checked ? '' : " checked='checked'") |
|
| 162 | + . " />\n<label for='nou'>" . _T('info_creer_base') . "</label></p>\n<p>" |
|
| 163 | + . "\n<input type='text' name='table_new' class='text' value=\"spip\" size='20' /></p></fieldset>\n" |
|
| 164 | + ) |
|
| 165 | + |
|
| 166 | + . ((defined('_INSTALL_TABLE_PREFIX') || $GLOBALS['table_prefix'] != 'spip') |
|
| 167 | + ? '<h3>' . _T('install_table_prefix_hebergeur') . ' <tt>' . $GLOBALS['table_prefix'] . '</tt>' . '</h3>' |
|
| 168 | + : '<fieldset><legend>' . _T('texte_choix_table_prefix') . "</legend>\n" |
|
| 169 | + . "<p><label for='table_prefix'>" . _T('info_table_prefix') . '</label></p><p>' |
|
| 170 | + . "\n<input type='text' id='tprefix' name='tprefix' class='text' value='" |
|
| 171 | + . 'spip' # valeur par defaut |
|
| 172 | + . "' size='20' /></p></fieldset>" |
|
| 173 | + ) |
|
| 174 | + |
|
| 175 | + . bouton_suivant())); |
|
| 176 | 176 | } |
@@ -43,7 +43,7 @@ discard block |
||
| 43 | 43 | = spip_connect_db($adresse_db, $port, $login_db, $pass_db, '', $server_db); |
| 44 | 44 | |
| 45 | 45 | $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
| 46 | - = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 46 | + = $GLOBALS['spip_'.$server_db.'_functions_'.$GLOBALS['spip_sql_version']]; |
|
| 47 | 47 | |
| 48 | 48 | $fquery = sql_serveur('query', $server_db); |
| 49 | 49 | if ($choix_db == 'new_spip') { |
@@ -53,13 +53,13 @@ discard block |
||
| 53 | 53 | if (!$ok) { |
| 54 | 54 | $re = "Impossible de creer la base $re"; |
| 55 | 55 | spip_log($re); |
| 56 | - return '<p>' . _T('avis_connexion_erreur_creer_base') . "</p><!--\n$re\n-->"; |
|
| 56 | + return '<p>'._T('avis_connexion_erreur_creer_base')."</p><!--\n$re\n-->"; |
|
| 57 | 57 | } |
| 58 | 58 | } else { |
| 59 | 59 | $re = "Le nom de la base doit correspondre a $re"; |
| 60 | 60 | spip_log($re); |
| 61 | 61 | |
| 62 | - return '<p>' . _T('avis_connexion_erreur_nom_base') . "</p><!--\n$re\n-->"; |
|
| 62 | + return '<p>'._T('avis_connexion_erreur_nom_base')."</p><!--\n$re\n-->"; |
|
| 63 | 63 | } |
| 64 | 64 | } |
| 65 | 65 | |
@@ -70,14 +70,14 @@ discard block |
||
| 70 | 70 | = spip_connect_db($adresse_db, $port, $login_db, $pass_db, $sel_db, $server_db); |
| 71 | 71 | |
| 72 | 72 | $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
| 73 | - = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 73 | + = $GLOBALS['spip_'.$server_db.'_functions_'.$GLOBALS['spip_sql_version']]; |
|
| 74 | 74 | |
| 75 | 75 | // Completer le tableau decrivant la connexion |
| 76 | 76 | |
| 77 | 77 | $GLOBALS['connexions'][$server_db]['prefixe'] = $table_prefix; |
| 78 | 78 | $GLOBALS['connexions'][$server_db]['db'] = $sel_db; |
| 79 | 79 | |
| 80 | - $old = sql_showbase($table_prefix . '_meta', $server_db); |
|
| 80 | + $old = sql_showbase($table_prefix.'_meta', $server_db); |
|
| 81 | 81 | if ($old) { |
| 82 | 82 | $old = sql_fetch($old, $server_db); |
| 83 | 83 | } |
@@ -96,7 +96,7 @@ discard block |
||
| 96 | 96 | $charset['charset']; |
| 97 | 97 | $charsetbase = $charset['charset']; |
| 98 | 98 | } else { |
| 99 | - spip_log(_DEFAULT_CHARSET . ' inconnu du serveur SQL'); |
|
| 99 | + spip_log(_DEFAULT_CHARSET.' inconnu du serveur SQL'); |
|
| 100 | 100 | $charsetbase = 'standard'; |
| 101 | 101 | } |
| 102 | 102 | spip_log("Creation des tables. Codage $charsetbase"); |
@@ -146,7 +146,7 @@ discard block |
||
| 146 | 146 | if ($r) { |
| 147 | 147 | $r = sql_fetch($r, $server_db); |
| 148 | 148 | } |
| 149 | - $version_installee = $r ? (double)$r['valeur'] : 0; |
|
| 149 | + $version_installee = $r ? (double) $r['valeur'] : 0; |
|
| 150 | 150 | if (!$version_installee || $GLOBALS['spip_version_base'] < $version_installee) { |
| 151 | 151 | $fupdateq( |
| 152 | 152 | 'spip_meta', |
@@ -155,7 +155,7 @@ discard block |
||
| 155 | 155 | '', |
| 156 | 156 | $server_db |
| 157 | 157 | ); |
| 158 | - spip_log('nouvelle version installee: ' . $GLOBALS['spip_version_base']); |
|
| 158 | + spip_log('nouvelle version installee: '.$GLOBALS['spip_version_base']); |
|
| 159 | 159 | } |
| 160 | 160 | // eliminer la derniere operation d'admin mal terminee |
| 161 | 161 | // notamment la mise a jour |
@@ -182,7 +182,7 @@ discard block |
||
| 182 | 182 | if ($chmod_db) { |
| 183 | 183 | install_fichier_connexion( |
| 184 | 184 | _FILE_CHMOD_TMP, |
| 185 | - "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', " . sprintf('0%3o', $chmod_db) . ");\n" |
|
| 185 | + "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', ".sprintf('0%3o', $chmod_db).");\n" |
|
| 186 | 186 | ); |
| 187 | 187 | } |
| 188 | 188 | |
@@ -245,16 +245,16 @@ discard block |
||
| 245 | 245 | |
| 246 | 246 | |
| 247 | 247 | function install_premier_auteur($email, $login, $nom, #[\SensitiveParameter] $pass, $hidden, $auteur_obligatoire) { |
| 248 | - return info_progression_etape(3, 'etape_', 'install/') . |
|
| 248 | + return info_progression_etape(3, 'etape_', 'install/'). |
|
| 249 | 249 | info_etape( |
| 250 | 250 | _T('info_informations_personnelles'), |
| 251 | - '<b>' . _T('texte_informations_personnelles_1') . '</b>' . |
|
| 252 | - aider('install5', true) . |
|
| 253 | - '<p>' . |
|
| 251 | + '<b>'._T('texte_informations_personnelles_1').'</b>'. |
|
| 252 | + aider('install5', true). |
|
| 253 | + '<p>'. |
|
| 254 | 254 | ($auteur_obligatoire ? |
| 255 | 255 | '' |
| 256 | 256 | : |
| 257 | - _T('texte_informations_personnelles_2') . ' ' . _T('info_laisser_champs_vides') |
|
| 257 | + _T('texte_informations_personnelles_2').' '._T('info_laisser_champs_vides') |
|
| 258 | 258 | ) |
| 259 | 259 | ) |
| 260 | 260 | . generer_form_ecrire('install', ( |
@@ -264,12 +264,12 @@ discard block |
||
| 264 | 264 | _T('info_identification_publique'), |
| 265 | 265 | [ |
| 266 | 266 | 'nom' => [ |
| 267 | - 'label' => '<b>' . _T('entree_signature') . "</b><br />\n" . _T('entree_nom_pseudo_1') . "\n", |
|
| 267 | + 'label' => '<b>'._T('entree_signature')."</b><br />\n"._T('entree_nom_pseudo_1')."\n", |
|
| 268 | 268 | 'valeur' => $nom, |
| 269 | 269 | 'required' => $auteur_obligatoire, |
| 270 | 270 | ], |
| 271 | 271 | 'email' => [ |
| 272 | - 'label' => '<b>' . _T('entree_adresse_email') . "</b>\n", |
|
| 272 | + 'label' => '<b>'._T('entree_adresse_email')."</b>\n", |
|
| 273 | 273 | 'valeur' => $email, |
| 274 | 274 | ] |
| 275 | 275 | ] |
@@ -279,23 +279,23 @@ discard block |
||
| 279 | 279 | _T('entree_identifiants_connexion'), |
| 280 | 280 | [ |
| 281 | 281 | 'login' => [ |
| 282 | - 'label' => '<b>' . _T('entree_login') . "</b><br />\n" . _T( |
|
| 282 | + 'label' => '<b>'._T('entree_login')."</b><br />\n"._T( |
|
| 283 | 283 | 'info_login_trop_court_car_pluriel', |
| 284 | 284 | ['nb' => _LOGIN_TROP_COURT] |
| 285 | - ) . "\n", |
|
| 285 | + )."\n", |
|
| 286 | 286 | 'valeur' => $login, |
| 287 | 287 | 'required' => $auteur_obligatoire, |
| 288 | 288 | ], |
| 289 | 289 | 'pass' => [ |
| 290 | - 'label' => '<b>' . _T('entree_mot_passe') . "</b><br />\n" . _T( |
|
| 290 | + 'label' => '<b>'._T('entree_mot_passe')."</b><br />\n"._T( |
|
| 291 | 291 | 'info_passe_trop_court_car_pluriel', |
| 292 | 292 | ['nb' => _PASS_LONGUEUR_MINI] |
| 293 | - ) . "\n", |
|
| 293 | + )."\n", |
|
| 294 | 294 | 'valeur' => $pass, |
| 295 | 295 | 'required' => $auteur_obligatoire, |
| 296 | 296 | ], |
| 297 | 297 | 'pass_verif' => [ |
| 298 | - 'label' => '<b>' . _T('info_confirmer_passe') . "</b><br />\n", |
|
| 298 | + 'label' => '<b>'._T('info_confirmer_passe')."</b><br />\n", |
|
| 299 | 299 | 'valeur' => $pass, |
| 300 | 300 | 'required' => $auteur_obligatoire, |
| 301 | 301 | ] |
@@ -339,9 +339,9 @@ discard block |
||
| 339 | 339 | |
| 340 | 340 | if ($res) { |
| 341 | 341 | $res = info_progression_etape(2, 'etape_', 'install/', true) |
| 342 | - . "<div class='error'><h3>" . _T('avis_operation_echec') . '</h3>' |
|
| 342 | + . "<div class='error'><h3>"._T('avis_operation_echec').'</h3>' |
|
| 343 | 343 | . $res |
| 344 | - . '<p>' . _T('texte_operation_echec') . '</p>' |
|
| 344 | + . '<p>'._T('texte_operation_echec').'</p>' |
|
| 345 | 345 | . '</div>'; |
| 346 | 346 | } |
| 347 | 347 | } else { |
@@ -365,7 +365,7 @@ discard block |
||
| 365 | 365 | |
| 366 | 366 | $hidden = predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) |
| 367 | 367 | . (defined('_INSTALL_NAME_DB') ? '' |
| 368 | - : "\n<input type='hidden' name='sel_db' value=\"" . spip_htmlspecialchars($sel_db) . '" />'); |
|
| 368 | + : "\n<input type='hidden' name='sel_db' value=\"".spip_htmlspecialchars($sel_db).'" />'); |
|
| 369 | 369 | |
| 370 | 370 | $auteur_obligatoire = ($ldap_present ? 0 : !sql_countsel('spip_auteurs', '', '', '', $server_db)); |
| 371 | 371 | |
@@ -10,7 +10,7 @@ discard block |
||
| 10 | 10 | \***************************************************************************/ |
| 11 | 11 | |
| 12 | 12 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 13 | - return; |
|
| 13 | + return; |
|
| 14 | 14 | } |
| 15 | 15 | |
| 16 | 16 | include_spip('inc/headers'); |
@@ -18,199 +18,199 @@ discard block |
||
| 18 | 18 | |
| 19 | 19 | function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db) { |
| 20 | 20 | |
| 21 | - // Prefix des tables : |
|
| 22 | - // S'il n'est pas defini par mes_options/inc/mutualiser, on va le creer |
|
| 23 | - // a partir de ce qui est envoye a l'installation |
|
| 24 | - if (!defined('_INSTALL_TABLE_PREFIX')) { |
|
| 25 | - $table_prefix = ($GLOBALS['table_prefix'] != 'spip') |
|
| 26 | - ? $GLOBALS['table_prefix'] |
|
| 27 | - : preparer_prefixe_tables(_request('tprefix')); |
|
| 28 | - // S'il est vide on remet spip |
|
| 29 | - if (!$table_prefix) { |
|
| 30 | - $table_prefix = 'spip'; |
|
| 31 | - } |
|
| 32 | - } else { |
|
| 33 | - $table_prefix = _INSTALL_TABLE_PREFIX; |
|
| 34 | - } |
|
| 35 | - |
|
| 36 | - if (preg_match(',(.*):(.*),', (string) $adresse_db, $r)) { |
|
| 37 | - [, $adresse_db, $port] = $r; |
|
| 38 | - } else { |
|
| 39 | - $port = ''; |
|
| 40 | - } |
|
| 41 | - |
|
| 42 | - $GLOBALS['connexions'][$server_db] |
|
| 43 | - = spip_connect_db($adresse_db, $port, $login_db, $pass_db, '', $server_db); |
|
| 44 | - |
|
| 45 | - $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
|
| 46 | - = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 47 | - |
|
| 48 | - $fquery = sql_serveur('query', $server_db); |
|
| 49 | - if ($choix_db == 'new_spip') { |
|
| 50 | - $re = ',^[a-z_][a-z_0-9-]*$,i'; |
|
| 51 | - if (preg_match($re, (string) $sel_db)) { |
|
| 52 | - $ok = sql_create_base($sel_db, $server_db); |
|
| 53 | - if (!$ok) { |
|
| 54 | - $re = "Impossible de creer la base $re"; |
|
| 55 | - spip_log($re); |
|
| 56 | - return '<p>' . _T('avis_connexion_erreur_creer_base') . "</p><!--\n$re\n-->"; |
|
| 57 | - } |
|
| 58 | - } else { |
|
| 59 | - $re = "Le nom de la base doit correspondre a $re"; |
|
| 60 | - spip_log($re); |
|
| 61 | - |
|
| 62 | - return '<p>' . _T('avis_connexion_erreur_nom_base') . "</p><!--\n$re\n-->"; |
|
| 63 | - } |
|
| 64 | - } |
|
| 65 | - |
|
| 66 | - // on rejoue la connexion apres avoir teste si il faut lui indiquer |
|
| 67 | - // un sql_mode |
|
| 68 | - install_mode_appel($server_db, false); |
|
| 69 | - $GLOBALS['connexions'][$server_db] |
|
| 70 | - = spip_connect_db($adresse_db, $port, $login_db, $pass_db, $sel_db, $server_db); |
|
| 71 | - |
|
| 72 | - $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
|
| 73 | - = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 74 | - |
|
| 75 | - // Completer le tableau decrivant la connexion |
|
| 76 | - |
|
| 77 | - $GLOBALS['connexions'][$server_db]['prefixe'] = $table_prefix; |
|
| 78 | - $GLOBALS['connexions'][$server_db]['db'] = $sel_db; |
|
| 79 | - |
|
| 80 | - $old = sql_showbase($table_prefix . '_meta', $server_db); |
|
| 81 | - if ($old) { |
|
| 82 | - $old = sql_fetch($old, $server_db); |
|
| 83 | - } |
|
| 84 | - if (!$old) { |
|
| 85 | - // Si possible, demander au serveur d'envoyer les textes |
|
| 86 | - // dans le codage std de SPIP, |
|
| 87 | - $charset = sql_get_charset(_DEFAULT_CHARSET, $server_db); |
|
| 88 | - |
|
| 89 | - if ($charset) { |
|
| 90 | - sql_set_charset($charset['charset'], $server_db); |
|
| 91 | - $GLOBALS['meta']['charset_sql_base'] = |
|
| 92 | - $charset['charset']; |
|
| 93 | - $GLOBALS['meta']['charset_collation_sql_base'] = |
|
| 94 | - $charset['collation']; |
|
| 95 | - $GLOBALS['meta']['charset_sql_connexion'] = |
|
| 96 | - $charset['charset']; |
|
| 97 | - $charsetbase = $charset['charset']; |
|
| 98 | - } else { |
|
| 99 | - spip_log(_DEFAULT_CHARSET . ' inconnu du serveur SQL'); |
|
| 100 | - $charsetbase = 'standard'; |
|
| 101 | - } |
|
| 102 | - spip_log("Creation des tables. Codage $charsetbase"); |
|
| 103 | - creer_base($server_db); // AT LAST |
|
| 104 | - // memoriser avec quel charset on l'a creee |
|
| 105 | - |
|
| 106 | - if ($charset) { |
|
| 107 | - $t = [ |
|
| 108 | - 'nom' => 'charset_sql_base', |
|
| 109 | - 'valeur' => $charset['charset'], |
|
| 110 | - 'impt' => 'non' |
|
| 111 | - ]; |
|
| 112 | - @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 113 | - $t['nom'] = 'charset_collation_sql_base'; |
|
| 114 | - $t['valeur'] = $charset['collation']; |
|
| 115 | - @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 116 | - $t['nom'] = 'charset_sql_connexion'; |
|
| 117 | - $t['valeur'] = $charset['charset']; |
|
| 118 | - @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 119 | - } |
|
| 120 | - $t = [ |
|
| 121 | - 'nom' => 'version_installee', |
|
| 122 | - 'valeur' => $GLOBALS['spip_version_base'], |
|
| 123 | - 'impt' => 'non' |
|
| 124 | - ]; |
|
| 125 | - @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 126 | - $t['nom'] = 'nouvelle_install'; |
|
| 127 | - $t['valeur'] = 1; |
|
| 128 | - @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 129 | - // positionner la langue par defaut du site si un cookie de lang a ete mis |
|
| 130 | - if (isset($_COOKIE['spip_lang_ecrire'])) { |
|
| 131 | - @sql_insertq( |
|
| 132 | - 'spip_meta', |
|
| 133 | - ['nom' => 'langue_site', 'valeur' => $_COOKIE['spip_lang_ecrire']], |
|
| 134 | - [], |
|
| 135 | - $server_db |
|
| 136 | - ); |
|
| 137 | - } |
|
| 138 | - } else { |
|
| 139 | - // pour recreer les tables disparues au besoin |
|
| 140 | - spip_log('Table des Meta deja la. Verification des autres.'); |
|
| 141 | - creer_base($server_db); |
|
| 142 | - $fupdateq = sql_serveur('updateq', $server_db); |
|
| 143 | - |
|
| 144 | - $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='version_installee'", $server_db); |
|
| 145 | - |
|
| 146 | - if ($r) { |
|
| 147 | - $r = sql_fetch($r, $server_db); |
|
| 148 | - } |
|
| 149 | - $version_installee = $r ? (double)$r['valeur'] : 0; |
|
| 150 | - if (!$version_installee || $GLOBALS['spip_version_base'] < $version_installee) { |
|
| 151 | - $fupdateq( |
|
| 152 | - 'spip_meta', |
|
| 153 | - ['valeur' => $GLOBALS['spip_version_base'], 'impt' => 'non'], |
|
| 154 | - "nom='version_installee'", |
|
| 155 | - '', |
|
| 156 | - $server_db |
|
| 157 | - ); |
|
| 158 | - spip_log('nouvelle version installee: ' . $GLOBALS['spip_version_base']); |
|
| 159 | - } |
|
| 160 | - // eliminer la derniere operation d'admin mal terminee |
|
| 161 | - // notamment la mise a jour |
|
| 162 | - @$fquery("DELETE FROM spip_meta WHERE nom='import_all' OR nom='admin'", $server_db); |
|
| 163 | - } |
|
| 164 | - |
|
| 165 | - // recuperer le charset de la connexion dans les meta |
|
| 166 | - $charset = ''; |
|
| 167 | - $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='charset_sql_connexion'", $server_db); |
|
| 168 | - if ($r) { |
|
| 169 | - $r = sql_fetch($r, $server_db); |
|
| 170 | - } |
|
| 171 | - if ($r) { |
|
| 172 | - $charset = $r['valeur']; |
|
| 173 | - } |
|
| 174 | - |
|
| 175 | - $ligne_rappel = install_mode_appel($server_db); |
|
| 176 | - |
|
| 177 | - $result_ok = @$fquery('SELECT COUNT(*) FROM spip_meta', $server_db); |
|
| 178 | - if (!$result_ok) { |
|
| 179 | - return "<!--\nvielle = $old rappel= $ligne_rappel\n-->"; |
|
| 180 | - } |
|
| 181 | - |
|
| 182 | - if ($chmod_db) { |
|
| 183 | - install_fichier_connexion( |
|
| 184 | - _FILE_CHMOD_TMP, |
|
| 185 | - "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', " . sprintf('0%3o', $chmod_db) . ");\n" |
|
| 186 | - ); |
|
| 187 | - } |
|
| 188 | - |
|
| 189 | - // si ce fichier existe a cette etape c'est qu'il provient |
|
| 190 | - // d'une installation qui ne l'a pas cree correctement. |
|
| 191 | - // Le supprimer pour que _FILE_CONNECT_TMP prime. |
|
| 192 | - |
|
| 193 | - if (_FILE_CONNECT && file_exists(_FILE_CONNECT)) { |
|
| 194 | - spip_unlink(_FILE_CONNECT); |
|
| 195 | - } |
|
| 196 | - |
|
| 197 | - install_fichier_connexion( |
|
| 198 | - _FILE_CONNECT_TMP, |
|
| 199 | - $ligne_rappel |
|
| 200 | - . install_connexion( |
|
| 201 | - $adresse_db, |
|
| 202 | - $port, |
|
| 203 | - $login_db, |
|
| 204 | - $pass_db, |
|
| 205 | - $sel_db, |
|
| 206 | - $server_db, |
|
| 207 | - $table_prefix, |
|
| 208 | - '', |
|
| 209 | - $charset |
|
| 210 | - ) |
|
| 211 | - ); |
|
| 212 | - |
|
| 213 | - return ''; |
|
| 21 | + // Prefix des tables : |
|
| 22 | + // S'il n'est pas defini par mes_options/inc/mutualiser, on va le creer |
|
| 23 | + // a partir de ce qui est envoye a l'installation |
|
| 24 | + if (!defined('_INSTALL_TABLE_PREFIX')) { |
|
| 25 | + $table_prefix = ($GLOBALS['table_prefix'] != 'spip') |
|
| 26 | + ? $GLOBALS['table_prefix'] |
|
| 27 | + : preparer_prefixe_tables(_request('tprefix')); |
|
| 28 | + // S'il est vide on remet spip |
|
| 29 | + if (!$table_prefix) { |
|
| 30 | + $table_prefix = 'spip'; |
|
| 31 | + } |
|
| 32 | + } else { |
|
| 33 | + $table_prefix = _INSTALL_TABLE_PREFIX; |
|
| 34 | + } |
|
| 35 | + |
|
| 36 | + if (preg_match(',(.*):(.*),', (string) $adresse_db, $r)) { |
|
| 37 | + [, $adresse_db, $port] = $r; |
|
| 38 | + } else { |
|
| 39 | + $port = ''; |
|
| 40 | + } |
|
| 41 | + |
|
| 42 | + $GLOBALS['connexions'][$server_db] |
|
| 43 | + = spip_connect_db($adresse_db, $port, $login_db, $pass_db, '', $server_db); |
|
| 44 | + |
|
| 45 | + $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
|
| 46 | + = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 47 | + |
|
| 48 | + $fquery = sql_serveur('query', $server_db); |
|
| 49 | + if ($choix_db == 'new_spip') { |
|
| 50 | + $re = ',^[a-z_][a-z_0-9-]*$,i'; |
|
| 51 | + if (preg_match($re, (string) $sel_db)) { |
|
| 52 | + $ok = sql_create_base($sel_db, $server_db); |
|
| 53 | + if (!$ok) { |
|
| 54 | + $re = "Impossible de creer la base $re"; |
|
| 55 | + spip_log($re); |
|
| 56 | + return '<p>' . _T('avis_connexion_erreur_creer_base') . "</p><!--\n$re\n-->"; |
|
| 57 | + } |
|
| 58 | + } else { |
|
| 59 | + $re = "Le nom de la base doit correspondre a $re"; |
|
| 60 | + spip_log($re); |
|
| 61 | + |
|
| 62 | + return '<p>' . _T('avis_connexion_erreur_nom_base') . "</p><!--\n$re\n-->"; |
|
| 63 | + } |
|
| 64 | + } |
|
| 65 | + |
|
| 66 | + // on rejoue la connexion apres avoir teste si il faut lui indiquer |
|
| 67 | + // un sql_mode |
|
| 68 | + install_mode_appel($server_db, false); |
|
| 69 | + $GLOBALS['connexions'][$server_db] |
|
| 70 | + = spip_connect_db($adresse_db, $port, $login_db, $pass_db, $sel_db, $server_db); |
|
| 71 | + |
|
| 72 | + $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
|
| 73 | + = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 74 | + |
|
| 75 | + // Completer le tableau decrivant la connexion |
|
| 76 | + |
|
| 77 | + $GLOBALS['connexions'][$server_db]['prefixe'] = $table_prefix; |
|
| 78 | + $GLOBALS['connexions'][$server_db]['db'] = $sel_db; |
|
| 79 | + |
|
| 80 | + $old = sql_showbase($table_prefix . '_meta', $server_db); |
|
| 81 | + if ($old) { |
|
| 82 | + $old = sql_fetch($old, $server_db); |
|
| 83 | + } |
|
| 84 | + if (!$old) { |
|
| 85 | + // Si possible, demander au serveur d'envoyer les textes |
|
| 86 | + // dans le codage std de SPIP, |
|
| 87 | + $charset = sql_get_charset(_DEFAULT_CHARSET, $server_db); |
|
| 88 | + |
|
| 89 | + if ($charset) { |
|
| 90 | + sql_set_charset($charset['charset'], $server_db); |
|
| 91 | + $GLOBALS['meta']['charset_sql_base'] = |
|
| 92 | + $charset['charset']; |
|
| 93 | + $GLOBALS['meta']['charset_collation_sql_base'] = |
|
| 94 | + $charset['collation']; |
|
| 95 | + $GLOBALS['meta']['charset_sql_connexion'] = |
|
| 96 | + $charset['charset']; |
|
| 97 | + $charsetbase = $charset['charset']; |
|
| 98 | + } else { |
|
| 99 | + spip_log(_DEFAULT_CHARSET . ' inconnu du serveur SQL'); |
|
| 100 | + $charsetbase = 'standard'; |
|
| 101 | + } |
|
| 102 | + spip_log("Creation des tables. Codage $charsetbase"); |
|
| 103 | + creer_base($server_db); // AT LAST |
|
| 104 | + // memoriser avec quel charset on l'a creee |
|
| 105 | + |
|
| 106 | + if ($charset) { |
|
| 107 | + $t = [ |
|
| 108 | + 'nom' => 'charset_sql_base', |
|
| 109 | + 'valeur' => $charset['charset'], |
|
| 110 | + 'impt' => 'non' |
|
| 111 | + ]; |
|
| 112 | + @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 113 | + $t['nom'] = 'charset_collation_sql_base'; |
|
| 114 | + $t['valeur'] = $charset['collation']; |
|
| 115 | + @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 116 | + $t['nom'] = 'charset_sql_connexion'; |
|
| 117 | + $t['valeur'] = $charset['charset']; |
|
| 118 | + @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 119 | + } |
|
| 120 | + $t = [ |
|
| 121 | + 'nom' => 'version_installee', |
|
| 122 | + 'valeur' => $GLOBALS['spip_version_base'], |
|
| 123 | + 'impt' => 'non' |
|
| 124 | + ]; |
|
| 125 | + @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 126 | + $t['nom'] = 'nouvelle_install'; |
|
| 127 | + $t['valeur'] = 1; |
|
| 128 | + @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 129 | + // positionner la langue par defaut du site si un cookie de lang a ete mis |
|
| 130 | + if (isset($_COOKIE['spip_lang_ecrire'])) { |
|
| 131 | + @sql_insertq( |
|
| 132 | + 'spip_meta', |
|
| 133 | + ['nom' => 'langue_site', 'valeur' => $_COOKIE['spip_lang_ecrire']], |
|
| 134 | + [], |
|
| 135 | + $server_db |
|
| 136 | + ); |
|
| 137 | + } |
|
| 138 | + } else { |
|
| 139 | + // pour recreer les tables disparues au besoin |
|
| 140 | + spip_log('Table des Meta deja la. Verification des autres.'); |
|
| 141 | + creer_base($server_db); |
|
| 142 | + $fupdateq = sql_serveur('updateq', $server_db); |
|
| 143 | + |
|
| 144 | + $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='version_installee'", $server_db); |
|
| 145 | + |
|
| 146 | + if ($r) { |
|
| 147 | + $r = sql_fetch($r, $server_db); |
|
| 148 | + } |
|
| 149 | + $version_installee = $r ? (double)$r['valeur'] : 0; |
|
| 150 | + if (!$version_installee || $GLOBALS['spip_version_base'] < $version_installee) { |
|
| 151 | + $fupdateq( |
|
| 152 | + 'spip_meta', |
|
| 153 | + ['valeur' => $GLOBALS['spip_version_base'], 'impt' => 'non'], |
|
| 154 | + "nom='version_installee'", |
|
| 155 | + '', |
|
| 156 | + $server_db |
|
| 157 | + ); |
|
| 158 | + spip_log('nouvelle version installee: ' . $GLOBALS['spip_version_base']); |
|
| 159 | + } |
|
| 160 | + // eliminer la derniere operation d'admin mal terminee |
|
| 161 | + // notamment la mise a jour |
|
| 162 | + @$fquery("DELETE FROM spip_meta WHERE nom='import_all' OR nom='admin'", $server_db); |
|
| 163 | + } |
|
| 164 | + |
|
| 165 | + // recuperer le charset de la connexion dans les meta |
|
| 166 | + $charset = ''; |
|
| 167 | + $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='charset_sql_connexion'", $server_db); |
|
| 168 | + if ($r) { |
|
| 169 | + $r = sql_fetch($r, $server_db); |
|
| 170 | + } |
|
| 171 | + if ($r) { |
|
| 172 | + $charset = $r['valeur']; |
|
| 173 | + } |
|
| 174 | + |
|
| 175 | + $ligne_rappel = install_mode_appel($server_db); |
|
| 176 | + |
|
| 177 | + $result_ok = @$fquery('SELECT COUNT(*) FROM spip_meta', $server_db); |
|
| 178 | + if (!$result_ok) { |
|
| 179 | + return "<!--\nvielle = $old rappel= $ligne_rappel\n-->"; |
|
| 180 | + } |
|
| 181 | + |
|
| 182 | + if ($chmod_db) { |
|
| 183 | + install_fichier_connexion( |
|
| 184 | + _FILE_CHMOD_TMP, |
|
| 185 | + "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', " . sprintf('0%3o', $chmod_db) . ");\n" |
|
| 186 | + ); |
|
| 187 | + } |
|
| 188 | + |
|
| 189 | + // si ce fichier existe a cette etape c'est qu'il provient |
|
| 190 | + // d'une installation qui ne l'a pas cree correctement. |
|
| 191 | + // Le supprimer pour que _FILE_CONNECT_TMP prime. |
|
| 192 | + |
|
| 193 | + if (_FILE_CONNECT && file_exists(_FILE_CONNECT)) { |
|
| 194 | + spip_unlink(_FILE_CONNECT); |
|
| 195 | + } |
|
| 196 | + |
|
| 197 | + install_fichier_connexion( |
|
| 198 | + _FILE_CONNECT_TMP, |
|
| 199 | + $ligne_rappel |
|
| 200 | + . install_connexion( |
|
| 201 | + $adresse_db, |
|
| 202 | + $port, |
|
| 203 | + $login_db, |
|
| 204 | + $pass_db, |
|
| 205 | + $sel_db, |
|
| 206 | + $server_db, |
|
| 207 | + $table_prefix, |
|
| 208 | + '', |
|
| 209 | + $charset |
|
| 210 | + ) |
|
| 211 | + ); |
|
| 212 | + |
|
| 213 | + return ''; |
|
| 214 | 214 | } |
| 215 | 215 | |
| 216 | 216 | /** |
@@ -225,166 +225,166 @@ discard block |
||
| 225 | 225 | * @return string Le préfixe corrigé |
| 226 | 226 | */ |
| 227 | 227 | function preparer_prefixe_tables($prefixe) { |
| 228 | - return trim(preg_replace(',^\d+,', '', preg_replace(',[^a-z0-9],', '', strtolower($prefixe)))); |
|
| 228 | + return trim(preg_replace(',^\d+,', '', preg_replace(',[^a-z0-9],', '', strtolower($prefixe)))); |
|
| 229 | 229 | } |
| 230 | 230 | |
| 231 | 231 | function install_propose_ldap() { |
| 232 | - return generer_form_ecrire('install', ( |
|
| 233 | - fieldset( |
|
| 234 | - _T('info_authentification_externe'), |
|
| 235 | - [ |
|
| 236 | - 'etape' => [ |
|
| 237 | - 'label' => _T('texte_annuaire_ldap_1'), |
|
| 238 | - 'valeur' => 'ldap1', |
|
| 239 | - 'hidden' => true |
|
| 240 | - ] |
|
| 241 | - ], |
|
| 242 | - bouton_suivant(_T('bouton_acces_ldap')) |
|
| 243 | - ))); |
|
| 232 | + return generer_form_ecrire('install', ( |
|
| 233 | + fieldset( |
|
| 234 | + _T('info_authentification_externe'), |
|
| 235 | + [ |
|
| 236 | + 'etape' => [ |
|
| 237 | + 'label' => _T('texte_annuaire_ldap_1'), |
|
| 238 | + 'valeur' => 'ldap1', |
|
| 239 | + 'hidden' => true |
|
| 240 | + ] |
|
| 241 | + ], |
|
| 242 | + bouton_suivant(_T('bouton_acces_ldap')) |
|
| 243 | + ))); |
|
| 244 | 244 | } |
| 245 | 245 | |
| 246 | 246 | |
| 247 | 247 | function install_premier_auteur($email, $login, $nom, #[\SensitiveParameter] $pass, $hidden, $auteur_obligatoire) { |
| 248 | - return info_progression_etape(3, 'etape_', 'install/') . |
|
| 249 | - info_etape( |
|
| 250 | - _T('info_informations_personnelles'), |
|
| 251 | - '<b>' . _T('texte_informations_personnelles_1') . '</b>' . |
|
| 252 | - aider('install5', true) . |
|
| 253 | - '<p>' . |
|
| 254 | - ($auteur_obligatoire ? |
|
| 255 | - '' |
|
| 256 | - : |
|
| 257 | - _T('texte_informations_personnelles_2') . ' ' . _T('info_laisser_champs_vides') |
|
| 258 | - ) |
|
| 259 | - ) |
|
| 260 | - . generer_form_ecrire('install', ( |
|
| 261 | - "\n<input type='hidden' name='etape' value='3b' />" |
|
| 262 | - . $hidden |
|
| 263 | - . fieldset( |
|
| 264 | - _T('info_identification_publique'), |
|
| 265 | - [ |
|
| 266 | - 'nom' => [ |
|
| 267 | - 'label' => '<b>' . _T('entree_signature') . "</b><br />\n" . _T('entree_nom_pseudo_1') . "\n", |
|
| 268 | - 'valeur' => $nom, |
|
| 269 | - 'required' => $auteur_obligatoire, |
|
| 270 | - ], |
|
| 271 | - 'email' => [ |
|
| 272 | - 'label' => '<b>' . _T('entree_adresse_email') . "</b>\n", |
|
| 273 | - 'valeur' => $email, |
|
| 274 | - ] |
|
| 275 | - ] |
|
| 276 | - ) |
|
| 277 | - |
|
| 278 | - . fieldset( |
|
| 279 | - _T('entree_identifiants_connexion'), |
|
| 280 | - [ |
|
| 281 | - 'login' => [ |
|
| 282 | - 'label' => '<b>' . _T('entree_login') . "</b><br />\n" . _T( |
|
| 283 | - 'info_login_trop_court_car_pluriel', |
|
| 284 | - ['nb' => _LOGIN_TROP_COURT] |
|
| 285 | - ) . "\n", |
|
| 286 | - 'valeur' => $login, |
|
| 287 | - 'required' => $auteur_obligatoire, |
|
| 288 | - ], |
|
| 289 | - 'pass' => [ |
|
| 290 | - 'label' => '<b>' . _T('entree_mot_passe') . "</b><br />\n" . _T( |
|
| 291 | - 'info_passe_trop_court_car_pluriel', |
|
| 292 | - ['nb' => _PASS_LONGUEUR_MINI] |
|
| 293 | - ) . "\n", |
|
| 294 | - 'valeur' => $pass, |
|
| 295 | - 'required' => $auteur_obligatoire, |
|
| 296 | - ], |
|
| 297 | - 'pass_verif' => [ |
|
| 298 | - 'label' => '<b>' . _T('info_confirmer_passe') . "</b><br />\n", |
|
| 299 | - 'valeur' => $pass, |
|
| 300 | - 'required' => $auteur_obligatoire, |
|
| 301 | - ] |
|
| 302 | - ] |
|
| 303 | - ) |
|
| 304 | - . bouton_suivant())); |
|
| 248 | + return info_progression_etape(3, 'etape_', 'install/') . |
|
| 249 | + info_etape( |
|
| 250 | + _T('info_informations_personnelles'), |
|
| 251 | + '<b>' . _T('texte_informations_personnelles_1') . '</b>' . |
|
| 252 | + aider('install5', true) . |
|
| 253 | + '<p>' . |
|
| 254 | + ($auteur_obligatoire ? |
|
| 255 | + '' |
|
| 256 | + : |
|
| 257 | + _T('texte_informations_personnelles_2') . ' ' . _T('info_laisser_champs_vides') |
|
| 258 | + ) |
|
| 259 | + ) |
|
| 260 | + . generer_form_ecrire('install', ( |
|
| 261 | + "\n<input type='hidden' name='etape' value='3b' />" |
|
| 262 | + . $hidden |
|
| 263 | + . fieldset( |
|
| 264 | + _T('info_identification_publique'), |
|
| 265 | + [ |
|
| 266 | + 'nom' => [ |
|
| 267 | + 'label' => '<b>' . _T('entree_signature') . "</b><br />\n" . _T('entree_nom_pseudo_1') . "\n", |
|
| 268 | + 'valeur' => $nom, |
|
| 269 | + 'required' => $auteur_obligatoire, |
|
| 270 | + ], |
|
| 271 | + 'email' => [ |
|
| 272 | + 'label' => '<b>' . _T('entree_adresse_email') . "</b>\n", |
|
| 273 | + 'valeur' => $email, |
|
| 274 | + ] |
|
| 275 | + ] |
|
| 276 | + ) |
|
| 277 | + |
|
| 278 | + . fieldset( |
|
| 279 | + _T('entree_identifiants_connexion'), |
|
| 280 | + [ |
|
| 281 | + 'login' => [ |
|
| 282 | + 'label' => '<b>' . _T('entree_login') . "</b><br />\n" . _T( |
|
| 283 | + 'info_login_trop_court_car_pluriel', |
|
| 284 | + ['nb' => _LOGIN_TROP_COURT] |
|
| 285 | + ) . "\n", |
|
| 286 | + 'valeur' => $login, |
|
| 287 | + 'required' => $auteur_obligatoire, |
|
| 288 | + ], |
|
| 289 | + 'pass' => [ |
|
| 290 | + 'label' => '<b>' . _T('entree_mot_passe') . "</b><br />\n" . _T( |
|
| 291 | + 'info_passe_trop_court_car_pluriel', |
|
| 292 | + ['nb' => _PASS_LONGUEUR_MINI] |
|
| 293 | + ) . "\n", |
|
| 294 | + 'valeur' => $pass, |
|
| 295 | + 'required' => $auteur_obligatoire, |
|
| 296 | + ], |
|
| 297 | + 'pass_verif' => [ |
|
| 298 | + 'label' => '<b>' . _T('info_confirmer_passe') . "</b><br />\n", |
|
| 299 | + 'valeur' => $pass, |
|
| 300 | + 'required' => $auteur_obligatoire, |
|
| 301 | + ] |
|
| 302 | + ] |
|
| 303 | + ) |
|
| 304 | + . bouton_suivant())); |
|
| 305 | 305 | } |
| 306 | 306 | |
| 307 | 307 | function install_etape_3_dist() { |
| 308 | - $ldap_present = _request('ldap_present'); |
|
| 309 | - |
|
| 310 | - if (!$ldap_present) { |
|
| 311 | - $adresse_db = defined('_INSTALL_HOST_DB') |
|
| 312 | - ? _INSTALL_HOST_DB |
|
| 313 | - : _request('adresse_db'); |
|
| 314 | - |
|
| 315 | - $login_db = defined('_INSTALL_USER_DB') |
|
| 316 | - ? _INSTALL_USER_DB |
|
| 317 | - : _request('login_db'); |
|
| 318 | - |
|
| 319 | - $pass_db = defined('_INSTALL_PASS_DB') |
|
| 320 | - ? _INSTALL_PASS_DB |
|
| 321 | - : _request('pass_db'); |
|
| 322 | - |
|
| 323 | - $server_db = defined('_INSTALL_SERVER_DB') |
|
| 324 | - ? _INSTALL_SERVER_DB |
|
| 325 | - : _request('server_db'); |
|
| 326 | - |
|
| 327 | - $chmod_db = defined('_SPIP_CHMOD') |
|
| 328 | - ? _SPIP_CHMOD |
|
| 329 | - : _request('chmod'); |
|
| 330 | - |
|
| 331 | - $choix_db = defined('_INSTALL_NAME_DB') |
|
| 332 | - ? _INSTALL_NAME_DB |
|
| 333 | - : _request('choix_db'); |
|
| 334 | - |
|
| 335 | - $sel_db = ($choix_db == 'new_spip') |
|
| 336 | - ? _request('table_new') : $choix_db; |
|
| 337 | - |
|
| 338 | - $res = install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db); |
|
| 339 | - |
|
| 340 | - if ($res) { |
|
| 341 | - $res = info_progression_etape(2, 'etape_', 'install/', true) |
|
| 342 | - . "<div class='error'><h3>" . _T('avis_operation_echec') . '</h3>' |
|
| 343 | - . $res |
|
| 344 | - . '<p>' . _T('texte_operation_echec') . '</p>' |
|
| 345 | - . '</div>'; |
|
| 346 | - } |
|
| 347 | - } else { |
|
| 348 | - $res = ''; |
|
| 349 | - [$adresse_db, $login_db, $pass_db, $sel_db, $server_db] = analyse_fichier_connection(_FILE_CONNECT_TMP); |
|
| 350 | - $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, $sel_db, $login_db, $pass_db, $sel_db, $server_db); |
|
| 351 | - } |
|
| 352 | - |
|
| 353 | - if (!$res) { |
|
| 354 | - if (file_exists(_FILE_CONNECT_TMP)) { |
|
| 355 | - include(_FILE_CONNECT_TMP); |
|
| 356 | - } else { |
|
| 357 | - redirige_url_ecrire('install'); |
|
| 358 | - } |
|
| 359 | - |
|
| 360 | - if (file_exists(_FILE_CHMOD_TMP)) { |
|
| 361 | - include(_FILE_CHMOD_TMP); |
|
| 362 | - } else { |
|
| 363 | - redirige_url_ecrire('install'); |
|
| 364 | - } |
|
| 365 | - |
|
| 366 | - $hidden = predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) |
|
| 367 | - . (defined('_INSTALL_NAME_DB') ? '' |
|
| 368 | - : "\n<input type='hidden' name='sel_db' value=\"" . spip_htmlspecialchars($sel_db) . '" />'); |
|
| 369 | - |
|
| 370 | - $auteur_obligatoire = ($ldap_present ? 0 : !sql_countsel('spip_auteurs', '', '', '', $server_db)); |
|
| 371 | - |
|
| 372 | - $res = "<div class='success'><b>" |
|
| 373 | - . _T('info_base_installee') |
|
| 374 | - . '</b></div>' |
|
| 375 | - . install_premier_auteur( |
|
| 376 | - _request('email'), |
|
| 377 | - _request('login'), |
|
| 378 | - _request('nom'), |
|
| 379 | - _request('pass'), |
|
| 380 | - $hidden, |
|
| 381 | - $auteur_obligatoire |
|
| 382 | - ) |
|
| 383 | - . (($ldap_present || !function_exists('ldap_connect')) |
|
| 384 | - ? '' : install_propose_ldap()); |
|
| 385 | - } |
|
| 386 | - |
|
| 387 | - |
|
| 388 | - $minipage = new Spip\Afficher\Minipage\Installation(); |
|
| 389 | - echo $minipage->page($res); |
|
| 308 | + $ldap_present = _request('ldap_present'); |
|
| 309 | + |
|
| 310 | + if (!$ldap_present) { |
|
| 311 | + $adresse_db = defined('_INSTALL_HOST_DB') |
|
| 312 | + ? _INSTALL_HOST_DB |
|
| 313 | + : _request('adresse_db'); |
|
| 314 | + |
|
| 315 | + $login_db = defined('_INSTALL_USER_DB') |
|
| 316 | + ? _INSTALL_USER_DB |
|
| 317 | + : _request('login_db'); |
|
| 318 | + |
|
| 319 | + $pass_db = defined('_INSTALL_PASS_DB') |
|
| 320 | + ? _INSTALL_PASS_DB |
|
| 321 | + : _request('pass_db'); |
|
| 322 | + |
|
| 323 | + $server_db = defined('_INSTALL_SERVER_DB') |
|
| 324 | + ? _INSTALL_SERVER_DB |
|
| 325 | + : _request('server_db'); |
|
| 326 | + |
|
| 327 | + $chmod_db = defined('_SPIP_CHMOD') |
|
| 328 | + ? _SPIP_CHMOD |
|
| 329 | + : _request('chmod'); |
|
| 330 | + |
|
| 331 | + $choix_db = defined('_INSTALL_NAME_DB') |
|
| 332 | + ? _INSTALL_NAME_DB |
|
| 333 | + : _request('choix_db'); |
|
| 334 | + |
|
| 335 | + $sel_db = ($choix_db == 'new_spip') |
|
| 336 | + ? _request('table_new') : $choix_db; |
|
| 337 | + |
|
| 338 | + $res = install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db); |
|
| 339 | + |
|
| 340 | + if ($res) { |
|
| 341 | + $res = info_progression_etape(2, 'etape_', 'install/', true) |
|
| 342 | + . "<div class='error'><h3>" . _T('avis_operation_echec') . '</h3>' |
|
| 343 | + . $res |
|
| 344 | + . '<p>' . _T('texte_operation_echec') . '</p>' |
|
| 345 | + . '</div>'; |
|
| 346 | + } |
|
| 347 | + } else { |
|
| 348 | + $res = ''; |
|
| 349 | + [$adresse_db, $login_db, $pass_db, $sel_db, $server_db] = analyse_fichier_connection(_FILE_CONNECT_TMP); |
|
| 350 | + $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, $sel_db, $login_db, $pass_db, $sel_db, $server_db); |
|
| 351 | + } |
|
| 352 | + |
|
| 353 | + if (!$res) { |
|
| 354 | + if (file_exists(_FILE_CONNECT_TMP)) { |
|
| 355 | + include(_FILE_CONNECT_TMP); |
|
| 356 | + } else { |
|
| 357 | + redirige_url_ecrire('install'); |
|
| 358 | + } |
|
| 359 | + |
|
| 360 | + if (file_exists(_FILE_CHMOD_TMP)) { |
|
| 361 | + include(_FILE_CHMOD_TMP); |
|
| 362 | + } else { |
|
| 363 | + redirige_url_ecrire('install'); |
|
| 364 | + } |
|
| 365 | + |
|
| 366 | + $hidden = predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) |
|
| 367 | + . (defined('_INSTALL_NAME_DB') ? '' |
|
| 368 | + : "\n<input type='hidden' name='sel_db' value=\"" . spip_htmlspecialchars($sel_db) . '" />'); |
|
| 369 | + |
|
| 370 | + $auteur_obligatoire = ($ldap_present ? 0 : !sql_countsel('spip_auteurs', '', '', '', $server_db)); |
|
| 371 | + |
|
| 372 | + $res = "<div class='success'><b>" |
|
| 373 | + . _T('info_base_installee') |
|
| 374 | + . '</b></div>' |
|
| 375 | + . install_premier_auteur( |
|
| 376 | + _request('email'), |
|
| 377 | + _request('login'), |
|
| 378 | + _request('nom'), |
|
| 379 | + _request('pass'), |
|
| 380 | + $hidden, |
|
| 381 | + $auteur_obligatoire |
|
| 382 | + ) |
|
| 383 | + . (($ldap_present || !function_exists('ldap_connect')) |
|
| 384 | + ? '' : install_propose_ldap()); |
|
| 385 | + } |
|
| 386 | + |
|
| 387 | + |
|
| 388 | + $minipage = new Spip\Afficher\Minipage\Installation(); |
|
| 389 | + echo $minipage->page($res); |
|
| 390 | 390 | } |
@@ -19,178 +19,178 @@ discard block |
||
| 19 | 19 | **/ |
| 20 | 20 | |
| 21 | 21 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 22 | - return; |
|
| 22 | + return; |
|
| 23 | 23 | } |
| 24 | 24 | |
| 25 | 25 | // En cas de modification, il faut aussi actualiser la regexp de nettoyer_uri_var() dans inc/utils.php |
| 26 | 26 | if (!defined('_CONTEXTE_IGNORE_VARIABLES')) { |
| 27 | - define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/'); |
|
| 27 | + define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/'); |
|
| 28 | 28 | } |
| 29 | 29 | |
| 30 | 30 | function assembler($fond, string $connect = '') { |
| 31 | 31 | |
| 32 | - $chemin_cache = null; |
|
| 33 | - $lastmodified = null; |
|
| 34 | - $res = null; |
|
| 35 | - // flag_preserver est modifie ici, et utilise en globale |
|
| 36 | - // use_cache sert a informer le bouton d'admin pr savoir s'il met un * |
|
| 37 | - // contexte est utilise en globale dans le formulaire d'admin |
|
| 38 | - |
|
| 39 | - $GLOBALS['contexte'] = calculer_contexte(); |
|
| 40 | - $page = ['contexte_implicite' => calculer_contexte_implicite()]; |
|
| 41 | - $page['contexte_implicite']['cache'] = $fond . preg_replace( |
|
| 42 | - ',\.[a-zA-Z0-9]*$,', |
|
| 43 | - '', |
|
| 44 | - preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI']) |
|
| 45 | - ); |
|
| 46 | - // Cette fonction est utilisee deux fois |
|
| 47 | - $cacher = charger_fonction('cacher', 'public', true); |
|
| 48 | - // Les quatre derniers parametres sont modifies par la fonction: |
|
| 49 | - // emplacement, validite, et, s'il est valide, contenu & age |
|
| 50 | - if ($cacher) { |
|
| 51 | - $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified); |
|
| 52 | - } else { |
|
| 53 | - $GLOBALS['use_cache'] = -1; |
|
| 54 | - } |
|
| 55 | - // Si un resultat est retourne, c'est un message d'impossibilite |
|
| 56 | - if ($res) { |
|
| 57 | - return ['texte' => $res]; |
|
| 58 | - } |
|
| 59 | - |
|
| 60 | - if (!$chemin_cache || !$lastmodified) { |
|
| 61 | - $lastmodified = time(); |
|
| 62 | - } |
|
| 63 | - |
|
| 64 | - $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD'); |
|
| 65 | - $calculer_page = true; |
|
| 66 | - |
|
| 67 | - // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client}) |
|
| 68 | - // une perennite valide a meme reponse qu'une requete HEAD (par defaut les |
|
| 69 | - // pages sont dynamiques) |
|
| 70 | - if ( |
|
| 71 | - isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) |
|
| 72 | - and (!defined('_VAR_MODE') or !_VAR_MODE) |
|
| 73 | - and $chemin_cache |
|
| 74 | - and isset($page['entetes']) |
|
| 75 | - and isset($page['entetes']['Cache-Control']) |
|
| 76 | - and strstr($page['entetes']['Cache-Control'], 'max-age=') |
|
| 77 | - and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/') |
|
| 78 | - ) { |
|
| 79 | - $since = preg_replace( |
|
| 80 | - '/;.*/', |
|
| 81 | - '', |
|
| 82 | - $_SERVER['HTTP_IF_MODIFIED_SINCE'] |
|
| 83 | - ); |
|
| 84 | - $since = str_replace('GMT', '', $since); |
|
| 85 | - if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) { |
|
| 86 | - $page['status'] = 304; |
|
| 87 | - $headers_only = true; |
|
| 88 | - $calculer_page = false; |
|
| 89 | - } |
|
| 90 | - } |
|
| 91 | - |
|
| 92 | - // Si requete HEAD ou Last-modified compatible, ignorer le texte |
|
| 93 | - // et pas de content-type (pour contrer le bouton admin de inc-public) |
|
| 94 | - if (!$calculer_page) { |
|
| 95 | - $page['texte'] = ''; |
|
| 96 | - } else { |
|
| 97 | - // si la page est prise dans le cache |
|
| 98 | - if (!$GLOBALS['use_cache']) { |
|
| 99 | - // Informer les boutons d'admin du contexte |
|
| 100 | - // (fourni par urls_decoder_url ci-dessous lors de la mise en cache) |
|
| 101 | - $GLOBALS['contexte'] = $page['contexte']; |
|
| 102 | - |
|
| 103 | - // vider les globales url propres qui ne doivent plus etre utilisees en cas |
|
| 104 | - // d'inversion url => objet |
|
| 105 | - // plus necessaire si on utilise bien la fonction urls_decoder_url |
|
| 106 | - #unset($_SERVER['REDIRECT_url_propre']); |
|
| 107 | - #unset($_ENV['url_propre']); |
|
| 108 | - } else { |
|
| 109 | - // Compat ascendante : |
|
| 110 | - // 1. $contexte est global |
|
| 111 | - // (a evacuer car urls_decoder_url gere ce probleme ?) |
|
| 112 | - // et calculer la page |
|
| 113 | - if (!test_espace_prive()) { |
|
| 114 | - include_spip('inc/urls'); |
|
| 115 | - [$fond, $GLOBALS['contexte'], $url_redirect] = urls_decoder_url( |
|
| 116 | - nettoyer_uri(), |
|
| 117 | - $fond, |
|
| 118 | - $GLOBALS['contexte'], |
|
| 119 | - true |
|
| 120 | - ); |
|
| 121 | - } |
|
| 122 | - // squelette par defaut |
|
| 123 | - if (!strlen($fond ?? '')) { |
|
| 124 | - $fond = 'sommaire'; |
|
| 125 | - } |
|
| 126 | - |
|
| 127 | - // produire la page : peut mettre a jour $lastmodified |
|
| 128 | - $produire_page = charger_fonction('produire_page', 'public'); |
|
| 129 | - $page = $produire_page( |
|
| 130 | - $fond, |
|
| 131 | - $GLOBALS['contexte'], |
|
| 132 | - $GLOBALS['use_cache'], |
|
| 133 | - $chemin_cache, |
|
| 134 | - null, |
|
| 135 | - $page, |
|
| 136 | - $lastmodified, |
|
| 137 | - $connect |
|
| 138 | - ); |
|
| 139 | - if ($page === '') { |
|
| 140 | - $erreur = _T( |
|
| 141 | - 'info_erreur_squelette2', |
|
| 142 | - ['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES] |
|
| 143 | - ); |
|
| 144 | - erreur_squelette($erreur); |
|
| 145 | - // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4 |
|
| 146 | - $page = ['texte' => '', 'erreur' => $erreur]; |
|
| 147 | - } |
|
| 148 | - } |
|
| 149 | - |
|
| 150 | - if ($page and $chemin_cache) { |
|
| 151 | - $page['cache'] = $chemin_cache; |
|
| 152 | - } |
|
| 153 | - |
|
| 154 | - auto_content_type($page); |
|
| 155 | - |
|
| 156 | - $GLOBALS['flag_preserver'] |= headers_sent(); |
|
| 157 | - |
|
| 158 | - // Definir les entetes si ce n'est fait |
|
| 159 | - if (!$GLOBALS['flag_preserver']) { |
|
| 160 | - // Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions |
|
| 161 | - if ( |
|
| 162 | - trim($page['texte']) === '' |
|
| 163 | - and _VAR_MODE !== 'debug' |
|
| 164 | - and !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur |
|
| 165 | - ) { |
|
| 166 | - $GLOBALS['contexte']['fond_erreur'] = $fond; |
|
| 167 | - $page = message_page_indisponible($page, $GLOBALS['contexte']); |
|
| 168 | - } |
|
| 169 | - // pas de cache client en mode 'observation' |
|
| 170 | - if (defined('_VAR_MODE') and _VAR_MODE) { |
|
| 171 | - $page['entetes']['Cache-Control'] = 'no-cache,must-revalidate'; |
|
| 172 | - $page['entetes']['Pragma'] = 'no-cache'; |
|
| 173 | - } |
|
| 174 | - } |
|
| 175 | - } |
|
| 176 | - |
|
| 177 | - // Entete Last-Modified: |
|
| 178 | - // eviter d'etre incoherent en envoyant un lastmodified identique |
|
| 179 | - // a celui qu'on a refuse d'honorer plus haut (cf. #655) |
|
| 180 | - if ( |
|
| 181 | - $lastmodified |
|
| 182 | - and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) |
|
| 183 | - and !isset($page['entetes']['Last-Modified']) |
|
| 184 | - ) { |
|
| 185 | - $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT'; |
|
| 186 | - } |
|
| 187 | - |
|
| 188 | - // fermer la connexion apres les headers si requete HEAD |
|
| 189 | - if ($headers_only) { |
|
| 190 | - $page['entetes']['Connection'] = 'close'; |
|
| 191 | - } |
|
| 192 | - |
|
| 193 | - return $page; |
|
| 32 | + $chemin_cache = null; |
|
| 33 | + $lastmodified = null; |
|
| 34 | + $res = null; |
|
| 35 | + // flag_preserver est modifie ici, et utilise en globale |
|
| 36 | + // use_cache sert a informer le bouton d'admin pr savoir s'il met un * |
|
| 37 | + // contexte est utilise en globale dans le formulaire d'admin |
|
| 38 | + |
|
| 39 | + $GLOBALS['contexte'] = calculer_contexte(); |
|
| 40 | + $page = ['contexte_implicite' => calculer_contexte_implicite()]; |
|
| 41 | + $page['contexte_implicite']['cache'] = $fond . preg_replace( |
|
| 42 | + ',\.[a-zA-Z0-9]*$,', |
|
| 43 | + '', |
|
| 44 | + preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI']) |
|
| 45 | + ); |
|
| 46 | + // Cette fonction est utilisee deux fois |
|
| 47 | + $cacher = charger_fonction('cacher', 'public', true); |
|
| 48 | + // Les quatre derniers parametres sont modifies par la fonction: |
|
| 49 | + // emplacement, validite, et, s'il est valide, contenu & age |
|
| 50 | + if ($cacher) { |
|
| 51 | + $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified); |
|
| 52 | + } else { |
|
| 53 | + $GLOBALS['use_cache'] = -1; |
|
| 54 | + } |
|
| 55 | + // Si un resultat est retourne, c'est un message d'impossibilite |
|
| 56 | + if ($res) { |
|
| 57 | + return ['texte' => $res]; |
|
| 58 | + } |
|
| 59 | + |
|
| 60 | + if (!$chemin_cache || !$lastmodified) { |
|
| 61 | + $lastmodified = time(); |
|
| 62 | + } |
|
| 63 | + |
|
| 64 | + $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD'); |
|
| 65 | + $calculer_page = true; |
|
| 66 | + |
|
| 67 | + // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client}) |
|
| 68 | + // une perennite valide a meme reponse qu'une requete HEAD (par defaut les |
|
| 69 | + // pages sont dynamiques) |
|
| 70 | + if ( |
|
| 71 | + isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) |
|
| 72 | + and (!defined('_VAR_MODE') or !_VAR_MODE) |
|
| 73 | + and $chemin_cache |
|
| 74 | + and isset($page['entetes']) |
|
| 75 | + and isset($page['entetes']['Cache-Control']) |
|
| 76 | + and strstr($page['entetes']['Cache-Control'], 'max-age=') |
|
| 77 | + and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/') |
|
| 78 | + ) { |
|
| 79 | + $since = preg_replace( |
|
| 80 | + '/;.*/', |
|
| 81 | + '', |
|
| 82 | + $_SERVER['HTTP_IF_MODIFIED_SINCE'] |
|
| 83 | + ); |
|
| 84 | + $since = str_replace('GMT', '', $since); |
|
| 85 | + if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) { |
|
| 86 | + $page['status'] = 304; |
|
| 87 | + $headers_only = true; |
|
| 88 | + $calculer_page = false; |
|
| 89 | + } |
|
| 90 | + } |
|
| 91 | + |
|
| 92 | + // Si requete HEAD ou Last-modified compatible, ignorer le texte |
|
| 93 | + // et pas de content-type (pour contrer le bouton admin de inc-public) |
|
| 94 | + if (!$calculer_page) { |
|
| 95 | + $page['texte'] = ''; |
|
| 96 | + } else { |
|
| 97 | + // si la page est prise dans le cache |
|
| 98 | + if (!$GLOBALS['use_cache']) { |
|
| 99 | + // Informer les boutons d'admin du contexte |
|
| 100 | + // (fourni par urls_decoder_url ci-dessous lors de la mise en cache) |
|
| 101 | + $GLOBALS['contexte'] = $page['contexte']; |
|
| 102 | + |
|
| 103 | + // vider les globales url propres qui ne doivent plus etre utilisees en cas |
|
| 104 | + // d'inversion url => objet |
|
| 105 | + // plus necessaire si on utilise bien la fonction urls_decoder_url |
|
| 106 | + #unset($_SERVER['REDIRECT_url_propre']); |
|
| 107 | + #unset($_ENV['url_propre']); |
|
| 108 | + } else { |
|
| 109 | + // Compat ascendante : |
|
| 110 | + // 1. $contexte est global |
|
| 111 | + // (a evacuer car urls_decoder_url gere ce probleme ?) |
|
| 112 | + // et calculer la page |
|
| 113 | + if (!test_espace_prive()) { |
|
| 114 | + include_spip('inc/urls'); |
|
| 115 | + [$fond, $GLOBALS['contexte'], $url_redirect] = urls_decoder_url( |
|
| 116 | + nettoyer_uri(), |
|
| 117 | + $fond, |
|
| 118 | + $GLOBALS['contexte'], |
|
| 119 | + true |
|
| 120 | + ); |
|
| 121 | + } |
|
| 122 | + // squelette par defaut |
|
| 123 | + if (!strlen($fond ?? '')) { |
|
| 124 | + $fond = 'sommaire'; |
|
| 125 | + } |
|
| 126 | + |
|
| 127 | + // produire la page : peut mettre a jour $lastmodified |
|
| 128 | + $produire_page = charger_fonction('produire_page', 'public'); |
|
| 129 | + $page = $produire_page( |
|
| 130 | + $fond, |
|
| 131 | + $GLOBALS['contexte'], |
|
| 132 | + $GLOBALS['use_cache'], |
|
| 133 | + $chemin_cache, |
|
| 134 | + null, |
|
| 135 | + $page, |
|
| 136 | + $lastmodified, |
|
| 137 | + $connect |
|
| 138 | + ); |
|
| 139 | + if ($page === '') { |
|
| 140 | + $erreur = _T( |
|
| 141 | + 'info_erreur_squelette2', |
|
| 142 | + ['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES] |
|
| 143 | + ); |
|
| 144 | + erreur_squelette($erreur); |
|
| 145 | + // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4 |
|
| 146 | + $page = ['texte' => '', 'erreur' => $erreur]; |
|
| 147 | + } |
|
| 148 | + } |
|
| 149 | + |
|
| 150 | + if ($page and $chemin_cache) { |
|
| 151 | + $page['cache'] = $chemin_cache; |
|
| 152 | + } |
|
| 153 | + |
|
| 154 | + auto_content_type($page); |
|
| 155 | + |
|
| 156 | + $GLOBALS['flag_preserver'] |= headers_sent(); |
|
| 157 | + |
|
| 158 | + // Definir les entetes si ce n'est fait |
|
| 159 | + if (!$GLOBALS['flag_preserver']) { |
|
| 160 | + // Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions |
|
| 161 | + if ( |
|
| 162 | + trim($page['texte']) === '' |
|
| 163 | + and _VAR_MODE !== 'debug' |
|
| 164 | + and !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur |
|
| 165 | + ) { |
|
| 166 | + $GLOBALS['contexte']['fond_erreur'] = $fond; |
|
| 167 | + $page = message_page_indisponible($page, $GLOBALS['contexte']); |
|
| 168 | + } |
|
| 169 | + // pas de cache client en mode 'observation' |
|
| 170 | + if (defined('_VAR_MODE') and _VAR_MODE) { |
|
| 171 | + $page['entetes']['Cache-Control'] = 'no-cache,must-revalidate'; |
|
| 172 | + $page['entetes']['Pragma'] = 'no-cache'; |
|
| 173 | + } |
|
| 174 | + } |
|
| 175 | + } |
|
| 176 | + |
|
| 177 | + // Entete Last-Modified: |
|
| 178 | + // eviter d'etre incoherent en envoyant un lastmodified identique |
|
| 179 | + // a celui qu'on a refuse d'honorer plus haut (cf. #655) |
|
| 180 | + if ( |
|
| 181 | + $lastmodified |
|
| 182 | + and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) |
|
| 183 | + and !isset($page['entetes']['Last-Modified']) |
|
| 184 | + ) { |
|
| 185 | + $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT'; |
|
| 186 | + } |
|
| 187 | + |
|
| 188 | + // fermer la connexion apres les headers si requete HEAD |
|
| 189 | + if ($headers_only) { |
|
| 190 | + $page['entetes']['Connection'] = 'close'; |
|
| 191 | + } |
|
| 192 | + |
|
| 193 | + return $page; |
|
| 194 | 194 | } |
| 195 | 195 | |
| 196 | 196 | /** |
@@ -207,19 +207,19 @@ discard block |
||
| 207 | 207 | */ |
| 208 | 208 | function calculer_contexte() { |
| 209 | 209 | |
| 210 | - $contexte = []; |
|
| 211 | - foreach ($_GET as $var => $val) { |
|
| 212 | - if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) { |
|
| 213 | - $contexte[$var] = $val; |
|
| 214 | - } |
|
| 215 | - } |
|
| 216 | - foreach ($_POST as $var => $val) { |
|
| 217 | - if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) { |
|
| 218 | - $contexte[$var] = $val; |
|
| 219 | - } |
|
| 220 | - } |
|
| 221 | - |
|
| 222 | - return $contexte; |
|
| 210 | + $contexte = []; |
|
| 211 | + foreach ($_GET as $var => $val) { |
|
| 212 | + if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) { |
|
| 213 | + $contexte[$var] = $val; |
|
| 214 | + } |
|
| 215 | + } |
|
| 216 | + foreach ($_POST as $var => $val) { |
|
| 217 | + if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) { |
|
| 218 | + $contexte[$var] = $val; |
|
| 219 | + } |
|
| 220 | + } |
|
| 221 | + |
|
| 222 | + return $contexte; |
|
| 223 | 223 | } |
| 224 | 224 | |
| 225 | 225 | /** |
@@ -230,25 +230,25 @@ discard block |
||
| 230 | 230 | * @return array |
| 231 | 231 | */ |
| 232 | 232 | function calculer_contexte_implicite() { |
| 233 | - static $notes = null; |
|
| 234 | - if (is_null($notes)) { |
|
| 235 | - $notes = charger_fonction('notes', 'inc', true); |
|
| 236 | - } |
|
| 237 | - $contexte_implicite = [ |
|
| 238 | - 'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ? |
|
| 239 | - 'host' => ($_SERVER['HTTP_HOST'] ?? null), |
|
| 240 | - 'https' => ($_SERVER['HTTPS'] ?? ''), |
|
| 241 | - 'espace' => test_espace_prive(), |
|
| 242 | - 'marqueur' => ($GLOBALS['marqueur'] ?? ''), |
|
| 243 | - 'marqueur_skel' => ($GLOBALS['marqueur_skel'] ?? ''), |
|
| 244 | - 'notes' => $notes ? $notes('', 'contexter_cache') : '', |
|
| 245 | - 'spip_version_code' => $GLOBALS['spip_version_code'], |
|
| 246 | - ]; |
|
| 247 | - if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { |
|
| 248 | - $contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST']; |
|
| 249 | - } |
|
| 250 | - |
|
| 251 | - return $contexte_implicite; |
|
| 233 | + static $notes = null; |
|
| 234 | + if (is_null($notes)) { |
|
| 235 | + $notes = charger_fonction('notes', 'inc', true); |
|
| 236 | + } |
|
| 237 | + $contexte_implicite = [ |
|
| 238 | + 'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ? |
|
| 239 | + 'host' => ($_SERVER['HTTP_HOST'] ?? null), |
|
| 240 | + 'https' => ($_SERVER['HTTPS'] ?? ''), |
|
| 241 | + 'espace' => test_espace_prive(), |
|
| 242 | + 'marqueur' => ($GLOBALS['marqueur'] ?? ''), |
|
| 243 | + 'marqueur_skel' => ($GLOBALS['marqueur_skel'] ?? ''), |
|
| 244 | + 'notes' => $notes ? $notes('', 'contexter_cache') : '', |
|
| 245 | + 'spip_version_code' => $GLOBALS['spip_version_code'], |
|
| 246 | + ]; |
|
| 247 | + if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { |
|
| 248 | + $contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST']; |
|
| 249 | + } |
|
| 250 | + |
|
| 251 | + return $contexte_implicite; |
|
| 252 | 252 | } |
| 253 | 253 | |
| 254 | 254 | // |
@@ -257,55 +257,55 @@ discard block |
||
| 257 | 257 | |
| 258 | 258 | function auto_content_type($page) { |
| 259 | 259 | |
| 260 | - if (!isset($GLOBALS['flag_preserver'])) { |
|
| 261 | - $GLOBALS['flag_preserver'] = ($page && preg_match( |
|
| 262 | - '/header\s*\(\s*.content\-type:/isx', |
|
| 263 | - $page['texte'] |
|
| 264 | - ) || (isset($page['entetes']['Content-Type']))); |
|
| 265 | - } |
|
| 260 | + if (!isset($GLOBALS['flag_preserver'])) { |
|
| 261 | + $GLOBALS['flag_preserver'] = ($page && preg_match( |
|
| 262 | + '/header\s*\(\s*.content\-type:/isx', |
|
| 263 | + $page['texte'] |
|
| 264 | + ) || (isset($page['entetes']['Content-Type']))); |
|
| 265 | + } |
|
| 266 | 266 | } |
| 267 | 267 | |
| 268 | 268 | function inclure_page($fond, $contexte, string $connect = '') { |
| 269 | - $use_cache = null; |
|
| 270 | - $chemin_cache = null; |
|
| 271 | - $lastinclude = null; |
|
| 272 | - $res = null; |
|
| 273 | - static $cacher, $produire_page; |
|
| 274 | - |
|
| 275 | - // enlever le fond de contexte inclus car sinon il prend la main |
|
| 276 | - // dans les sous inclusions -> boucle infinie d'inclusion identique |
|
| 277 | - // (cette precaution n'est probablement plus utile) |
|
| 278 | - unset($contexte['fond']); |
|
| 279 | - $page = ['contexte_implicite' => calculer_contexte_implicite()]; |
|
| 280 | - $page['contexte_implicite']['cache'] = $fond; |
|
| 281 | - if (is_null($cacher)) { |
|
| 282 | - $cacher = charger_fonction('cacher', 'public', true); |
|
| 283 | - } |
|
| 284 | - // Les quatre derniers parametres sont modifies par la fonction: |
|
| 285 | - // emplacement, validite, et, s'il est valide, contenu & age |
|
| 286 | - if ($cacher) { |
|
| 287 | - $res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude); |
|
| 288 | - } else { |
|
| 289 | - $use_cache = -1; |
|
| 290 | - } |
|
| 291 | - // $res = message d'erreur : on sort de la |
|
| 292 | - if ($res) { |
|
| 293 | - return ['texte' => $res]; |
|
| 294 | - } |
|
| 295 | - |
|
| 296 | - // Si use_cache ne vaut pas 0, la page doit etre calculee |
|
| 297 | - // produire la page : peut mettre a jour $lastinclude |
|
| 298 | - // le contexte_cache envoye a cacher() a ete conserve et est passe a produire |
|
| 299 | - if ($use_cache) { |
|
| 300 | - if (is_null($produire_page)) { |
|
| 301 | - $produire_page = charger_fonction('produire_page', 'public'); |
|
| 302 | - } |
|
| 303 | - $page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect); |
|
| 304 | - } |
|
| 305 | - // dans tous les cas, mettre a jour $GLOBALS['lastmodified'] |
|
| 306 | - $GLOBALS['lastmodified'] = max(($GLOBALS['lastmodified'] ?? 0), $lastinclude); |
|
| 307 | - |
|
| 308 | - return $page; |
|
| 269 | + $use_cache = null; |
|
| 270 | + $chemin_cache = null; |
|
| 271 | + $lastinclude = null; |
|
| 272 | + $res = null; |
|
| 273 | + static $cacher, $produire_page; |
|
| 274 | + |
|
| 275 | + // enlever le fond de contexte inclus car sinon il prend la main |
|
| 276 | + // dans les sous inclusions -> boucle infinie d'inclusion identique |
|
| 277 | + // (cette precaution n'est probablement plus utile) |
|
| 278 | + unset($contexte['fond']); |
|
| 279 | + $page = ['contexte_implicite' => calculer_contexte_implicite()]; |
|
| 280 | + $page['contexte_implicite']['cache'] = $fond; |
|
| 281 | + if (is_null($cacher)) { |
|
| 282 | + $cacher = charger_fonction('cacher', 'public', true); |
|
| 283 | + } |
|
| 284 | + // Les quatre derniers parametres sont modifies par la fonction: |
|
| 285 | + // emplacement, validite, et, s'il est valide, contenu & age |
|
| 286 | + if ($cacher) { |
|
| 287 | + $res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude); |
|
| 288 | + } else { |
|
| 289 | + $use_cache = -1; |
|
| 290 | + } |
|
| 291 | + // $res = message d'erreur : on sort de la |
|
| 292 | + if ($res) { |
|
| 293 | + return ['texte' => $res]; |
|
| 294 | + } |
|
| 295 | + |
|
| 296 | + // Si use_cache ne vaut pas 0, la page doit etre calculee |
|
| 297 | + // produire la page : peut mettre a jour $lastinclude |
|
| 298 | + // le contexte_cache envoye a cacher() a ete conserve et est passe a produire |
|
| 299 | + if ($use_cache) { |
|
| 300 | + if (is_null($produire_page)) { |
|
| 301 | + $produire_page = charger_fonction('produire_page', 'public'); |
|
| 302 | + } |
|
| 303 | + $page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect); |
|
| 304 | + } |
|
| 305 | + // dans tous les cas, mettre a jour $GLOBALS['lastmodified'] |
|
| 306 | + $GLOBALS['lastmodified'] = max(($GLOBALS['lastmodified'] ?? 0), $lastinclude); |
|
| 307 | + |
|
| 308 | + return $page; |
|
| 309 | 309 | } |
| 310 | 310 | |
| 311 | 311 | /** |
@@ -323,41 +323,41 @@ discard block |
||
| 323 | 323 | * @return array |
| 324 | 324 | */ |
| 325 | 325 | function public_produire_page_dist( |
| 326 | - $fond, |
|
| 327 | - $contexte, |
|
| 328 | - $use_cache, |
|
| 329 | - $chemin_cache, |
|
| 330 | - $contexte_cache, |
|
| 331 | - &$page, |
|
| 332 | - &$lastinclude, |
|
| 333 | - $connect = '' |
|
| 326 | + $fond, |
|
| 327 | + $contexte, |
|
| 328 | + $use_cache, |
|
| 329 | + $chemin_cache, |
|
| 330 | + $contexte_cache, |
|
| 331 | + &$page, |
|
| 332 | + &$lastinclude, |
|
| 333 | + $connect = '' |
|
| 334 | 334 | ) { |
| 335 | - static $parametrer, $cacher; |
|
| 336 | - if (!$parametrer) { |
|
| 337 | - $parametrer = charger_fonction('parametrer', 'public'); |
|
| 338 | - } |
|
| 339 | - $page = $parametrer($fond, $contexte, $chemin_cache, $connect); |
|
| 340 | - // et on l'enregistre sur le disque |
|
| 341 | - if ( |
|
| 342 | - $chemin_cache |
|
| 343 | - and $use_cache > -1 |
|
| 344 | - and is_array($page) |
|
| 345 | - and count($page) |
|
| 346 | - and isset($page['entetes']['X-Spip-Cache']) |
|
| 347 | - and $page['entetes']['X-Spip-Cache'] > 0 |
|
| 348 | - ) { |
|
| 349 | - if (is_null($cacher)) { |
|
| 350 | - $cacher = charger_fonction('cacher', 'public', true); |
|
| 351 | - } |
|
| 352 | - $lastinclude = time(); |
|
| 353 | - if ($cacher) { |
|
| 354 | - $cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude); |
|
| 355 | - } else { |
|
| 356 | - $use_cache = -1; |
|
| 357 | - } |
|
| 358 | - } |
|
| 359 | - |
|
| 360 | - return $page; |
|
| 335 | + static $parametrer, $cacher; |
|
| 336 | + if (!$parametrer) { |
|
| 337 | + $parametrer = charger_fonction('parametrer', 'public'); |
|
| 338 | + } |
|
| 339 | + $page = $parametrer($fond, $contexte, $chemin_cache, $connect); |
|
| 340 | + // et on l'enregistre sur le disque |
|
| 341 | + if ( |
|
| 342 | + $chemin_cache |
|
| 343 | + and $use_cache > -1 |
|
| 344 | + and is_array($page) |
|
| 345 | + and count($page) |
|
| 346 | + and isset($page['entetes']['X-Spip-Cache']) |
|
| 347 | + and $page['entetes']['X-Spip-Cache'] > 0 |
|
| 348 | + ) { |
|
| 349 | + if (is_null($cacher)) { |
|
| 350 | + $cacher = charger_fonction('cacher', 'public', true); |
|
| 351 | + } |
|
| 352 | + $lastinclude = time(); |
|
| 353 | + if ($cacher) { |
|
| 354 | + $cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude); |
|
| 355 | + } else { |
|
| 356 | + $use_cache = -1; |
|
| 357 | + } |
|
| 358 | + } |
|
| 359 | + |
|
| 360 | + return $page; |
|
| 361 | 361 | } |
| 362 | 362 | |
| 363 | 363 | // Fonction inseree par le compilateur dans le code compile. |
@@ -371,14 +371,14 @@ discard block |
||
| 371 | 371 | // 4: langue |
| 372 | 372 | |
| 373 | 373 | function inserer_balise_dynamique($contexte_exec, $contexte_compil) { |
| 374 | - arguments_balise_dyn_depuis_modele(null, 'reset'); |
|
| 375 | - |
|
| 376 | - if (!is_array($contexte_exec)) { |
|
| 377 | - echo $contexte_exec; |
|
| 378 | - } // message d'erreur etc |
|
| 379 | - else { |
|
| 380 | - inclure_balise_dynamique($contexte_exec, true, $contexte_compil); |
|
| 381 | - } |
|
| 374 | + arguments_balise_dyn_depuis_modele(null, 'reset'); |
|
| 375 | + |
|
| 376 | + if (!is_array($contexte_exec)) { |
|
| 377 | + echo $contexte_exec; |
|
| 378 | + } // message d'erreur etc |
|
| 379 | + else { |
|
| 380 | + inclure_balise_dynamique($contexte_exec, true, $contexte_compil); |
|
| 381 | + } |
|
| 382 | 382 | } |
| 383 | 383 | |
| 384 | 384 | /** |
@@ -391,101 +391,101 @@ discard block |
||
| 391 | 391 | * @return string|void |
| 392 | 392 | */ |
| 393 | 393 | function inclure_balise_dynamique($texte, $echo = true, $contexte_compil = []) { |
| 394 | - if (is_array($texte)) { |
|
| 395 | - [$fond, $delainc, $contexte_inclus] = $texte; |
|
| 396 | - |
|
| 397 | - // delais a l'ancienne, c'est pratiquement mort |
|
| 398 | - $d = $GLOBALS['delais'] ?? null; |
|
| 399 | - $GLOBALS['delais'] = $delainc; |
|
| 400 | - |
|
| 401 | - $page = recuperer_fond( |
|
| 402 | - $fond, |
|
| 403 | - $contexte_inclus, |
|
| 404 | - ['trim' => false, 'raw' => true, 'compil' => $contexte_compil] |
|
| 405 | - ); |
|
| 406 | - |
|
| 407 | - $texte = $page['texte']; |
|
| 408 | - |
|
| 409 | - $GLOBALS['delais'] = $d; |
|
| 410 | - // Faire remonter les entetes |
|
| 411 | - if ( |
|
| 412 | - isset($page['entetes']) |
|
| 413 | - and is_array($page['entetes']) |
|
| 414 | - ) { |
|
| 415 | - // mais pas toutes |
|
| 416 | - unset($page['entetes']['X-Spip-Cache']); |
|
| 417 | - unset($page['entetes']['Content-Type']); |
|
| 418 | - if (isset($GLOBALS['page']) and is_array($GLOBALS['page'])) { |
|
| 419 | - if (!is_array($GLOBALS['page']['entetes'])) { |
|
| 420 | - $GLOBALS['page']['entetes'] = []; |
|
| 421 | - } |
|
| 422 | - $GLOBALS['page']['entetes'] = |
|
| 423 | - array_merge($GLOBALS['page']['entetes'], $page['entetes']); |
|
| 424 | - } |
|
| 425 | - } |
|
| 426 | - // _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines |
|
| 427 | - if ( |
|
| 428 | - isset($page['contexte']['_pipelines']) |
|
| 429 | - and is_array($page['contexte']['_pipelines']) |
|
| 430 | - and count($page['contexte']['_pipelines']) |
|
| 431 | - ) { |
|
| 432 | - foreach ($page['contexte']['_pipelines'] as $pipe => $args) { |
|
| 433 | - $args['contexte'] = $page['contexte']; |
|
| 434 | - unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul |
|
| 435 | - $texte = pipeline( |
|
| 436 | - $pipe, |
|
| 437 | - [ |
|
| 438 | - 'data' => $texte, |
|
| 439 | - 'args' => $args |
|
| 440 | - ] |
|
| 441 | - ); |
|
| 442 | - } |
|
| 443 | - } |
|
| 444 | - } |
|
| 445 | - |
|
| 446 | - if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
|
| 447 | - // compatibilite : avant on donnait le numero de ligne ou rien. |
|
| 448 | - $ligne = intval($contexte_compil[3] ?? $contexte_compil); |
|
| 449 | - $GLOBALS['debug_objets']['resultat'][$ligne] = $texte; |
|
| 450 | - } |
|
| 451 | - if ($echo) { |
|
| 452 | - echo $texte; |
|
| 453 | - } else { |
|
| 454 | - return $texte; |
|
| 455 | - } |
|
| 394 | + if (is_array($texte)) { |
|
| 395 | + [$fond, $delainc, $contexte_inclus] = $texte; |
|
| 396 | + |
|
| 397 | + // delais a l'ancienne, c'est pratiquement mort |
|
| 398 | + $d = $GLOBALS['delais'] ?? null; |
|
| 399 | + $GLOBALS['delais'] = $delainc; |
|
| 400 | + |
|
| 401 | + $page = recuperer_fond( |
|
| 402 | + $fond, |
|
| 403 | + $contexte_inclus, |
|
| 404 | + ['trim' => false, 'raw' => true, 'compil' => $contexte_compil] |
|
| 405 | + ); |
|
| 406 | + |
|
| 407 | + $texte = $page['texte']; |
|
| 408 | + |
|
| 409 | + $GLOBALS['delais'] = $d; |
|
| 410 | + // Faire remonter les entetes |
|
| 411 | + if ( |
|
| 412 | + isset($page['entetes']) |
|
| 413 | + and is_array($page['entetes']) |
|
| 414 | + ) { |
|
| 415 | + // mais pas toutes |
|
| 416 | + unset($page['entetes']['X-Spip-Cache']); |
|
| 417 | + unset($page['entetes']['Content-Type']); |
|
| 418 | + if (isset($GLOBALS['page']) and is_array($GLOBALS['page'])) { |
|
| 419 | + if (!is_array($GLOBALS['page']['entetes'])) { |
|
| 420 | + $GLOBALS['page']['entetes'] = []; |
|
| 421 | + } |
|
| 422 | + $GLOBALS['page']['entetes'] = |
|
| 423 | + array_merge($GLOBALS['page']['entetes'], $page['entetes']); |
|
| 424 | + } |
|
| 425 | + } |
|
| 426 | + // _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines |
|
| 427 | + if ( |
|
| 428 | + isset($page['contexte']['_pipelines']) |
|
| 429 | + and is_array($page['contexte']['_pipelines']) |
|
| 430 | + and count($page['contexte']['_pipelines']) |
|
| 431 | + ) { |
|
| 432 | + foreach ($page['contexte']['_pipelines'] as $pipe => $args) { |
|
| 433 | + $args['contexte'] = $page['contexte']; |
|
| 434 | + unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul |
|
| 435 | + $texte = pipeline( |
|
| 436 | + $pipe, |
|
| 437 | + [ |
|
| 438 | + 'data' => $texte, |
|
| 439 | + 'args' => $args |
|
| 440 | + ] |
|
| 441 | + ); |
|
| 442 | + } |
|
| 443 | + } |
|
| 444 | + } |
|
| 445 | + |
|
| 446 | + if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
|
| 447 | + // compatibilite : avant on donnait le numero de ligne ou rien. |
|
| 448 | + $ligne = intval($contexte_compil[3] ?? $contexte_compil); |
|
| 449 | + $GLOBALS['debug_objets']['resultat'][$ligne] = $texte; |
|
| 450 | + } |
|
| 451 | + if ($echo) { |
|
| 452 | + echo $texte; |
|
| 453 | + } else { |
|
| 454 | + return $texte; |
|
| 455 | + } |
|
| 456 | 456 | } |
| 457 | 457 | |
| 458 | 458 | function message_page_indisponible($page, $contexte) { |
| 459 | - static $deja = false; |
|
| 460 | - if ($deja) { |
|
| 461 | - return 'erreur'; |
|
| 462 | - } |
|
| 463 | - $codes = [ |
|
| 464 | - '404' => '404 Not Found', |
|
| 465 | - '503' => '503 Service Unavailable', |
|
| 466 | - ]; |
|
| 467 | - |
|
| 468 | - $contexte['status'] = ($page !== false) ? '404' : '503'; |
|
| 469 | - $contexte['code'] = $codes[$contexte['status']]; |
|
| 470 | - $contexte['fond'] = '404'; // gere les 2 erreurs |
|
| 471 | - if (!isset($contexte['lang'])) { |
|
| 472 | - include_spip('inc/lang'); |
|
| 473 | - $contexte['lang'] = $GLOBALS['spip_lang']; |
|
| 474 | - } |
|
| 475 | - |
|
| 476 | - $deja = true; |
|
| 477 | - // passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent |
|
| 478 | - // ex restriction d'acces => 401 |
|
| 479 | - $contexte = pipeline('page_indisponible', $contexte); |
|
| 480 | - |
|
| 481 | - // produire la page d'erreur |
|
| 482 | - $page = inclure_page($contexte['fond'], $contexte); |
|
| 483 | - if (!$page) { |
|
| 484 | - $page = inclure_page('404', $contexte); |
|
| 485 | - } |
|
| 486 | - $page['status'] = $contexte['status']; |
|
| 487 | - |
|
| 488 | - return $page; |
|
| 459 | + static $deja = false; |
|
| 460 | + if ($deja) { |
|
| 461 | + return 'erreur'; |
|
| 462 | + } |
|
| 463 | + $codes = [ |
|
| 464 | + '404' => '404 Not Found', |
|
| 465 | + '503' => '503 Service Unavailable', |
|
| 466 | + ]; |
|
| 467 | + |
|
| 468 | + $contexte['status'] = ($page !== false) ? '404' : '503'; |
|
| 469 | + $contexte['code'] = $codes[$contexte['status']]; |
|
| 470 | + $contexte['fond'] = '404'; // gere les 2 erreurs |
|
| 471 | + if (!isset($contexte['lang'])) { |
|
| 472 | + include_spip('inc/lang'); |
|
| 473 | + $contexte['lang'] = $GLOBALS['spip_lang']; |
|
| 474 | + } |
|
| 475 | + |
|
| 476 | + $deja = true; |
|
| 477 | + // passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent |
|
| 478 | + // ex restriction d'acces => 401 |
|
| 479 | + $contexte = pipeline('page_indisponible', $contexte); |
|
| 480 | + |
|
| 481 | + // produire la page d'erreur |
|
| 482 | + $page = inclure_page($contexte['fond'], $contexte); |
|
| 483 | + if (!$page) { |
|
| 484 | + $page = inclure_page('404', $contexte); |
|
| 485 | + } |
|
| 486 | + $page['status'] = $contexte['status']; |
|
| 487 | + |
|
| 488 | + return $page; |
|
| 489 | 489 | } |
| 490 | 490 | |
| 491 | 491 | /** |
@@ -497,44 +497,44 @@ discard block |
||
| 497 | 497 | * @return mixed |
| 498 | 498 | */ |
| 499 | 499 | function arguments_balise_dyn_depuis_modele($arg, $operation = 'set') { |
| 500 | - static $balise_dyn_appellee_par_modele = null; |
|
| 501 | - switch ($operation) { |
|
| 502 | - case 'read': |
|
| 503 | - return $balise_dyn_appellee_par_modele; |
|
| 504 | - case 'reset': |
|
| 505 | - $balise_dyn_appellee_par_modele = null; |
|
| 506 | - return null; |
|
| 507 | - case 'set': |
|
| 508 | - default: |
|
| 509 | - $balise_dyn_appellee_par_modele = $arg; |
|
| 510 | - return $arg; |
|
| 511 | - } |
|
| 500 | + static $balise_dyn_appellee_par_modele = null; |
|
| 501 | + switch ($operation) { |
|
| 502 | + case 'read': |
|
| 503 | + return $balise_dyn_appellee_par_modele; |
|
| 504 | + case 'reset': |
|
| 505 | + $balise_dyn_appellee_par_modele = null; |
|
| 506 | + return null; |
|
| 507 | + case 'set': |
|
| 508 | + default: |
|
| 509 | + $balise_dyn_appellee_par_modele = $arg; |
|
| 510 | + return $arg; |
|
| 511 | + } |
|
| 512 | 512 | } |
| 513 | 513 | |
| 514 | 514 | // temporairement ici : a mettre dans le futur inc/modeles |
| 515 | 515 | // creer_contexte_de_modele('left', 'autostart=true', ...) renvoie un array() |
| 516 | 516 | function creer_contexte_de_modele($args) { |
| 517 | - $contexte = []; |
|
| 518 | - foreach ($args as $var => $val) { |
|
| 519 | - if (is_int($var)) { // argument pas formate |
|
| 520 | - if (in_array($val, ['left', 'right', 'center'])) { |
|
| 521 | - $var = 'align'; |
|
| 522 | - $contexte[$var] = $val; |
|
| 523 | - } else { |
|
| 524 | - $args = explode('=', $val); |
|
| 525 | - if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args |
|
| 526 | - $contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1); |
|
| 527 | - } else // notation abregee |
|
| 528 | - { |
|
| 529 | - $contexte[trim($val)] = trim($val); |
|
| 530 | - } |
|
| 531 | - } |
|
| 532 | - } else { |
|
| 533 | - $contexte[$var] = $val; |
|
| 534 | - } |
|
| 535 | - } |
|
| 536 | - |
|
| 537 | - return $contexte; |
|
| 517 | + $contexte = []; |
|
| 518 | + foreach ($args as $var => $val) { |
|
| 519 | + if (is_int($var)) { // argument pas formate |
|
| 520 | + if (in_array($val, ['left', 'right', 'center'])) { |
|
| 521 | + $var = 'align'; |
|
| 522 | + $contexte[$var] = $val; |
|
| 523 | + } else { |
|
| 524 | + $args = explode('=', $val); |
|
| 525 | + if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args |
|
| 526 | + $contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1); |
|
| 527 | + } else // notation abregee |
|
| 528 | + { |
|
| 529 | + $contexte[trim($val)] = trim($val); |
|
| 530 | + } |
|
| 531 | + } |
|
| 532 | + } else { |
|
| 533 | + $contexte[$var] = $val; |
|
| 534 | + } |
|
| 535 | + } |
|
| 536 | + |
|
| 537 | + return $contexte; |
|
| 538 | 538 | } |
| 539 | 539 | |
| 540 | 540 | /** |
@@ -549,43 +549,43 @@ discard block |
||
| 549 | 549 | * @return string |
| 550 | 550 | */ |
| 551 | 551 | function styliser_modele($modele, $id, $contexte = null) { |
| 552 | - static $styliseurs = null; |
|
| 553 | - if (is_null($styliseurs)) { |
|
| 554 | - $tables_objet = lister_tables_objets_sql(); |
|
| 555 | - foreach ($tables_objet as $table => $desc) { |
|
| 556 | - if ( |
|
| 557 | - isset($desc['modeles']) and $desc['modeles'] |
|
| 558 | - and isset($desc['modeles_styliser']) and $desc['modeles_styliser'] |
|
| 559 | - and function_exists($desc['modeles_styliser']) |
|
| 560 | - ) { |
|
| 561 | - $primary = id_table_objet($table); |
|
| 562 | - foreach ($desc['modeles'] as $m) { |
|
| 563 | - $styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']]; |
|
| 564 | - } |
|
| 565 | - } |
|
| 566 | - } |
|
| 567 | - } |
|
| 568 | - |
|
| 569 | - if (isset($styliseurs[$modele])) { |
|
| 570 | - $styliseur = $styliseurs[$modele]['callback']; |
|
| 571 | - $primary = $styliseurs[$modele]['primary']; |
|
| 572 | - if (is_null($id) and $contexte) { |
|
| 573 | - if (isset($contexte['id'])) { |
|
| 574 | - $id = $contexte['id']; |
|
| 575 | - } elseif (isset($contexte[$primary])) { |
|
| 576 | - $id = $contexte[$primary]; |
|
| 577 | - } |
|
| 578 | - } |
|
| 579 | - if (is_null($id)) { |
|
| 580 | - $msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]); |
|
| 581 | - erreur_squelette($msg); |
|
| 582 | - // on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant |
|
| 583 | - $id = 0; |
|
| 584 | - } |
|
| 585 | - $modele = $styliseur($modele, $id); |
|
| 586 | - } |
|
| 587 | - |
|
| 588 | - return $modele; |
|
| 552 | + static $styliseurs = null; |
|
| 553 | + if (is_null($styliseurs)) { |
|
| 554 | + $tables_objet = lister_tables_objets_sql(); |
|
| 555 | + foreach ($tables_objet as $table => $desc) { |
|
| 556 | + if ( |
|
| 557 | + isset($desc['modeles']) and $desc['modeles'] |
|
| 558 | + and isset($desc['modeles_styliser']) and $desc['modeles_styliser'] |
|
| 559 | + and function_exists($desc['modeles_styliser']) |
|
| 560 | + ) { |
|
| 561 | + $primary = id_table_objet($table); |
|
| 562 | + foreach ($desc['modeles'] as $m) { |
|
| 563 | + $styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']]; |
|
| 564 | + } |
|
| 565 | + } |
|
| 566 | + } |
|
| 567 | + } |
|
| 568 | + |
|
| 569 | + if (isset($styliseurs[$modele])) { |
|
| 570 | + $styliseur = $styliseurs[$modele]['callback']; |
|
| 571 | + $primary = $styliseurs[$modele]['primary']; |
|
| 572 | + if (is_null($id) and $contexte) { |
|
| 573 | + if (isset($contexte['id'])) { |
|
| 574 | + $id = $contexte['id']; |
|
| 575 | + } elseif (isset($contexte[$primary])) { |
|
| 576 | + $id = $contexte[$primary]; |
|
| 577 | + } |
|
| 578 | + } |
|
| 579 | + if (is_null($id)) { |
|
| 580 | + $msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]); |
|
| 581 | + erreur_squelette($msg); |
|
| 582 | + // on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant |
|
| 583 | + $id = 0; |
|
| 584 | + } |
|
| 585 | + $modele = $styliseur($modele, $id); |
|
| 586 | + } |
|
| 587 | + |
|
| 588 | + return $modele; |
|
| 589 | 589 | } |
| 590 | 590 | |
| 591 | 591 | /** |
@@ -602,102 +602,102 @@ discard block |
||
| 602 | 602 | */ |
| 603 | 603 | function inclure_modele($type, $id, $params, $lien, string $connect = '', $env = []) { |
| 604 | 604 | |
| 605 | - static $compteur; |
|
| 606 | - if (++$compteur > 10) { |
|
| 607 | - return ''; |
|
| 608 | - } # ne pas boucler indefiniment |
|
| 609 | - |
|
| 610 | - $type = strtolower($type); |
|
| 611 | - $type = styliser_modele($type, $id); |
|
| 612 | - |
|
| 613 | - $fond = $class = ''; |
|
| 614 | - |
|
| 615 | - $params = array_filter(explode('|', $params)); |
|
| 616 | - if ($params) { |
|
| 617 | - $soustype = current($params); |
|
| 618 | - $soustype = strtolower(trim($soustype)); |
|
| 619 | - if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) { |
|
| 620 | - $soustype = next($params); |
|
| 621 | - $soustype = strtolower($soustype); |
|
| 622 | - } |
|
| 623 | - |
|
| 624 | - if (preg_match(',^[a-z0-9_]+$,', $soustype)) { |
|
| 625 | - if (!trouve_modele($fond = ($type . '_' . $soustype))) { |
|
| 626 | - $fond = ''; |
|
| 627 | - $class = $soustype; |
|
| 628 | - } |
|
| 629 | - // enlever le sous type des params |
|
| 630 | - $params = array_diff($params, [$soustype]); |
|
| 631 | - } |
|
| 632 | - } |
|
| 633 | - |
|
| 634 | - // Si ca marche pas en precisant le sous-type, prendre le type |
|
| 635 | - if (!$fond and !trouve_modele($fond = $type)) { |
|
| 636 | - spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE); |
|
| 637 | - |
|
| 638 | - return false; |
|
| 639 | - } |
|
| 640 | - $fond = 'modeles/' . $fond; |
|
| 641 | - // Creer le contexte |
|
| 642 | - $contexte = $env; |
|
| 643 | - $contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte |
|
| 644 | - |
|
| 645 | - // Le numero du modele est mis dans l'environnement |
|
| 646 | - // d'une part sous l'identifiant "id" |
|
| 647 | - // et d'autre part sous l'identifiant de la cle primaire |
|
| 648 | - // par la fonction id_table_objet, |
|
| 649 | - // (<article1> =>> article =>> id_article =>> id_article=1) |
|
| 650 | - $_id = id_table_objet($type); |
|
| 651 | - $contexte['id'] = $contexte[$_id] = $id; |
|
| 652 | - |
|
| 653 | - if (isset($class)) { |
|
| 654 | - $contexte['class'] = $class; |
|
| 655 | - } |
|
| 656 | - |
|
| 657 | - // Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url] |
|
| 658 | - if ($lien) { |
|
| 659 | - # un eventuel guillemet (") sera reechappe par #ENV |
|
| 660 | - $contexte['lien'] = str_replace('"', '"', $lien['href']); |
|
| 661 | - $contexte['lien_class'] = $lien['class']; |
|
| 662 | - $contexte['lien_mime'] = $lien['mime']; |
|
| 663 | - $contexte['lien_title'] = $lien['title']; |
|
| 664 | - $contexte['lien_hreflang'] = $lien['hreflang']; |
|
| 665 | - } |
|
| 666 | - |
|
| 667 | - // Traiter les parametres |
|
| 668 | - // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en> |
|
| 669 | - $arg_list = creer_contexte_de_modele($params); |
|
| 670 | - $contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args |
|
| 671 | - $contexte = array_merge($contexte, $arg_list); |
|
| 672 | - |
|
| 673 | - // Appliquer le modele avec le contexte |
|
| 674 | - $retour = recuperer_fond($fond, $contexte, [], $connect); |
|
| 675 | - |
|
| 676 | - // Regarder si le modele tient compte des liens (il *doit* alors indiquer |
|
| 677 | - // spip_lien_ok dans les classes de son conteneur de premier niveau ; |
|
| 678 | - // sinon, s'il y a un lien, on l'ajoute classiquement |
|
| 679 | - if ( |
|
| 680 | - strstr( |
|
| 681 | - ' ' . ($classes = extraire_attribut($retour, 'class')) . ' ', |
|
| 682 | - 'spip_lien_ok' |
|
| 683 | - ) |
|
| 684 | - ) { |
|
| 685 | - $retour = inserer_attribut( |
|
| 686 | - $retour, |
|
| 687 | - 'class', |
|
| 688 | - trim(str_replace(' spip_lien_ok ', ' ', " $classes ")) |
|
| 689 | - ); |
|
| 690 | - } else { |
|
| 691 | - if ($lien) { |
|
| 692 | - $retour = '<a href="' . $lien['href'] . '" class="' . $lien['class'] . '">' . $retour . '</a>'; |
|
| 693 | - } |
|
| 694 | - } |
|
| 695 | - |
|
| 696 | - $compteur--; |
|
| 697 | - |
|
| 698 | - return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax') |
|
| 699 | - ? encoder_contexte_ajax($contexte, '', $retour) |
|
| 700 | - : $retour; |
|
| 605 | + static $compteur; |
|
| 606 | + if (++$compteur > 10) { |
|
| 607 | + return ''; |
|
| 608 | + } # ne pas boucler indefiniment |
|
| 609 | + |
|
| 610 | + $type = strtolower($type); |
|
| 611 | + $type = styliser_modele($type, $id); |
|
| 612 | + |
|
| 613 | + $fond = $class = ''; |
|
| 614 | + |
|
| 615 | + $params = array_filter(explode('|', $params)); |
|
| 616 | + if ($params) { |
|
| 617 | + $soustype = current($params); |
|
| 618 | + $soustype = strtolower(trim($soustype)); |
|
| 619 | + if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) { |
|
| 620 | + $soustype = next($params); |
|
| 621 | + $soustype = strtolower($soustype); |
|
| 622 | + } |
|
| 623 | + |
|
| 624 | + if (preg_match(',^[a-z0-9_]+$,', $soustype)) { |
|
| 625 | + if (!trouve_modele($fond = ($type . '_' . $soustype))) { |
|
| 626 | + $fond = ''; |
|
| 627 | + $class = $soustype; |
|
| 628 | + } |
|
| 629 | + // enlever le sous type des params |
|
| 630 | + $params = array_diff($params, [$soustype]); |
|
| 631 | + } |
|
| 632 | + } |
|
| 633 | + |
|
| 634 | + // Si ca marche pas en precisant le sous-type, prendre le type |
|
| 635 | + if (!$fond and !trouve_modele($fond = $type)) { |
|
| 636 | + spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE); |
|
| 637 | + |
|
| 638 | + return false; |
|
| 639 | + } |
|
| 640 | + $fond = 'modeles/' . $fond; |
|
| 641 | + // Creer le contexte |
|
| 642 | + $contexte = $env; |
|
| 643 | + $contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte |
|
| 644 | + |
|
| 645 | + // Le numero du modele est mis dans l'environnement |
|
| 646 | + // d'une part sous l'identifiant "id" |
|
| 647 | + // et d'autre part sous l'identifiant de la cle primaire |
|
| 648 | + // par la fonction id_table_objet, |
|
| 649 | + // (<article1> =>> article =>> id_article =>> id_article=1) |
|
| 650 | + $_id = id_table_objet($type); |
|
| 651 | + $contexte['id'] = $contexte[$_id] = $id; |
|
| 652 | + |
|
| 653 | + if (isset($class)) { |
|
| 654 | + $contexte['class'] = $class; |
|
| 655 | + } |
|
| 656 | + |
|
| 657 | + // Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url] |
|
| 658 | + if ($lien) { |
|
| 659 | + # un eventuel guillemet (") sera reechappe par #ENV |
|
| 660 | + $contexte['lien'] = str_replace('"', '"', $lien['href']); |
|
| 661 | + $contexte['lien_class'] = $lien['class']; |
|
| 662 | + $contexte['lien_mime'] = $lien['mime']; |
|
| 663 | + $contexte['lien_title'] = $lien['title']; |
|
| 664 | + $contexte['lien_hreflang'] = $lien['hreflang']; |
|
| 665 | + } |
|
| 666 | + |
|
| 667 | + // Traiter les parametres |
|
| 668 | + // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en> |
|
| 669 | + $arg_list = creer_contexte_de_modele($params); |
|
| 670 | + $contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args |
|
| 671 | + $contexte = array_merge($contexte, $arg_list); |
|
| 672 | + |
|
| 673 | + // Appliquer le modele avec le contexte |
|
| 674 | + $retour = recuperer_fond($fond, $contexte, [], $connect); |
|
| 675 | + |
|
| 676 | + // Regarder si le modele tient compte des liens (il *doit* alors indiquer |
|
| 677 | + // spip_lien_ok dans les classes de son conteneur de premier niveau ; |
|
| 678 | + // sinon, s'il y a un lien, on l'ajoute classiquement |
|
| 679 | + if ( |
|
| 680 | + strstr( |
|
| 681 | + ' ' . ($classes = extraire_attribut($retour, 'class')) . ' ', |
|
| 682 | + 'spip_lien_ok' |
|
| 683 | + ) |
|
| 684 | + ) { |
|
| 685 | + $retour = inserer_attribut( |
|
| 686 | + $retour, |
|
| 687 | + 'class', |
|
| 688 | + trim(str_replace(' spip_lien_ok ', ' ', " $classes ")) |
|
| 689 | + ); |
|
| 690 | + } else { |
|
| 691 | + if ($lien) { |
|
| 692 | + $retour = '<a href="' . $lien['href'] . '" class="' . $lien['class'] . '">' . $retour . '</a>'; |
|
| 693 | + } |
|
| 694 | + } |
|
| 695 | + |
|
| 696 | + $compteur--; |
|
| 697 | + |
|
| 698 | + return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax') |
|
| 699 | + ? encoder_contexte_ajax($contexte, '', $retour) |
|
| 700 | + : $retour; |
|
| 701 | 701 | } |
| 702 | 702 | |
| 703 | 703 | // Un inclure_page qui marche aussi pour l'espace prive |
@@ -706,105 +706,105 @@ discard block |
||
| 706 | 706 | // recuperer_fond($fond,$contexte,array('raw'=>true)) |
| 707 | 707 | function evaluer_fond($fond, $contexte = [], string $connect = '') { |
| 708 | 708 | |
| 709 | - $page = inclure_page($fond, $contexte, $connect); |
|
| 710 | - |
|
| 711 | - if (!$page) { |
|
| 712 | - return $page; |
|
| 713 | - } |
|
| 714 | - // eval $page et affecte $res |
|
| 715 | - include _ROOT_RESTREINT . 'public/evaluer_page.php'; |
|
| 716 | - |
|
| 717 | - // Lever un drapeau (global) si le fond utilise #SESSION |
|
| 718 | - // a destination de public/parametrer |
|
| 719 | - // pour remonter vers les inclusions appelantes |
|
| 720 | - // il faut bien lever ce drapeau apres avoir evalue le fond |
|
| 721 | - // pour ne pas faire descendre le flag vers les inclusions appelees |
|
| 722 | - if ( |
|
| 723 | - isset($page['invalideurs']) |
|
| 724 | - and isset($page['invalideurs']['session']) |
|
| 725 | - ) { |
|
| 726 | - $GLOBALS['cache_utilise_session'] = $page['invalideurs']['session']; |
|
| 727 | - } |
|
| 728 | - |
|
| 729 | - return $page; |
|
| 709 | + $page = inclure_page($fond, $contexte, $connect); |
|
| 710 | + |
|
| 711 | + if (!$page) { |
|
| 712 | + return $page; |
|
| 713 | + } |
|
| 714 | + // eval $page et affecte $res |
|
| 715 | + include _ROOT_RESTREINT . 'public/evaluer_page.php'; |
|
| 716 | + |
|
| 717 | + // Lever un drapeau (global) si le fond utilise #SESSION |
|
| 718 | + // a destination de public/parametrer |
|
| 719 | + // pour remonter vers les inclusions appelantes |
|
| 720 | + // il faut bien lever ce drapeau apres avoir evalue le fond |
|
| 721 | + // pour ne pas faire descendre le flag vers les inclusions appelees |
|
| 722 | + if ( |
|
| 723 | + isset($page['invalideurs']) |
|
| 724 | + and isset($page['invalideurs']['session']) |
|
| 725 | + ) { |
|
| 726 | + $GLOBALS['cache_utilise_session'] = $page['invalideurs']['session']; |
|
| 727 | + } |
|
| 728 | + |
|
| 729 | + return $page; |
|
| 730 | 730 | } |
| 731 | 731 | |
| 732 | 732 | |
| 733 | 733 | function page_base_href(&$texte) { |
| 734 | - static $set_html_base = null; |
|
| 735 | - if (is_null($set_html_base)) { |
|
| 736 | - if (!defined('_SET_HTML_BASE')) { |
|
| 737 | - // si la profondeur est superieure a 1 |
|
| 738 | - // est que ce n'est pas une url page ni une url action |
|
| 739 | - // activer par defaut |
|
| 740 | - $set_html_base = (( |
|
| 741 | - $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2) |
|
| 742 | - and _request(_SPIP_PAGE) !== 'login' |
|
| 743 | - and !_request('action')) ? true : false); |
|
| 744 | - } else { |
|
| 745 | - $set_html_base = _SET_HTML_BASE; |
|
| 746 | - } |
|
| 747 | - } |
|
| 748 | - |
|
| 749 | - if ( |
|
| 750 | - $set_html_base |
|
| 751 | - and isset($GLOBALS['html']) and $GLOBALS['html'] |
|
| 752 | - and $GLOBALS['profondeur_url'] > 0 |
|
| 753 | - and ($poshead = strpos($texte, '</head>')) !== false |
|
| 754 | - ) { |
|
| 755 | - $head = substr($texte, 0, $poshead); |
|
| 756 | - $insert = false; |
|
| 757 | - $href_base = false; |
|
| 758 | - if (strpos($head, '<base') === false) { |
|
| 759 | - $insert = true; |
|
| 760 | - } else { |
|
| 761 | - // si aucun <base ...> n'a de href il faut en inserer un |
|
| 762 | - // sinon juste re-ecrire les ancres si besoin |
|
| 763 | - $insert = true; |
|
| 764 | - include_spip('inc/filtres'); |
|
| 765 | - $bases = extraire_balises($head, 'base'); |
|
| 766 | - foreach ($bases as $base) { |
|
| 767 | - if ($href_base = extraire_attribut($base, 'href')) { |
|
| 768 | - $insert = false; |
|
| 769 | - break; |
|
| 770 | - } |
|
| 771 | - } |
|
| 772 | - } |
|
| 773 | - |
|
| 774 | - if ($insert) { |
|
| 775 | - include_spip('inc/filtres_mini'); |
|
| 776 | - // ajouter un base qui reglera tous les liens relatifs |
|
| 777 | - $href_base = url_absolue('./'); |
|
| 778 | - $base = "\n<base href=\"$href_base\" />"; |
|
| 779 | - if (($pos = strpos($head, '<head>')) !== false) { |
|
| 780 | - $head = substr_replace($head, $base, $pos + 6, 0); |
|
| 781 | - } elseif (preg_match(',<head[^>]*>,i', $head, $r)) { |
|
| 782 | - $head = str_replace($r[0], $r[0] . $base, $head); |
|
| 783 | - } |
|
| 784 | - $texte = $head . substr($texte, $poshead); |
|
| 785 | - } |
|
| 786 | - if ($href_base) { |
|
| 787 | - // gerer les ancres |
|
| 788 | - $base = $_SERVER['REQUEST_URI']; |
|
| 789 | - // pas de guillemets ni < dans l'URL qu'on insere dans le HTML |
|
| 790 | - if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) { |
|
| 791 | - $base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base); |
|
| 792 | - } |
|
| 793 | - if (strpos($texte, "href='#") !== false) { |
|
| 794 | - $texte = str_replace("href='#", "href='$base#", $texte); |
|
| 795 | - } |
|
| 796 | - if (strpos($texte, 'href="#') !== false) { |
|
| 797 | - $texte = str_replace('href="#', "href=\"$base#", $texte); |
|
| 798 | - } |
|
| 799 | - } |
|
| 800 | - } |
|
| 734 | + static $set_html_base = null; |
|
| 735 | + if (is_null($set_html_base)) { |
|
| 736 | + if (!defined('_SET_HTML_BASE')) { |
|
| 737 | + // si la profondeur est superieure a 1 |
|
| 738 | + // est que ce n'est pas une url page ni une url action |
|
| 739 | + // activer par defaut |
|
| 740 | + $set_html_base = (( |
|
| 741 | + $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2) |
|
| 742 | + and _request(_SPIP_PAGE) !== 'login' |
|
| 743 | + and !_request('action')) ? true : false); |
|
| 744 | + } else { |
|
| 745 | + $set_html_base = _SET_HTML_BASE; |
|
| 746 | + } |
|
| 747 | + } |
|
| 748 | + |
|
| 749 | + if ( |
|
| 750 | + $set_html_base |
|
| 751 | + and isset($GLOBALS['html']) and $GLOBALS['html'] |
|
| 752 | + and $GLOBALS['profondeur_url'] > 0 |
|
| 753 | + and ($poshead = strpos($texte, '</head>')) !== false |
|
| 754 | + ) { |
|
| 755 | + $head = substr($texte, 0, $poshead); |
|
| 756 | + $insert = false; |
|
| 757 | + $href_base = false; |
|
| 758 | + if (strpos($head, '<base') === false) { |
|
| 759 | + $insert = true; |
|
| 760 | + } else { |
|
| 761 | + // si aucun <base ...> n'a de href il faut en inserer un |
|
| 762 | + // sinon juste re-ecrire les ancres si besoin |
|
| 763 | + $insert = true; |
|
| 764 | + include_spip('inc/filtres'); |
|
| 765 | + $bases = extraire_balises($head, 'base'); |
|
| 766 | + foreach ($bases as $base) { |
|
| 767 | + if ($href_base = extraire_attribut($base, 'href')) { |
|
| 768 | + $insert = false; |
|
| 769 | + break; |
|
| 770 | + } |
|
| 771 | + } |
|
| 772 | + } |
|
| 773 | + |
|
| 774 | + if ($insert) { |
|
| 775 | + include_spip('inc/filtres_mini'); |
|
| 776 | + // ajouter un base qui reglera tous les liens relatifs |
|
| 777 | + $href_base = url_absolue('./'); |
|
| 778 | + $base = "\n<base href=\"$href_base\" />"; |
|
| 779 | + if (($pos = strpos($head, '<head>')) !== false) { |
|
| 780 | + $head = substr_replace($head, $base, $pos + 6, 0); |
|
| 781 | + } elseif (preg_match(',<head[^>]*>,i', $head, $r)) { |
|
| 782 | + $head = str_replace($r[0], $r[0] . $base, $head); |
|
| 783 | + } |
|
| 784 | + $texte = $head . substr($texte, $poshead); |
|
| 785 | + } |
|
| 786 | + if ($href_base) { |
|
| 787 | + // gerer les ancres |
|
| 788 | + $base = $_SERVER['REQUEST_URI']; |
|
| 789 | + // pas de guillemets ni < dans l'URL qu'on insere dans le HTML |
|
| 790 | + if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) { |
|
| 791 | + $base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base); |
|
| 792 | + } |
|
| 793 | + if (strpos($texte, "href='#") !== false) { |
|
| 794 | + $texte = str_replace("href='#", "href='$base#", $texte); |
|
| 795 | + } |
|
| 796 | + if (strpos($texte, 'href="#') !== false) { |
|
| 797 | + $texte = str_replace('href="#', "href=\"$base#", $texte); |
|
| 798 | + } |
|
| 799 | + } |
|
| 800 | + } |
|
| 801 | 801 | } |
| 802 | 802 | |
| 803 | 803 | |
| 804 | 804 | // Envoyer les entetes, en retenant ceux qui sont a usage interne |
| 805 | 805 | // et demarrent par X-Spip-... |
| 806 | 806 | function envoyer_entetes($entetes) { |
| 807 | - foreach ($entetes as $k => $v) { # if (strncmp($k, 'X-Spip-', 7)) |
|
| 808 | - @header(strlen($v) ? "$k: $v" : $k); |
|
| 809 | - } |
|
| 807 | + foreach ($entetes as $k => $v) { # if (strncmp($k, 'X-Spip-', 7)) |
|
| 808 | + @header(strlen($v) ? "$k: $v" : $k); |
|
| 809 | + } |
|
| 810 | 810 | } |
@@ -38,7 +38,7 @@ discard block |
||
| 38 | 38 | |
| 39 | 39 | $GLOBALS['contexte'] = calculer_contexte(); |
| 40 | 40 | $page = ['contexte_implicite' => calculer_contexte_implicite()]; |
| 41 | - $page['contexte_implicite']['cache'] = $fond . preg_replace( |
|
| 41 | + $page['contexte_implicite']['cache'] = $fond.preg_replace( |
|
| 42 | 42 | ',\.[a-zA-Z0-9]*$,', |
| 43 | 43 | '', |
| 44 | 44 | preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI']) |
@@ -139,7 +139,7 @@ discard block |
||
| 139 | 139 | if ($page === '') { |
| 140 | 140 | $erreur = _T( |
| 141 | 141 | 'info_erreur_squelette2', |
| 142 | - ['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES] |
|
| 142 | + ['fichier' => spip_htmlspecialchars($fond).'.'._EXTENSION_SQUELETTES] |
|
| 143 | 143 | ); |
| 144 | 144 | erreur_squelette($erreur); |
| 145 | 145 | // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4 |
@@ -182,7 +182,7 @@ discard block |
||
| 182 | 182 | and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) |
| 183 | 183 | and !isset($page['entetes']['Last-Modified']) |
| 184 | 184 | ) { |
| 185 | - $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT'; |
|
| 185 | + $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified).' GMT'; |
|
| 186 | 186 | } |
| 187 | 187 | |
| 188 | 188 | // fermer la connexion apres les headers si requete HEAD |
@@ -245,7 +245,7 @@ discard block |
||
| 245 | 245 | 'spip_version_code' => $GLOBALS['spip_version_code'], |
| 246 | 246 | ]; |
| 247 | 247 | if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { |
| 248 | - $contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST']; |
|
| 248 | + $contexte_implicite['host'] .= '|'.$_SERVER['HTTP_X_FORWARDED_HOST']; |
|
| 249 | 249 | } |
| 250 | 250 | |
| 251 | 251 | return $contexte_implicite; |
@@ -577,7 +577,7 @@ discard block |
||
| 577 | 577 | } |
| 578 | 578 | } |
| 579 | 579 | if (is_null($id)) { |
| 580 | - $msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]); |
|
| 580 | + $msg = "modeles/$modele : "._T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]); |
|
| 581 | 581 | erreur_squelette($msg); |
| 582 | 582 | // on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant |
| 583 | 583 | $id = 0; |
@@ -622,7 +622,7 @@ discard block |
||
| 622 | 622 | } |
| 623 | 623 | |
| 624 | 624 | if (preg_match(',^[a-z0-9_]+$,', $soustype)) { |
| 625 | - if (!trouve_modele($fond = ($type . '_' . $soustype))) { |
|
| 625 | + if (!trouve_modele($fond = ($type.'_'.$soustype))) { |
|
| 626 | 626 | $fond = ''; |
| 627 | 627 | $class = $soustype; |
| 628 | 628 | } |
@@ -637,7 +637,7 @@ discard block |
||
| 637 | 637 | |
| 638 | 638 | return false; |
| 639 | 639 | } |
| 640 | - $fond = 'modeles/' . $fond; |
|
| 640 | + $fond = 'modeles/'.$fond; |
|
| 641 | 641 | // Creer le contexte |
| 642 | 642 | $contexte = $env; |
| 643 | 643 | $contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte |
@@ -678,7 +678,7 @@ discard block |
||
| 678 | 678 | // sinon, s'il y a un lien, on l'ajoute classiquement |
| 679 | 679 | if ( |
| 680 | 680 | strstr( |
| 681 | - ' ' . ($classes = extraire_attribut($retour, 'class')) . ' ', |
|
| 681 | + ' '.($classes = extraire_attribut($retour, 'class')).' ', |
|
| 682 | 682 | 'spip_lien_ok' |
| 683 | 683 | ) |
| 684 | 684 | ) { |
@@ -689,7 +689,7 @@ discard block |
||
| 689 | 689 | ); |
| 690 | 690 | } else { |
| 691 | 691 | if ($lien) { |
| 692 | - $retour = '<a href="' . $lien['href'] . '" class="' . $lien['class'] . '">' . $retour . '</a>'; |
|
| 692 | + $retour = '<a href="'.$lien['href'].'" class="'.$lien['class'].'">'.$retour.'</a>'; |
|
| 693 | 693 | } |
| 694 | 694 | } |
| 695 | 695 | |
@@ -712,7 +712,7 @@ discard block |
||
| 712 | 712 | return $page; |
| 713 | 713 | } |
| 714 | 714 | // eval $page et affecte $res |
| 715 | - include _ROOT_RESTREINT . 'public/evaluer_page.php'; |
|
| 715 | + include _ROOT_RESTREINT.'public/evaluer_page.php'; |
|
| 716 | 716 | |
| 717 | 717 | // Lever un drapeau (global) si le fond utilise #SESSION |
| 718 | 718 | // a destination de public/parametrer |
@@ -779,16 +779,16 @@ discard block |
||
| 779 | 779 | if (($pos = strpos($head, '<head>')) !== false) { |
| 780 | 780 | $head = substr_replace($head, $base, $pos + 6, 0); |
| 781 | 781 | } elseif (preg_match(',<head[^>]*>,i', $head, $r)) { |
| 782 | - $head = str_replace($r[0], $r[0] . $base, $head); |
|
| 782 | + $head = str_replace($r[0], $r[0].$base, $head); |
|
| 783 | 783 | } |
| 784 | - $texte = $head . substr($texte, $poshead); |
|
| 784 | + $texte = $head.substr($texte, $poshead); |
|
| 785 | 785 | } |
| 786 | 786 | if ($href_base) { |
| 787 | 787 | // gerer les ancres |
| 788 | 788 | $base = $_SERVER['REQUEST_URI']; |
| 789 | 789 | // pas de guillemets ni < dans l'URL qu'on insere dans le HTML |
| 790 | 790 | if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) { |
| 791 | - $base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base); |
|
| 791 | + $base = str_replace(["'", '"', '<'], ['%27', '%22', '%3C'], $base); |
|
| 792 | 792 | } |
| 793 | 793 | if (strpos($texte, "href='#") !== false) { |
| 794 | 794 | $texte = str_replace("href='#", "href='$base#", $texte); |
@@ -22,7 +22,7 @@ discard block |
||
| 22 | 22 | **/ |
| 23 | 23 | |
| 24 | 24 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 25 | - return; |
|
| 25 | + return; |
|
| 26 | 26 | } |
| 27 | 27 | |
| 28 | 28 | // public/interfaces definit des traitements sur les champs qui utilisent des fonctions de inc/texte |
@@ -54,75 +54,75 @@ discard block |
||
| 54 | 54 | * Introduction calculée |
| 55 | 55 | **/ |
| 56 | 56 | function filtre_introduction_dist($descriptif, $texte, $longueur, $connect, $suite = null) { |
| 57 | - // Si un descriptif est envoye, on l'utilise directement |
|
| 58 | - if (strlen($descriptif)) { |
|
| 59 | - return appliquer_traitement_champ($descriptif, 'introduction', '', [], $connect); |
|
| 60 | - } |
|
| 61 | - |
|
| 62 | - // De preference ce qui est marque <intro>...</intro> |
|
| 63 | - $intro = ''; |
|
| 64 | - $texte = preg_replace(',(</?)intro>,i', "\\1intro>", $texte); // minuscules |
|
| 65 | - while ($fin = strpos($texte, '</intro>')) { |
|
| 66 | - $zone = substr($texte, 0, $fin); |
|
| 67 | - $texte = substr($texte, $fin + strlen('</intro>')); |
|
| 68 | - if (($deb = strpos($zone, '<intro>')) || str_starts_with($zone, '<intro>')) { |
|
| 69 | - $zone = substr($zone, $deb + 7); |
|
| 70 | - } |
|
| 71 | - $intro .= $zone; |
|
| 72 | - } |
|
| 73 | - |
|
| 74 | - // [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut, |
|
| 75 | - // qui inclus raccourcis et modeles |
|
| 76 | - // un simple <articlexx> peut etre ensuite transforme en 1000 lignes ... |
|
| 77 | - // par ailleurs le nettoyage des raccourcis ne tient pas compte |
|
| 78 | - // des surcharges et enrichissement de propre |
|
| 79 | - // couper doit se faire apres propre |
|
| 80 | - //$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect); |
|
| 81 | - |
|
| 82 | - // Cependant pour des questions de perfs on coupe quand meme, en prenant |
|
| 83 | - // large et en se mefiant des tableaux #1323 |
|
| 84 | - |
|
| 85 | - if (strlen($intro)) { |
|
| 86 | - $texte = $intro; |
|
| 87 | - } else { |
|
| 88 | - if ( |
|
| 89 | - !str_contains("\n" . $texte, "\n|") |
|
| 90 | - && strlen($texte) > 2.5 * $longueur |
|
| 91 | - ) { |
|
| 92 | - if (str_contains($texte, '<multi')) { |
|
| 93 | - $texte = extraire_multi($texte); |
|
| 94 | - } |
|
| 95 | - $texte = couper($texte, 2 * $longueur); |
|
| 96 | - } |
|
| 97 | - } |
|
| 98 | - |
|
| 99 | - // ne pas tenir compte des notes |
|
| 100 | - if ($notes = charger_fonction('notes', 'inc', true)) { |
|
| 101 | - $notes('', 'empiler'); |
|
| 102 | - } |
|
| 103 | - // Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable |
|
| 104 | - // dans l'introduction. |
|
| 105 | - $texte = supprime_img($texte, ''); |
|
| 106 | - $texte = appliquer_traitement_champ($texte, 'introduction', '', [], $connect); |
|
| 107 | - |
|
| 108 | - if ($notes) { |
|
| 109 | - $notes('', 'depiler'); |
|
| 110 | - } |
|
| 111 | - |
|
| 112 | - if (is_null($suite) && defined('_INTRODUCTION_SUITE')) { |
|
| 113 | - $suite = _INTRODUCTION_SUITE; |
|
| 114 | - } |
|
| 115 | - $texte = couper($texte, $longueur, $suite); |
|
| 116 | - // comme on a coupe il faut repasser la typo (on a perdu les insecables) |
|
| 117 | - $texte = typo($texte, true, $connect, []); |
|
| 118 | - |
|
| 119 | - // et reparagrapher si necessaire (coherence avec le cas descriptif) |
|
| 120 | - // une introduction a tojours un <p> |
|
| 121 | - if ($GLOBALS['toujours_paragrapher']) { // Fermer les paragraphes |
|
| 122 | - $texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']); |
|
| 123 | - } |
|
| 124 | - |
|
| 125 | - return $texte; |
|
| 57 | + // Si un descriptif est envoye, on l'utilise directement |
|
| 58 | + if (strlen($descriptif)) { |
|
| 59 | + return appliquer_traitement_champ($descriptif, 'introduction', '', [], $connect); |
|
| 60 | + } |
|
| 61 | + |
|
| 62 | + // De preference ce qui est marque <intro>...</intro> |
|
| 63 | + $intro = ''; |
|
| 64 | + $texte = preg_replace(',(</?)intro>,i', "\\1intro>", $texte); // minuscules |
|
| 65 | + while ($fin = strpos($texte, '</intro>')) { |
|
| 66 | + $zone = substr($texte, 0, $fin); |
|
| 67 | + $texte = substr($texte, $fin + strlen('</intro>')); |
|
| 68 | + if (($deb = strpos($zone, '<intro>')) || str_starts_with($zone, '<intro>')) { |
|
| 69 | + $zone = substr($zone, $deb + 7); |
|
| 70 | + } |
|
| 71 | + $intro .= $zone; |
|
| 72 | + } |
|
| 73 | + |
|
| 74 | + // [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut, |
|
| 75 | + // qui inclus raccourcis et modeles |
|
| 76 | + // un simple <articlexx> peut etre ensuite transforme en 1000 lignes ... |
|
| 77 | + // par ailleurs le nettoyage des raccourcis ne tient pas compte |
|
| 78 | + // des surcharges et enrichissement de propre |
|
| 79 | + // couper doit se faire apres propre |
|
| 80 | + //$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect); |
|
| 81 | + |
|
| 82 | + // Cependant pour des questions de perfs on coupe quand meme, en prenant |
|
| 83 | + // large et en se mefiant des tableaux #1323 |
|
| 84 | + |
|
| 85 | + if (strlen($intro)) { |
|
| 86 | + $texte = $intro; |
|
| 87 | + } else { |
|
| 88 | + if ( |
|
| 89 | + !str_contains("\n" . $texte, "\n|") |
|
| 90 | + && strlen($texte) > 2.5 * $longueur |
|
| 91 | + ) { |
|
| 92 | + if (str_contains($texte, '<multi')) { |
|
| 93 | + $texte = extraire_multi($texte); |
|
| 94 | + } |
|
| 95 | + $texte = couper($texte, 2 * $longueur); |
|
| 96 | + } |
|
| 97 | + } |
|
| 98 | + |
|
| 99 | + // ne pas tenir compte des notes |
|
| 100 | + if ($notes = charger_fonction('notes', 'inc', true)) { |
|
| 101 | + $notes('', 'empiler'); |
|
| 102 | + } |
|
| 103 | + // Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable |
|
| 104 | + // dans l'introduction. |
|
| 105 | + $texte = supprime_img($texte, ''); |
|
| 106 | + $texte = appliquer_traitement_champ($texte, 'introduction', '', [], $connect); |
|
| 107 | + |
|
| 108 | + if ($notes) { |
|
| 109 | + $notes('', 'depiler'); |
|
| 110 | + } |
|
| 111 | + |
|
| 112 | + if (is_null($suite) && defined('_INTRODUCTION_SUITE')) { |
|
| 113 | + $suite = _INTRODUCTION_SUITE; |
|
| 114 | + } |
|
| 115 | + $texte = couper($texte, $longueur, $suite); |
|
| 116 | + // comme on a coupe il faut repasser la typo (on a perdu les insecables) |
|
| 117 | + $texte = typo($texte, true, $connect, []); |
|
| 118 | + |
|
| 119 | + // et reparagrapher si necessaire (coherence avec le cas descriptif) |
|
| 120 | + // une introduction a tojours un <p> |
|
| 121 | + if ($GLOBALS['toujours_paragrapher']) { // Fermer les paragraphes |
|
| 122 | + $texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']); |
|
| 123 | + } |
|
| 124 | + |
|
| 125 | + return $texte; |
|
| 126 | 126 | } |
| 127 | 127 | |
| 128 | 128 | |
@@ -157,64 +157,64 @@ discard block |
||
| 157 | 157 | * Code HTML de la pagination |
| 158 | 158 | **/ |
| 159 | 159 | function filtre_pagination_dist( |
| 160 | - $total, |
|
| 161 | - $nom, |
|
| 162 | - $position, |
|
| 163 | - $pas, |
|
| 164 | - $liste = true, |
|
| 165 | - $modele = '', |
|
| 166 | - string $connect = '', |
|
| 167 | - $env = [] |
|
| 160 | + $total, |
|
| 161 | + $nom, |
|
| 162 | + $position, |
|
| 163 | + $pas, |
|
| 164 | + $liste = true, |
|
| 165 | + $modele = '', |
|
| 166 | + string $connect = '', |
|
| 167 | + $env = [] |
|
| 168 | 168 | ) { |
| 169 | - static $ancres = []; |
|
| 170 | - if ($pas < 1) { |
|
| 171 | - return ''; |
|
| 172 | - } |
|
| 173 | - $ancre = 'pagination' . $nom; // #pagination_articles |
|
| 174 | - $debut = 'debut' . $nom; // 'debut_articles' |
|
| 175 | - |
|
| 176 | - // n'afficher l'ancre qu'une fois |
|
| 177 | - $bloc_ancre = isset($ancres[$ancre]) ? '' : ($ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>"); |
|
| 178 | - // liste = false : on ne veut que l'ancre |
|
| 179 | - if (!$liste) { |
|
| 180 | - return $ancres[$ancre]; |
|
| 181 | - } |
|
| 182 | - |
|
| 183 | - $self = (empty($env['self']) ? self() : $env['self']); |
|
| 184 | - $pagination = [ |
|
| 185 | - 'debut' => $debut, |
|
| 186 | - 'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel |
|
| 187 | - 'total' => $total, |
|
| 188 | - 'position' => (int) $position, |
|
| 189 | - 'pas' => $pas, |
|
| 190 | - 'nombre_pages' => floor(($total - 1) / $pas) + 1, |
|
| 191 | - 'page_courante' => floor((int) $position / $pas) + 1, |
|
| 192 | - 'ancre' => $ancre, |
|
| 193 | - 'bloc_ancre' => $bloc_ancre |
|
| 194 | - ]; |
|
| 195 | - if (is_array($env)) { |
|
| 196 | - $pagination = array_merge($env, $pagination); |
|
| 197 | - } |
|
| 198 | - |
|
| 199 | - // Pas de pagination |
|
| 200 | - if ($pagination['nombre_pages'] <= 1) { |
|
| 201 | - return ''; |
|
| 202 | - } |
|
| 203 | - |
|
| 204 | - if ($modele) { |
|
| 205 | - $pagination['type_pagination'] = $modele; |
|
| 206 | - $modele = trouver_fond('pagination_' . $modele, 'modeles') ? '_' . $modele : ''; |
|
| 207 | - } |
|
| 208 | - |
|
| 209 | - if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) { |
|
| 210 | - define('_PAGINATION_NOMBRE_LIENS_MAX', 10); |
|
| 211 | - } |
|
| 212 | - if (!defined('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE')) { |
|
| 213 | - define('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE', 5); |
|
| 214 | - } |
|
| 215 | - |
|
| 216 | - |
|
| 217 | - return recuperer_fond("modeles/pagination$modele", $pagination, ['trim' => true], $connect); |
|
| 169 | + static $ancres = []; |
|
| 170 | + if ($pas < 1) { |
|
| 171 | + return ''; |
|
| 172 | + } |
|
| 173 | + $ancre = 'pagination' . $nom; // #pagination_articles |
|
| 174 | + $debut = 'debut' . $nom; // 'debut_articles' |
|
| 175 | + |
|
| 176 | + // n'afficher l'ancre qu'une fois |
|
| 177 | + $bloc_ancre = isset($ancres[$ancre]) ? '' : ($ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>"); |
|
| 178 | + // liste = false : on ne veut que l'ancre |
|
| 179 | + if (!$liste) { |
|
| 180 | + return $ancres[$ancre]; |
|
| 181 | + } |
|
| 182 | + |
|
| 183 | + $self = (empty($env['self']) ? self() : $env['self']); |
|
| 184 | + $pagination = [ |
|
| 185 | + 'debut' => $debut, |
|
| 186 | + 'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel |
|
| 187 | + 'total' => $total, |
|
| 188 | + 'position' => (int) $position, |
|
| 189 | + 'pas' => $pas, |
|
| 190 | + 'nombre_pages' => floor(($total - 1) / $pas) + 1, |
|
| 191 | + 'page_courante' => floor((int) $position / $pas) + 1, |
|
| 192 | + 'ancre' => $ancre, |
|
| 193 | + 'bloc_ancre' => $bloc_ancre |
|
| 194 | + ]; |
|
| 195 | + if (is_array($env)) { |
|
| 196 | + $pagination = array_merge($env, $pagination); |
|
| 197 | + } |
|
| 198 | + |
|
| 199 | + // Pas de pagination |
|
| 200 | + if ($pagination['nombre_pages'] <= 1) { |
|
| 201 | + return ''; |
|
| 202 | + } |
|
| 203 | + |
|
| 204 | + if ($modele) { |
|
| 205 | + $pagination['type_pagination'] = $modele; |
|
| 206 | + $modele = trouver_fond('pagination_' . $modele, 'modeles') ? '_' . $modele : ''; |
|
| 207 | + } |
|
| 208 | + |
|
| 209 | + if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) { |
|
| 210 | + define('_PAGINATION_NOMBRE_LIENS_MAX', 10); |
|
| 211 | + } |
|
| 212 | + if (!defined('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE')) { |
|
| 213 | + define('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE', 5); |
|
| 214 | + } |
|
| 215 | + |
|
| 216 | + |
|
| 217 | + return recuperer_fond("modeles/pagination$modele", $pagination, ['trim' => true], $connect); |
|
| 218 | 218 | } |
| 219 | 219 | |
| 220 | 220 | |
@@ -233,38 +233,38 @@ discard block |
||
| 233 | 233 | * Liste (première page, dernière page). |
| 234 | 234 | **/ |
| 235 | 235 | function filtre_bornes_pagination_dist($courante, $nombre, $max = 10) { |
| 236 | - if ($max <= 0 || $max >= $nombre) { |
|
| 237 | - return [1, $nombre]; |
|
| 238 | - } |
|
| 239 | - if ($max <= 1) { |
|
| 240 | - return [$courante, $courante]; |
|
| 241 | - } |
|
| 242 | - |
|
| 243 | - $premiere = max(1, $courante - floor(($max - 1) / 2)); |
|
| 244 | - $derniere = min($nombre, $premiere + $max - 2); |
|
| 245 | - $premiere = $derniere == $nombre ? $derniere - $max + 1 : $premiere; |
|
| 246 | - |
|
| 247 | - return [$premiere, $derniere]; |
|
| 236 | + if ($max <= 0 || $max >= $nombre) { |
|
| 237 | + return [1, $nombre]; |
|
| 238 | + } |
|
| 239 | + if ($max <= 1) { |
|
| 240 | + return [$courante, $courante]; |
|
| 241 | + } |
|
| 242 | + |
|
| 243 | + $premiere = max(1, $courante - floor(($max - 1) / 2)); |
|
| 244 | + $derniere = min($nombre, $premiere + $max - 2); |
|
| 245 | + $premiere = $derniere == $nombre ? $derniere - $max + 1 : $premiere; |
|
| 246 | + |
|
| 247 | + return [$premiere, $derniere]; |
|
| 248 | 248 | } |
| 249 | 249 | |
| 250 | 250 | function filtre_pagination_affiche_texte_lien_page_dist($type_pagination, $numero_page, $rang_item) { |
| 251 | - if ($numero_page === 'tous') { |
|
| 252 | - return '∞'; |
|
| 253 | - } |
|
| 254 | - if ($numero_page === 'prev') { |
|
| 255 | - return '<'; |
|
| 256 | - } |
|
| 257 | - if ($numero_page === 'next') { |
|
| 258 | - return '>'; |
|
| 259 | - } |
|
| 260 | - |
|
| 261 | - return match ($type_pagination) { |
|
| 262 | - 'resultats' => $rang_item + 1, // 1 11 21 31... |
|
| 263 | - 'naturel' => $rang_item ?: 1, // 1 10 20 30... |
|
| 264 | - 'rang' => $rang_item, // 0 10 20 30... |
|
| 265 | - 'page', 'prive' => $numero_page, // 1 2 3 4 5... |
|
| 266 | - default => $numero_page, // 1 2 3 4 5... |
|
| 267 | - }; |
|
| 251 | + if ($numero_page === 'tous') { |
|
| 252 | + return '∞'; |
|
| 253 | + } |
|
| 254 | + if ($numero_page === 'prev') { |
|
| 255 | + return '<'; |
|
| 256 | + } |
|
| 257 | + if ($numero_page === 'next') { |
|
| 258 | + return '>'; |
|
| 259 | + } |
|
| 260 | + |
|
| 261 | + return match ($type_pagination) { |
|
| 262 | + 'resultats' => $rang_item + 1, // 1 11 21 31... |
|
| 263 | + 'naturel' => $rang_item ?: 1, // 1 10 20 30... |
|
| 264 | + 'rang' => $rang_item, // 0 10 20 30... |
|
| 265 | + 'page', 'prive' => $numero_page, // 1 2 3 4 5... |
|
| 266 | + default => $numero_page, // 1 2 3 4 5... |
|
| 267 | + }; |
|
| 268 | 268 | } |
| 269 | 269 | |
| 270 | 270 | /** |
@@ -277,15 +277,15 @@ discard block |
||
| 277 | 277 | **/ |
| 278 | 278 | function lister_objets_avec_logos($type) { |
| 279 | 279 | |
| 280 | - $objet = objet_type($type); |
|
| 281 | - $ids = sql_allfetsel('L.id_objet', 'spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document', 'D.mode=' . sql_quote('logoon') . ' AND L.objet=' . sql_quote($objet)); |
|
| 282 | - if ($ids) { |
|
| 283 | - $ids = array_column($ids, 'id_objet'); |
|
| 284 | - return implode(',', $ids); |
|
| 285 | - } |
|
| 286 | - else { |
|
| 287 | - return '0'; |
|
| 288 | - } |
|
| 280 | + $objet = objet_type($type); |
|
| 281 | + $ids = sql_allfetsel('L.id_objet', 'spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document', 'D.mode=' . sql_quote('logoon') . ' AND L.objet=' . sql_quote($objet)); |
|
| 282 | + if ($ids) { |
|
| 283 | + $ids = array_column($ids, 'id_objet'); |
|
| 284 | + return implode(',', $ids); |
|
| 285 | + } |
|
| 286 | + else { |
|
| 287 | + return '0'; |
|
| 288 | + } |
|
| 289 | 289 | } |
| 290 | 290 | |
| 291 | 291 | |
@@ -301,14 +301,14 @@ discard block |
||
| 301 | 301 | * Code HTML des notes |
| 302 | 302 | **/ |
| 303 | 303 | function calculer_notes() { |
| 304 | - $r = ''; |
|
| 305 | - if ($notes = charger_fonction('notes', 'inc', true)) { |
|
| 306 | - $r = $notes([]); |
|
| 307 | - $notes('', 'depiler'); |
|
| 308 | - $notes('', 'empiler'); |
|
| 309 | - } |
|
| 310 | - |
|
| 311 | - return $r; |
|
| 304 | + $r = ''; |
|
| 305 | + if ($notes = charger_fonction('notes', 'inc', true)) { |
|
| 306 | + $r = $notes([]); |
|
| 307 | + $notes('', 'depiler'); |
|
| 308 | + $notes('', 'empiler'); |
|
| 309 | + } |
|
| 310 | + |
|
| 311 | + return $r; |
|
| 312 | 312 | } |
| 313 | 313 | |
| 314 | 314 | |
@@ -325,10 +325,10 @@ discard block |
||
| 325 | 325 | * @return string |
| 326 | 326 | */ |
| 327 | 327 | function retrouver_rang_lien($objet_source, $ids, $objet_lie, $idl, $objet_lien) { |
| 328 | - $res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien); |
|
| 329 | - $res = array_column($res, 'rang_lien', $objet_source); |
|
| 328 | + $res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien); |
|
| 329 | + $res = array_column($res, 'rang_lien', $objet_source); |
|
| 330 | 330 | |
| 331 | - return ($res[$ids] ?? ''); |
|
| 331 | + return ($res[$ids] ?? ''); |
|
| 332 | 332 | } |
| 333 | 333 | |
| 334 | 334 | |
@@ -345,19 +345,19 @@ discard block |
||
| 345 | 345 | * @private |
| 346 | 346 | */ |
| 347 | 347 | function lister_objets_liens($objet_source, $objet, $id_objet, $objet_lien) { |
| 348 | - static $liens = []; |
|
| 349 | - if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) { |
|
| 350 | - include_spip('action/editer_liens'); |
|
| 351 | - // quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source |
|
| 352 | - if ($objet_lien == $objet && $objet_lien !== $objet_source) { |
|
| 353 | - $res = objet_trouver_liens([$objet => $id_objet], [$objet_source => '*']); |
|
| 354 | - } else { |
|
| 355 | - $res = objet_trouver_liens([$objet_source => '*'], [$objet => $id_objet]); |
|
| 356 | - } |
|
| 357 | - |
|
| 358 | - $liens["$objet_source-$objet-$id_objet-$objet_lien"] = $res; |
|
| 359 | - } |
|
| 360 | - return $liens["$objet_source-$objet-$id_objet-$objet_lien"]; |
|
| 348 | + static $liens = []; |
|
| 349 | + if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) { |
|
| 350 | + include_spip('action/editer_liens'); |
|
| 351 | + // quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source |
|
| 352 | + if ($objet_lien == $objet && $objet_lien !== $objet_source) { |
|
| 353 | + $res = objet_trouver_liens([$objet => $id_objet], [$objet_source => '*']); |
|
| 354 | + } else { |
|
| 355 | + $res = objet_trouver_liens([$objet_source => '*'], [$objet => $id_objet]); |
|
| 356 | + } |
|
| 357 | + |
|
| 358 | + $liens["$objet_source-$objet-$id_objet-$objet_lien"] = $res; |
|
| 359 | + } |
|
| 360 | + return $liens["$objet_source-$objet-$id_objet-$objet_lien"]; |
|
| 361 | 361 | } |
| 362 | 362 | |
| 363 | 363 | /** |
@@ -371,24 +371,24 @@ discard block |
||
| 371 | 371 | * @return int|string |
| 372 | 372 | */ |
| 373 | 373 | function calculer_rang_smart($titre, $objet_source, $id, $env) { |
| 374 | - // Cas du #RANG utilisé dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien |
|
| 375 | - // permet de voir le rang du lien si il y en a un en base, meme avant un squelette xxxx-lies.html ne gerant pas les liens |
|
| 376 | - if ( |
|
| 377 | - isset($env['form']) && $env['form'] |
|
| 378 | - && isset($env['_objet_lien']) && $env['_objet_lien'] |
|
| 379 | - && (function_exists('lien_triables') || include_spip('action/editer_liens')) |
|
| 380 | - && ($r = objet_associable($env['_objet_lien'])) |
|
| 381 | - && ([$p, $table_lien] = $r) |
|
| 382 | - && lien_triables($table_lien) |
|
| 383 | - && isset($env['objet']) && $env['objet'] |
|
| 384 | - && isset($env['id_objet']) && $env['id_objet'] |
|
| 385 | - && $objet_source |
|
| 386 | - && ($id = (int) $id) |
|
| 387 | - ) { |
|
| 388 | - $rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']); |
|
| 389 | - return ($rang ?: ''); |
|
| 390 | - } |
|
| 391 | - return recuperer_numero($titre); |
|
| 374 | + // Cas du #RANG utilisé dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien |
|
| 375 | + // permet de voir le rang du lien si il y en a un en base, meme avant un squelette xxxx-lies.html ne gerant pas les liens |
|
| 376 | + if ( |
|
| 377 | + isset($env['form']) && $env['form'] |
|
| 378 | + && isset($env['_objet_lien']) && $env['_objet_lien'] |
|
| 379 | + && (function_exists('lien_triables') || include_spip('action/editer_liens')) |
|
| 380 | + && ($r = objet_associable($env['_objet_lien'])) |
|
| 381 | + && ([$p, $table_lien] = $r) |
|
| 382 | + && lien_triables($table_lien) |
|
| 383 | + && isset($env['objet']) && $env['objet'] |
|
| 384 | + && isset($env['id_objet']) && $env['id_objet'] |
|
| 385 | + && $objet_source |
|
| 386 | + && ($id = (int) $id) |
|
| 387 | + ) { |
|
| 388 | + $rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']); |
|
| 389 | + return ($rang ?: ''); |
|
| 390 | + } |
|
| 391 | + return recuperer_numero($titre); |
|
| 392 | 392 | } |
| 393 | 393 | |
| 394 | 394 | /** |
@@ -415,72 +415,72 @@ discard block |
||
| 415 | 415 | */ |
| 416 | 416 | function calculer_balise_tri(string $champ_ou_sens, string $libelle, string $classe, string $tri_nom, string $tri_champ, string $tri_sens, $liste_tri_sens_defaut): string { |
| 417 | 417 | |
| 418 | - $url = self('&'); |
|
| 419 | - $tri_sens = (int) $tri_sens; |
|
| 420 | - $alias_sens = [ |
|
| 421 | - '<' => -1, |
|
| 422 | - '>' => 1, |
|
| 423 | - 'inverse' => -1, |
|
| 424 | - ]; |
|
| 425 | - |
|
| 426 | - // Normaliser la liste des sens de tri par défaut |
|
| 427 | - // On ajoute un jocker pour les champs non présents dans la liste |
|
| 428 | - // avec la valeur du 1er item de la liste, idem critère {tri} |
|
| 429 | - if (is_array($liste_tri_sens_defaut)) { |
|
| 430 | - $liste_tri_sens_defaut['*'] = array_values($liste_tri_sens_defaut)[0]; |
|
| 431 | - } else { |
|
| 432 | - $liste_tri_sens_defaut = [ |
|
| 433 | - '*' => (int) ($alias_sens[$liste_tri_sens_defaut] ?? $liste_tri_sens_defaut), |
|
| 434 | - ]; |
|
| 435 | - } |
|
| 436 | - |
|
| 437 | - // Les sens de tri actuel et nouveau : |
|
| 438 | - // Soit c'est un sens fixe donné en paramètre (< ou >) |
|
| 439 | - $is_sens_fixe = array_key_exists($champ_ou_sens, $alias_sens); |
|
| 440 | - if ($is_sens_fixe) { |
|
| 441 | - $tri_sens_actuel = $tri_sens; |
|
| 442 | - $tri_sens_nouveau = $alias_sens[$champ_ou_sens]; |
|
| 443 | - // Soit c'est le champ utilisé actuellement pour le tri → on inverse le sens |
|
| 444 | - } elseif ($champ_ou_sens === $tri_champ) { |
|
| 445 | - $tri_sens_actuel = $tri_sens; |
|
| 446 | - $tri_sens_nouveau = $tri_sens * -1; |
|
| 447 | - // Sinon c'est un nouveau champ, et on prend son tri par défaut |
|
| 448 | - } else { |
|
| 449 | - $tri_sens_actuel = $tri_sens_nouveau = (int) ($liste_tri_sens_defaut[$champ_ou_sens] ?? $liste_tri_sens_defaut['*']); |
|
| 450 | - } |
|
| 451 | - |
|
| 452 | - // URL : ajouter le champ sur lequel porte le tri |
|
| 453 | - if (!$is_sens_fixe) { |
|
| 454 | - $param_tri = "tri$tri_nom"; |
|
| 455 | - $url = parametre_url($url, $param_tri, $champ_ou_sens); |
|
| 456 | - } |
|
| 457 | - |
|
| 458 | - // URL : n'ajouter le sens de tri que si nécessaire, |
|
| 459 | - // c.à.d différent du sens par défaut pour le champ |
|
| 460 | - $param_sens = "sens$tri_nom"; |
|
| 461 | - $tri_sens_defaut_champ = (int) ($liste_tri_sens_defaut[$champ_ou_sens] ?? $liste_tri_sens_defaut['*']); |
|
| 462 | - if ($tri_sens_nouveau !== $tri_sens_defaut_champ) { |
|
| 463 | - $url = parametre_url($url, $param_sens, $tri_sens_nouveau); |
|
| 464 | - } else { |
|
| 465 | - $url = parametre_url($url, $param_sens, ''); |
|
| 466 | - } |
|
| 467 | - |
|
| 468 | - // Drapeau pour garder en session ? |
|
| 469 | - $param_memo = ($is_sens_fixe ? $param_sens : $param_tri); |
|
| 470 | - $url = parametre_url($url, 'var_memotri', str_starts_with($tri_nom, 'session') ? $param_memo : ''); |
|
| 471 | - |
|
| 472 | - // Classes : on indique le sens de tri et l'item exposé |
|
| 473 | - if (!$is_sens_fixe) { |
|
| 474 | - $classe .= ' item-tri item-tri_' . ($tri_sens_actuel === 1 ? 'asc' : 'desc'); |
|
| 475 | - } |
|
| 476 | - if ($champ_ou_sens === $tri_champ) { |
|
| 477 | - $classe .= ' item-tri_actif'; |
|
| 478 | - } |
|
| 479 | - |
|
| 480 | - // Lien |
|
| 481 | - $balise = lien_ou_expose($url, $libelle, false, $classe); |
|
| 482 | - |
|
| 483 | - return $balise; |
|
| 418 | + $url = self('&'); |
|
| 419 | + $tri_sens = (int) $tri_sens; |
|
| 420 | + $alias_sens = [ |
|
| 421 | + '<' => -1, |
|
| 422 | + '>' => 1, |
|
| 423 | + 'inverse' => -1, |
|
| 424 | + ]; |
|
| 425 | + |
|
| 426 | + // Normaliser la liste des sens de tri par défaut |
|
| 427 | + // On ajoute un jocker pour les champs non présents dans la liste |
|
| 428 | + // avec la valeur du 1er item de la liste, idem critère {tri} |
|
| 429 | + if (is_array($liste_tri_sens_defaut)) { |
|
| 430 | + $liste_tri_sens_defaut['*'] = array_values($liste_tri_sens_defaut)[0]; |
|
| 431 | + } else { |
|
| 432 | + $liste_tri_sens_defaut = [ |
|
| 433 | + '*' => (int) ($alias_sens[$liste_tri_sens_defaut] ?? $liste_tri_sens_defaut), |
|
| 434 | + ]; |
|
| 435 | + } |
|
| 436 | + |
|
| 437 | + // Les sens de tri actuel et nouveau : |
|
| 438 | + // Soit c'est un sens fixe donné en paramètre (< ou >) |
|
| 439 | + $is_sens_fixe = array_key_exists($champ_ou_sens, $alias_sens); |
|
| 440 | + if ($is_sens_fixe) { |
|
| 441 | + $tri_sens_actuel = $tri_sens; |
|
| 442 | + $tri_sens_nouveau = $alias_sens[$champ_ou_sens]; |
|
| 443 | + // Soit c'est le champ utilisé actuellement pour le tri → on inverse le sens |
|
| 444 | + } elseif ($champ_ou_sens === $tri_champ) { |
|
| 445 | + $tri_sens_actuel = $tri_sens; |
|
| 446 | + $tri_sens_nouveau = $tri_sens * -1; |
|
| 447 | + // Sinon c'est un nouveau champ, et on prend son tri par défaut |
|
| 448 | + } else { |
|
| 449 | + $tri_sens_actuel = $tri_sens_nouveau = (int) ($liste_tri_sens_defaut[$champ_ou_sens] ?? $liste_tri_sens_defaut['*']); |
|
| 450 | + } |
|
| 451 | + |
|
| 452 | + // URL : ajouter le champ sur lequel porte le tri |
|
| 453 | + if (!$is_sens_fixe) { |
|
| 454 | + $param_tri = "tri$tri_nom"; |
|
| 455 | + $url = parametre_url($url, $param_tri, $champ_ou_sens); |
|
| 456 | + } |
|
| 457 | + |
|
| 458 | + // URL : n'ajouter le sens de tri que si nécessaire, |
|
| 459 | + // c.à.d différent du sens par défaut pour le champ |
|
| 460 | + $param_sens = "sens$tri_nom"; |
|
| 461 | + $tri_sens_defaut_champ = (int) ($liste_tri_sens_defaut[$champ_ou_sens] ?? $liste_tri_sens_defaut['*']); |
|
| 462 | + if ($tri_sens_nouveau !== $tri_sens_defaut_champ) { |
|
| 463 | + $url = parametre_url($url, $param_sens, $tri_sens_nouveau); |
|
| 464 | + } else { |
|
| 465 | + $url = parametre_url($url, $param_sens, ''); |
|
| 466 | + } |
|
| 467 | + |
|
| 468 | + // Drapeau pour garder en session ? |
|
| 469 | + $param_memo = ($is_sens_fixe ? $param_sens : $param_tri); |
|
| 470 | + $url = parametre_url($url, 'var_memotri', str_starts_with($tri_nom, 'session') ? $param_memo : ''); |
|
| 471 | + |
|
| 472 | + // Classes : on indique le sens de tri et l'item exposé |
|
| 473 | + if (!$is_sens_fixe) { |
|
| 474 | + $classe .= ' item-tri item-tri_' . ($tri_sens_actuel === 1 ? 'asc' : 'desc'); |
|
| 475 | + } |
|
| 476 | + if ($champ_ou_sens === $tri_champ) { |
|
| 477 | + $classe .= ' item-tri_actif'; |
|
| 478 | + } |
|
| 479 | + |
|
| 480 | + // Lien |
|
| 481 | + $balise = lien_ou_expose($url, $libelle, false, $classe); |
|
| 482 | + |
|
| 483 | + return $balise; |
|
| 484 | 484 | } |
| 485 | 485 | |
| 486 | 486 | |
@@ -496,7 +496,7 @@ discard block |
||
| 496 | 496 | * @return string |
| 497 | 497 | */ |
| 498 | 498 | function tri_protege_champ($t) { |
| 499 | - return preg_replace(',[^\s\w.+\[\]],', '', $t); |
|
| 499 | + return preg_replace(',[^\s\w.+\[\]],', '', $t); |
|
| 500 | 500 | } |
| 501 | 501 | |
| 502 | 502 | /** |
@@ -509,39 +509,39 @@ discard block |
||
| 509 | 509 | * @return string |
| 510 | 510 | */ |
| 511 | 511 | function tri_champ_order($t, $from = null, $senstri = '') { |
| 512 | - if (str_starts_with($t, 'multi ')) { |
|
| 513 | - return 'multi' . $senstri; |
|
| 514 | - } |
|
| 515 | - |
|
| 516 | - $champ = $t; |
|
| 517 | - |
|
| 518 | - $prefixe = ''; |
|
| 519 | - foreach (['num ', 'sinum '] as $p) { |
|
| 520 | - if (str_starts_with($t, $p)) { |
|
| 521 | - $champ = substr($t, strlen($p)); |
|
| 522 | - $prefixe = $p; |
|
| 523 | - } |
|
| 524 | - } |
|
| 525 | - |
|
| 526 | - // enlever les autres espaces non evacues par tri_protege_champ |
|
| 527 | - $champ = preg_replace(',\s,', '', $champ); |
|
| 528 | - |
|
| 529 | - if (is_array($from)) { |
|
| 530 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 531 | - foreach ($from as $idt => $table_sql) { |
|
| 532 | - if ( |
|
| 533 | - ($desc = $trouver_table($table_sql)) && isset($desc['field'][$champ]) |
|
| 534 | - ) { |
|
| 535 | - $champ = "$idt.$champ"; |
|
| 536 | - break; |
|
| 537 | - } |
|
| 538 | - } |
|
| 539 | - } |
|
| 540 | - return match ($prefixe) { |
|
| 541 | - 'num ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}", |
|
| 542 | - 'sinum ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}", |
|
| 543 | - default => $champ . $senstri, |
|
| 544 | - }; |
|
| 512 | + if (str_starts_with($t, 'multi ')) { |
|
| 513 | + return 'multi' . $senstri; |
|
| 514 | + } |
|
| 515 | + |
|
| 516 | + $champ = $t; |
|
| 517 | + |
|
| 518 | + $prefixe = ''; |
|
| 519 | + foreach (['num ', 'sinum '] as $p) { |
|
| 520 | + if (str_starts_with($t, $p)) { |
|
| 521 | + $champ = substr($t, strlen($p)); |
|
| 522 | + $prefixe = $p; |
|
| 523 | + } |
|
| 524 | + } |
|
| 525 | + |
|
| 526 | + // enlever les autres espaces non evacues par tri_protege_champ |
|
| 527 | + $champ = preg_replace(',\s,', '', $champ); |
|
| 528 | + |
|
| 529 | + if (is_array($from)) { |
|
| 530 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 531 | + foreach ($from as $idt => $table_sql) { |
|
| 532 | + if ( |
|
| 533 | + ($desc = $trouver_table($table_sql)) && isset($desc['field'][$champ]) |
|
| 534 | + ) { |
|
| 535 | + $champ = "$idt.$champ"; |
|
| 536 | + break; |
|
| 537 | + } |
|
| 538 | + } |
|
| 539 | + } |
|
| 540 | + return match ($prefixe) { |
|
| 541 | + 'num ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}", |
|
| 542 | + 'sinum ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}", |
|
| 543 | + default => $champ . $senstri, |
|
| 544 | + }; |
|
| 545 | 545 | } |
| 546 | 546 | |
| 547 | 547 | /** |
@@ -555,17 +555,17 @@ discard block |
||
| 555 | 555 | * @return string |
| 556 | 556 | */ |
| 557 | 557 | function tri_champ_select($t) { |
| 558 | - if (str_starts_with($t, 'multi ')) { |
|
| 559 | - $t = substr($t, 6); |
|
| 560 | - $t = preg_replace(',\s,', '', $t); |
|
| 558 | + if (str_starts_with($t, 'multi ')) { |
|
| 559 | + $t = substr($t, 6); |
|
| 560 | + $t = preg_replace(',\s,', '', $t); |
|
| 561 | 561 | |
| 562 | - return sql_multi($t, $GLOBALS['spip_lang']); |
|
| 563 | - } |
|
| 564 | - if (trim($t) == 'hasard') { |
|
| 565 | - return 'rand() AS hasard'; |
|
| 566 | - } |
|
| 562 | + return sql_multi($t, $GLOBALS['spip_lang']); |
|
| 563 | + } |
|
| 564 | + if (trim($t) == 'hasard') { |
|
| 565 | + return 'rand() AS hasard'; |
|
| 566 | + } |
|
| 567 | 567 | |
| 568 | - return "''"; |
|
| 568 | + return "''"; |
|
| 569 | 569 | } |
| 570 | 570 | |
| 571 | 571 | /** |
@@ -577,15 +577,15 @@ discard block |
||
| 577 | 577 | * @return string |
| 578 | 578 | */ |
| 579 | 579 | function formate_liste_critere_par_ordre_liste($valeurs, $serveur = '') { |
| 580 | - if (!is_array($valeurs)) { |
|
| 581 | - return ''; |
|
| 582 | - } |
|
| 583 | - $f = sql_serveur('quote', $serveur, true); |
|
| 584 | - if (!is_string($f) || !$f) { |
|
| 585 | - return ''; |
|
| 586 | - } |
|
| 587 | - |
|
| 588 | - return implode(',', array_map($f, array_unique($valeurs))); |
|
| 580 | + if (!is_array($valeurs)) { |
|
| 581 | + return ''; |
|
| 582 | + } |
|
| 583 | + $f = sql_serveur('quote', $serveur, true); |
|
| 584 | + if (!is_string($f) || !$f) { |
|
| 585 | + return ''; |
|
| 586 | + } |
|
| 587 | + |
|
| 588 | + return implode(',', array_map($f, array_unique($valeurs))); |
|
| 589 | 589 | } |
| 590 | 590 | |
| 591 | 591 | /** |
@@ -608,22 +608,22 @@ discard block |
||
| 608 | 608 | * Valeur $defaut sinon. |
| 609 | 609 | **/ |
| 610 | 610 | function appliquer_filtre_sinon($arg, $filtre, $args, $defaut = '') { |
| 611 | - // Si c'est un filtre d'image, on utilise image_filtrer() |
|
| 612 | - // Attention : les 2 premiers arguments sont inversés dans ce cas |
|
| 613 | - if (trouver_filtre_matrice($filtre) && str_starts_with($filtre, 'image_')) { |
|
| 614 | - include_spip('inc/filtres_images_lib_mini'); |
|
| 615 | - $args[1] = $args[0]; |
|
| 616 | - $args[0] = $filtre; |
|
| 617 | - return image_graver(image_filtrer($args)); |
|
| 618 | - } |
|
| 619 | - |
|
| 620 | - $f = chercher_filtre($filtre); |
|
| 621 | - if (!$f) { |
|
| 622 | - return $defaut; |
|
| 623 | - } |
|
| 624 | - array_shift($args); // enlever $arg |
|
| 625 | - array_shift($args); // enlever $filtre |
|
| 626 | - return $f($arg, ...$args); |
|
| 611 | + // Si c'est un filtre d'image, on utilise image_filtrer() |
|
| 612 | + // Attention : les 2 premiers arguments sont inversés dans ce cas |
|
| 613 | + if (trouver_filtre_matrice($filtre) && str_starts_with($filtre, 'image_')) { |
|
| 614 | + include_spip('inc/filtres_images_lib_mini'); |
|
| 615 | + $args[1] = $args[0]; |
|
| 616 | + $args[0] = $filtre; |
|
| 617 | + return image_graver(image_filtrer($args)); |
|
| 618 | + } |
|
| 619 | + |
|
| 620 | + $f = chercher_filtre($filtre); |
|
| 621 | + if (!$f) { |
|
| 622 | + return $defaut; |
|
| 623 | + } |
|
| 624 | + array_shift($args); // enlever $arg |
|
| 625 | + array_shift($args); // enlever $filtre |
|
| 626 | + return $f($arg, ...$args); |
|
| 627 | 627 | } |
| 628 | 628 | |
| 629 | 629 | /** |
@@ -633,30 +633,30 @@ discard block |
||
| 633 | 633 | * @return string |
| 634 | 634 | */ |
| 635 | 635 | function filtre_styles_inline_page_login_pass_dist(&$Pile, ...$dummy) { |
| 636 | - $styles = ''; |
|
| 637 | - include_spip('inc/config'); |
|
| 638 | - if ($couleur = lire_config('couleur_login')) { |
|
| 639 | - include_spip('inc/filtres_images_mini'); |
|
| 640 | - $hs = couleur_hex_to_hsl($couleur, 'h, s'); |
|
| 641 | - $l = couleur_hex_to_hsl($couleur, 'l'); |
|
| 642 | - $styles .= ":root {--spip-login-color-theme--hs: {$hs};--spip-login-color-theme--l: {$l};}\n"; |
|
| 643 | - } |
|
| 644 | - $logo_bg = _DIR_IMG . 'spip_fond_login.jpg'; |
|
| 645 | - if (file_exists($logo_bg)) { |
|
| 646 | - include_spip('inc/filtres_images_mini'); |
|
| 647 | - $logo_mini = image_reduire($logo_bg, 64, 64); |
|
| 648 | - $logo_mini = extraire_attribut($logo_mini, 'src'); |
|
| 649 | - $embarque_fichier = charger_filtre('embarque_fichier'); |
|
| 650 | - $logo_mini = $embarque_fichier($logo_mini); |
|
| 651 | - $logo_bg = timestamp($logo_bg); |
|
| 652 | - $styles .= ".page_login, .page_spip_pass {background-image:url($logo_bg), url($logo_mini);}\n"; |
|
| 653 | - $Pile[0]['body_class'] = 'fond_image'; |
|
| 654 | - } |
|
| 655 | - else { |
|
| 656 | - $Pile[0]['body_class'] = 'sans_fond'; |
|
| 657 | - } |
|
| 658 | - if ($styles) { |
|
| 659 | - $styles = "<style type='text/css'>$styles</style>"; |
|
| 660 | - } |
|
| 661 | - return $styles; |
|
| 636 | + $styles = ''; |
|
| 637 | + include_spip('inc/config'); |
|
| 638 | + if ($couleur = lire_config('couleur_login')) { |
|
| 639 | + include_spip('inc/filtres_images_mini'); |
|
| 640 | + $hs = couleur_hex_to_hsl($couleur, 'h, s'); |
|
| 641 | + $l = couleur_hex_to_hsl($couleur, 'l'); |
|
| 642 | + $styles .= ":root {--spip-login-color-theme--hs: {$hs};--spip-login-color-theme--l: {$l};}\n"; |
|
| 643 | + } |
|
| 644 | + $logo_bg = _DIR_IMG . 'spip_fond_login.jpg'; |
|
| 645 | + if (file_exists($logo_bg)) { |
|
| 646 | + include_spip('inc/filtres_images_mini'); |
|
| 647 | + $logo_mini = image_reduire($logo_bg, 64, 64); |
|
| 648 | + $logo_mini = extraire_attribut($logo_mini, 'src'); |
|
| 649 | + $embarque_fichier = charger_filtre('embarque_fichier'); |
|
| 650 | + $logo_mini = $embarque_fichier($logo_mini); |
|
| 651 | + $logo_bg = timestamp($logo_bg); |
|
| 652 | + $styles .= ".page_login, .page_spip_pass {background-image:url($logo_bg), url($logo_mini);}\n"; |
|
| 653 | + $Pile[0]['body_class'] = 'fond_image'; |
|
| 654 | + } |
|
| 655 | + else { |
|
| 656 | + $Pile[0]['body_class'] = 'sans_fond'; |
|
| 657 | + } |
|
| 658 | + if ($styles) { |
|
| 659 | + $styles = "<style type='text/css'>$styles</style>"; |
|
| 660 | + } |
|
| 661 | + return $styles; |
|
| 662 | 662 | } |
@@ -86,7 +86,7 @@ discard block |
||
| 86 | 86 | $texte = $intro; |
| 87 | 87 | } else { |
| 88 | 88 | if ( |
| 89 | - !str_contains("\n" . $texte, "\n|") |
|
| 89 | + !str_contains("\n".$texte, "\n|") |
|
| 90 | 90 | && strlen($texte) > 2.5 * $longueur |
| 91 | 91 | ) { |
| 92 | 92 | if (str_contains($texte, '<multi')) { |
@@ -170,11 +170,11 @@ discard block |
||
| 170 | 170 | if ($pas < 1) { |
| 171 | 171 | return ''; |
| 172 | 172 | } |
| 173 | - $ancre = 'pagination' . $nom; // #pagination_articles |
|
| 174 | - $debut = 'debut' . $nom; // 'debut_articles' |
|
| 173 | + $ancre = 'pagination'.$nom; // #pagination_articles |
|
| 174 | + $debut = 'debut'.$nom; // 'debut_articles' |
|
| 175 | 175 | |
| 176 | 176 | // n'afficher l'ancre qu'une fois |
| 177 | - $bloc_ancre = isset($ancres[$ancre]) ? '' : ($ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>"); |
|
| 177 | + $bloc_ancre = isset($ancres[$ancre]) ? '' : ($ancres[$ancre] = "<a id='".$ancre."' class='pagination_ancre'></a>"); |
|
| 178 | 178 | // liste = false : on ne veut que l'ancre |
| 179 | 179 | if (!$liste) { |
| 180 | 180 | return $ancres[$ancre]; |
@@ -203,7 +203,7 @@ discard block |
||
| 203 | 203 | |
| 204 | 204 | if ($modele) { |
| 205 | 205 | $pagination['type_pagination'] = $modele; |
| 206 | - $modele = trouver_fond('pagination_' . $modele, 'modeles') ? '_' . $modele : ''; |
|
| 206 | + $modele = trouver_fond('pagination_'.$modele, 'modeles') ? '_'.$modele : ''; |
|
| 207 | 207 | } |
| 208 | 208 | |
| 209 | 209 | if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) { |
@@ -278,7 +278,7 @@ discard block |
||
| 278 | 278 | function lister_objets_avec_logos($type) { |
| 279 | 279 | |
| 280 | 280 | $objet = objet_type($type); |
| 281 | - $ids = sql_allfetsel('L.id_objet', 'spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document', 'D.mode=' . sql_quote('logoon') . ' AND L.objet=' . sql_quote($objet)); |
|
| 281 | + $ids = sql_allfetsel('L.id_objet', 'spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document', 'D.mode='.sql_quote('logoon').' AND L.objet='.sql_quote($objet)); |
|
| 282 | 282 | if ($ids) { |
| 283 | 283 | $ids = array_column($ids, 'id_objet'); |
| 284 | 284 | return implode(',', $ids); |
@@ -471,7 +471,7 @@ discard block |
||
| 471 | 471 | |
| 472 | 472 | // Classes : on indique le sens de tri et l'item exposé |
| 473 | 473 | if (!$is_sens_fixe) { |
| 474 | - $classe .= ' item-tri item-tri_' . ($tri_sens_actuel === 1 ? 'asc' : 'desc'); |
|
| 474 | + $classe .= ' item-tri item-tri_'.($tri_sens_actuel === 1 ? 'asc' : 'desc'); |
|
| 475 | 475 | } |
| 476 | 476 | if ($champ_ou_sens === $tri_champ) { |
| 477 | 477 | $classe .= ' item-tri_actif'; |
@@ -510,7 +510,7 @@ discard block |
||
| 510 | 510 | */ |
| 511 | 511 | function tri_champ_order($t, $from = null, $senstri = '') { |
| 512 | 512 | if (str_starts_with($t, 'multi ')) { |
| 513 | - return 'multi' . $senstri; |
|
| 513 | + return 'multi'.$senstri; |
|
| 514 | 514 | } |
| 515 | 515 | |
| 516 | 516 | $champ = $t; |
@@ -540,7 +540,7 @@ discard block |
||
| 540 | 540 | return match ($prefixe) { |
| 541 | 541 | 'num ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}", |
| 542 | 542 | 'sinum ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}", |
| 543 | - default => $champ . $senstri, |
|
| 543 | + default => $champ.$senstri, |
|
| 544 | 544 | }; |
| 545 | 545 | } |
| 546 | 546 | |
@@ -641,7 +641,7 @@ discard block |
||
| 641 | 641 | $l = couleur_hex_to_hsl($couleur, 'l'); |
| 642 | 642 | $styles .= ":root {--spip-login-color-theme--hs: {$hs};--spip-login-color-theme--l: {$l};}\n"; |
| 643 | 643 | } |
| 644 | - $logo_bg = _DIR_IMG . 'spip_fond_login.jpg'; |
|
| 644 | + $logo_bg = _DIR_IMG.'spip_fond_login.jpg'; |
|
| 645 | 645 | if (file_exists($logo_bg)) { |
| 646 | 646 | include_spip('inc/filtres_images_mini'); |
| 647 | 647 | $logo_mini = image_reduire($logo_bg, 64, 64); |
@@ -282,8 +282,7 @@ discard block |
||
| 282 | 282 | if ($ids) { |
| 283 | 283 | $ids = array_column($ids, 'id_objet'); |
| 284 | 284 | return implode(',', $ids); |
| 285 | - } |
|
| 286 | - else { |
|
| 285 | + } else { |
|
| 287 | 286 | return '0'; |
| 288 | 287 | } |
| 289 | 288 | } |
@@ -651,8 +650,7 @@ discard block |
||
| 651 | 650 | $logo_bg = timestamp($logo_bg); |
| 652 | 651 | $styles .= ".page_login, .page_spip_pass {background-image:url($logo_bg), url($logo_mini);}\n"; |
| 653 | 652 | $Pile[0]['body_class'] = 'fond_image'; |
| 654 | - } |
|
| 655 | - else { |
|
| 653 | + } else { |
|
| 656 | 654 | $Pile[0]['body_class'] = 'sans_fond'; |
| 657 | 655 | } |
| 658 | 656 | if ($styles) { |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | include_spip('inc/texte'); |
@@ -40,234 +40,234 @@ discard block |
||
| 40 | 40 | |
| 41 | 41 | function public_composer_dist($squelette, $mime_type, $gram, $source, string $connect = '') { |
| 42 | 42 | |
| 43 | - $skel = null; |
|
| 44 | - $boucle = null; |
|
| 45 | - $nom = calculer_nom_fonction_squel($squelette, $mime_type, $connect); |
|
| 46 | - |
|
| 47 | - // si deja en memoire (INCLURE a repetition) c'est bon. |
|
| 48 | - if (function_exists($nom)) { |
|
| 49 | - return $nom; |
|
| 50 | - } |
|
| 51 | - |
|
| 52 | - if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
|
| 53 | - $GLOBALS['debug_objets']['courant'] = $nom; |
|
| 54 | - } |
|
| 55 | - |
|
| 56 | - $phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php'; |
|
| 57 | - |
|
| 58 | - // si squelette est deja compile et perenne, le charger |
|
| 59 | - if (!squelette_obsolete($phpfile, $source)) { |
|
| 60 | - include_once $phpfile; |
|
| 61 | - #if (!squelette_obsolete($phpfile, $source) |
|
| 62 | - # AND lire_fichier ($phpfile, $skel_code, |
|
| 63 | - # array('critique' => 'oui', 'phpcheck' => 'oui'))){ |
|
| 64 | - ## eval('?'.'>'.$skel_code); |
|
| 65 | - # spip_log($skel_code, 'comp') |
|
| 66 | - #} |
|
| 67 | - } |
|
| 68 | - |
|
| 69 | - if (file_exists($lib = $squelette . '_fonctions' . '.php')) { |
|
| 70 | - include_once $lib; |
|
| 71 | - } |
|
| 72 | - |
|
| 73 | - // tester si le eval ci-dessus a mis le squelette en memoire |
|
| 74 | - |
|
| 75 | - if (function_exists($nom)) { |
|
| 76 | - return $nom; |
|
| 77 | - } |
|
| 78 | - |
|
| 79 | - // charger le source, si possible, et compiler |
|
| 80 | - $skel_code = ''; |
|
| 81 | - if (lire_fichier($source, $skel)) { |
|
| 82 | - $compiler = charger_fonction('compiler', 'public'); |
|
| 83 | - $skel_code = $compiler($skel, $nom, $gram, $source, $connect); |
|
| 84 | - } |
|
| 85 | - |
|
| 86 | - // Ne plus rien faire si le compilateur n'a pas pu operer. |
|
| 87 | - if (!$skel_code) { |
|
| 88 | - return false; |
|
| 89 | - } |
|
| 90 | - |
|
| 91 | - foreach ($skel_code as $id => $boucle) { |
|
| 92 | - $f = $boucle->return; |
|
| 93 | - try { |
|
| 94 | - eval("return true; $f ;"); |
|
| 95 | - } catch (\ParseError $e) { |
|
| 96 | - // Code syntaxiquement faux (critere etc mal programme') |
|
| 97 | - $msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage(); |
|
| 98 | - erreur_squelette($msg, $boucle); |
|
| 99 | - // continuer pour trouver d'autres fautes eventuelles |
|
| 100 | - // mais prevenir que c'est mort |
|
| 101 | - $nom = ''; |
|
| 102 | - } |
|
| 103 | - |
|
| 104 | - // contexte de compil inutile a present |
|
| 105 | - // (mais la derniere valeur de $boucle est utilisee ci-dessous) |
|
| 106 | - $skel_code[$id] = $f; |
|
| 107 | - } |
|
| 108 | - |
|
| 109 | - $code = ''; |
|
| 110 | - if ($nom) { |
|
| 111 | - // Si le code est bon, concatener et mettre en cache |
|
| 112 | - if (function_exists($nom)) { |
|
| 113 | - $code = squelette_traduit($skel, $source, $phpfile, $skel_code); |
|
| 114 | - } else { |
|
| 115 | - // code semantiquement faux: bug du compilateur |
|
| 116 | - // $boucle est en fait ici la fct principale du squelette |
|
| 117 | - $msg = _T('zbug_erreur_compilation'); |
|
| 118 | - erreur_squelette($msg, $boucle); |
|
| 119 | - $nom = ''; |
|
| 120 | - } |
|
| 121 | - } |
|
| 122 | - |
|
| 123 | - if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
|
| 124 | - // Tracer ce qui vient d'etre compile |
|
| 125 | - $GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code; |
|
| 126 | - |
|
| 127 | - // si c'est ce que demande le debusqueur, lui passer la main |
|
| 128 | - if ( |
|
| 129 | - $GLOBALS['debug_objets']['sourcefile'] |
|
| 130 | - and (_request('var_mode_objet') == $nom) |
|
| 131 | - and (_request('var_mode_affiche') == 'code') |
|
| 132 | - ) { |
|
| 133 | - erreur_squelette(); |
|
| 134 | - } |
|
| 135 | - } |
|
| 136 | - |
|
| 137 | - return $nom ?: false; |
|
| 43 | + $skel = null; |
|
| 44 | + $boucle = null; |
|
| 45 | + $nom = calculer_nom_fonction_squel($squelette, $mime_type, $connect); |
|
| 46 | + |
|
| 47 | + // si deja en memoire (INCLURE a repetition) c'est bon. |
|
| 48 | + if (function_exists($nom)) { |
|
| 49 | + return $nom; |
|
| 50 | + } |
|
| 51 | + |
|
| 52 | + if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
|
| 53 | + $GLOBALS['debug_objets']['courant'] = $nom; |
|
| 54 | + } |
|
| 55 | + |
|
| 56 | + $phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php'; |
|
| 57 | + |
|
| 58 | + // si squelette est deja compile et perenne, le charger |
|
| 59 | + if (!squelette_obsolete($phpfile, $source)) { |
|
| 60 | + include_once $phpfile; |
|
| 61 | + #if (!squelette_obsolete($phpfile, $source) |
|
| 62 | + # AND lire_fichier ($phpfile, $skel_code, |
|
| 63 | + # array('critique' => 'oui', 'phpcheck' => 'oui'))){ |
|
| 64 | + ## eval('?'.'>'.$skel_code); |
|
| 65 | + # spip_log($skel_code, 'comp') |
|
| 66 | + #} |
|
| 67 | + } |
|
| 68 | + |
|
| 69 | + if (file_exists($lib = $squelette . '_fonctions' . '.php')) { |
|
| 70 | + include_once $lib; |
|
| 71 | + } |
|
| 72 | + |
|
| 73 | + // tester si le eval ci-dessus a mis le squelette en memoire |
|
| 74 | + |
|
| 75 | + if (function_exists($nom)) { |
|
| 76 | + return $nom; |
|
| 77 | + } |
|
| 78 | + |
|
| 79 | + // charger le source, si possible, et compiler |
|
| 80 | + $skel_code = ''; |
|
| 81 | + if (lire_fichier($source, $skel)) { |
|
| 82 | + $compiler = charger_fonction('compiler', 'public'); |
|
| 83 | + $skel_code = $compiler($skel, $nom, $gram, $source, $connect); |
|
| 84 | + } |
|
| 85 | + |
|
| 86 | + // Ne plus rien faire si le compilateur n'a pas pu operer. |
|
| 87 | + if (!$skel_code) { |
|
| 88 | + return false; |
|
| 89 | + } |
|
| 90 | + |
|
| 91 | + foreach ($skel_code as $id => $boucle) { |
|
| 92 | + $f = $boucle->return; |
|
| 93 | + try { |
|
| 94 | + eval("return true; $f ;"); |
|
| 95 | + } catch (\ParseError $e) { |
|
| 96 | + // Code syntaxiquement faux (critere etc mal programme') |
|
| 97 | + $msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage(); |
|
| 98 | + erreur_squelette($msg, $boucle); |
|
| 99 | + // continuer pour trouver d'autres fautes eventuelles |
|
| 100 | + // mais prevenir que c'est mort |
|
| 101 | + $nom = ''; |
|
| 102 | + } |
|
| 103 | + |
|
| 104 | + // contexte de compil inutile a present |
|
| 105 | + // (mais la derniere valeur de $boucle est utilisee ci-dessous) |
|
| 106 | + $skel_code[$id] = $f; |
|
| 107 | + } |
|
| 108 | + |
|
| 109 | + $code = ''; |
|
| 110 | + if ($nom) { |
|
| 111 | + // Si le code est bon, concatener et mettre en cache |
|
| 112 | + if (function_exists($nom)) { |
|
| 113 | + $code = squelette_traduit($skel, $source, $phpfile, $skel_code); |
|
| 114 | + } else { |
|
| 115 | + // code semantiquement faux: bug du compilateur |
|
| 116 | + // $boucle est en fait ici la fct principale du squelette |
|
| 117 | + $msg = _T('zbug_erreur_compilation'); |
|
| 118 | + erreur_squelette($msg, $boucle); |
|
| 119 | + $nom = ''; |
|
| 120 | + } |
|
| 121 | + } |
|
| 122 | + |
|
| 123 | + if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
|
| 124 | + // Tracer ce qui vient d'etre compile |
|
| 125 | + $GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code; |
|
| 126 | + |
|
| 127 | + // si c'est ce que demande le debusqueur, lui passer la main |
|
| 128 | + if ( |
|
| 129 | + $GLOBALS['debug_objets']['sourcefile'] |
|
| 130 | + and (_request('var_mode_objet') == $nom) |
|
| 131 | + and (_request('var_mode_affiche') == 'code') |
|
| 132 | + ) { |
|
| 133 | + erreur_squelette(); |
|
| 134 | + } |
|
| 135 | + } |
|
| 136 | + |
|
| 137 | + return $nom ?: false; |
|
| 138 | 138 | } |
| 139 | 139 | |
| 140 | 140 | function squelette_traduit($squelette, $sourcefile, $phpfile, $boucles) { |
| 141 | 141 | |
| 142 | - $code = null; |
|
| 143 | - // Le dernier index est '' (fonction principale) |
|
| 144 | - $noms = substr(join(', ', array_keys($boucles)), 0, -2); |
|
| 145 | - if (CODE_COMMENTE) { |
|
| 146 | - $code = " |
|
| 142 | + $code = null; |
|
| 143 | + // Le dernier index est '' (fonction principale) |
|
| 144 | + $noms = substr(join(', ', array_keys($boucles)), 0, -2); |
|
| 145 | + if (CODE_COMMENTE) { |
|
| 146 | + $code = " |
|
| 147 | 147 | /* |
| 148 | 148 | * Squelette : $sourcefile |
| 149 | 149 | * Date : " . gmdate('D, d M Y H:i:s', @filemtime($sourcefile)) . ' GMT |
| 150 | 150 | * Compile : ' . gmdate('D, d M Y H:i:s', time()) . ' GMT |
| 151 | 151 | * ' . (!$boucles ? 'Pas de boucle' : ('Boucles : ' . $noms)) . ' |
| 152 | 152 | */ '; |
| 153 | - } |
|
| 153 | + } |
|
| 154 | 154 | |
| 155 | - $code = '<' . "?php\n" . $code . join('', $boucles) . "\n"; |
|
| 156 | - if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) { |
|
| 157 | - ecrire_fichier($phpfile, $code); |
|
| 158 | - } |
|
| 155 | + $code = '<' . "?php\n" . $code . join('', $boucles) . "\n"; |
|
| 156 | + if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) { |
|
| 157 | + ecrire_fichier($phpfile, $code); |
|
| 158 | + } |
|
| 159 | 159 | |
| 160 | - return $code; |
|
| 160 | + return $code; |
|
| 161 | 161 | } |
| 162 | 162 | |
| 163 | 163 | // Le squelette compile est-il trop vieux ? |
| 164 | 164 | function squelette_obsolete($skel, $squelette) { |
| 165 | - static $date_change = null; |
|
| 166 | - // ne verifier la date de mes_fonctions et mes_options qu'une seule fois |
|
| 167 | - // par hit |
|
| 168 | - if (is_null($date_change)) { |
|
| 169 | - if (@file_exists($fonc = 'mes_fonctions.php')) { |
|
| 170 | - $date_change = @filemtime($fonc); |
|
| 171 | - } # compatibilite |
|
| 172 | - if (defined('_FILE_OPTIONS')) { |
|
| 173 | - $date_change = max($date_change, @filemtime(_FILE_OPTIONS)); |
|
| 174 | - } |
|
| 175 | - } |
|
| 176 | - |
|
| 177 | - return ( |
|
| 178 | - (defined('_VAR_MODE') and in_array(_VAR_MODE, ['recalcul', 'preview', 'debug'])) |
|
| 179 | - or !@file_exists($skel) |
|
| 180 | - or ((@file_exists($squelette) ? @filemtime($squelette) : 0) |
|
| 181 | - > ($date = @filemtime($skel))) |
|
| 182 | - or ($date_change > $date) |
|
| 183 | - ); |
|
| 165 | + static $date_change = null; |
|
| 166 | + // ne verifier la date de mes_fonctions et mes_options qu'une seule fois |
|
| 167 | + // par hit |
|
| 168 | + if (is_null($date_change)) { |
|
| 169 | + if (@file_exists($fonc = 'mes_fonctions.php')) { |
|
| 170 | + $date_change = @filemtime($fonc); |
|
| 171 | + } # compatibilite |
|
| 172 | + if (defined('_FILE_OPTIONS')) { |
|
| 173 | + $date_change = max($date_change, @filemtime(_FILE_OPTIONS)); |
|
| 174 | + } |
|
| 175 | + } |
|
| 176 | + |
|
| 177 | + return ( |
|
| 178 | + (defined('_VAR_MODE') and in_array(_VAR_MODE, ['recalcul', 'preview', 'debug'])) |
|
| 179 | + or !@file_exists($skel) |
|
| 180 | + or ((@file_exists($squelette) ? @filemtime($squelette) : 0) |
|
| 181 | + > ($date = @filemtime($skel))) |
|
| 182 | + or ($date_change > $date) |
|
| 183 | + ); |
|
| 184 | 184 | } |
| 185 | 185 | |
| 186 | 186 | // Activer l'invalideur de session |
| 187 | 187 | function invalideur_session(&$Cache, $code = null) { |
| 188 | - $Cache['session'] = spip_session(); |
|
| 188 | + $Cache['session'] = spip_session(); |
|
| 189 | 189 | |
| 190 | - return $code; |
|
| 190 | + return $code; |
|
| 191 | 191 | } |
| 192 | 192 | |
| 193 | 193 | |
| 194 | 194 | function analyse_resultat_skel($nom, $cache, $corps, $source = '') { |
| 195 | - static $filtres = []; |
|
| 196 | - $headers = []; |
|
| 197 | - $corps ??= ''; |
|
| 198 | - |
|
| 199 | - // Recupere les < ?php header('Xx: y'); ? > pour $page['headers'] |
|
| 200 | - // note: on essaie d'attrapper aussi certains de ces entetes codes |
|
| 201 | - // "a la main" dans les squelettes, mais evidemment sans exhaustivite |
|
| 202 | - if ( |
|
| 203 | - stripos($corps, 'header') !== false |
|
| 204 | - and preg_match_all( |
|
| 205 | - '/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims', |
|
| 206 | - $corps, |
|
| 207 | - $regs, |
|
| 208 | - PREG_SET_ORDER |
|
| 209 | - ) |
|
| 210 | - ) { |
|
| 211 | - foreach ($regs as $r) { |
|
| 212 | - $corps = str_replace($r[0], '', $corps); |
|
| 213 | - # $j = Content-Type, et pas content-TYPE. |
|
| 214 | - $j = join('-', array_map('ucwords', explode('-', strtolower($r[2])))); |
|
| 215 | - |
|
| 216 | - if ($j == 'X-Spip-Filtre' and isset($headers[$j])) { |
|
| 217 | - $headers[$j] .= '|' . $r[3]; |
|
| 218 | - } else { |
|
| 219 | - $headers[$j] = str_replace(['\\\\',"\\'",'\\"'], ['\\',"'",'"'], $r[3]); |
|
| 220 | - } |
|
| 221 | - } |
|
| 222 | - } |
|
| 223 | - // S'agit-il d'un resultat constant ou contenant du code php |
|
| 224 | - $process_ins = ( |
|
| 225 | - strpos($corps, '<' . '?') === false |
|
| 226 | - or |
|
| 227 | - (strpos($corps, '<' . '?xml') !== false and |
|
| 228 | - strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) |
|
| 229 | - ) |
|
| 230 | - ? 'html' |
|
| 231 | - : 'php'; |
|
| 232 | - |
|
| 233 | - $skel = [ |
|
| 234 | - 'squelette' => $nom, |
|
| 235 | - 'source' => $source, |
|
| 236 | - 'process_ins' => $process_ins, |
|
| 237 | - 'invalideurs' => $cache, |
|
| 238 | - 'entetes' => $headers, |
|
| 239 | - 'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0 |
|
| 240 | - ]; |
|
| 241 | - |
|
| 242 | - // traiter #FILTRE{} et filtres |
|
| 243 | - if (!isset($filtres[$nom])) { |
|
| 244 | - $filtres[$nom] = pipeline('declarer_filtres_squelettes', ['args' => $skel, 'data' => []]); |
|
| 245 | - } |
|
| 246 | - $filtres_headers = []; |
|
| 247 | - if (isset($headers['X-Spip-Filtre']) and strlen($headers['X-Spip-Filtre'])) { |
|
| 248 | - $filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre'])); |
|
| 249 | - unset($headers['X-Spip-Filtre']); |
|
| 250 | - } |
|
| 251 | - if (is_array($filtres[$nom]) || $filtres[$nom] instanceof \Countable ? count($filtres[$nom]) : 0 or count($filtres_headers)) { |
|
| 252 | - include_spip('public/sandbox'); |
|
| 253 | - $corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]); |
|
| 254 | - |
|
| 255 | - if ($process_ins == 'html') { |
|
| 256 | - $skel['process_ins'] = ( |
|
| 257 | - strpos($corps, '<' . '?') === false |
|
| 258 | - or |
|
| 259 | - (strpos($corps, '<' . '?xml') !== false and |
|
| 260 | - strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) |
|
| 261 | - ) |
|
| 262 | - ? 'html' |
|
| 263 | - : 'php'; |
|
| 264 | - } |
|
| 265 | - } |
|
| 266 | - |
|
| 267 | - $skel['entetes'] = $headers; |
|
| 268 | - $skel['texte'] = $corps; |
|
| 269 | - |
|
| 270 | - return $skel; |
|
| 195 | + static $filtres = []; |
|
| 196 | + $headers = []; |
|
| 197 | + $corps ??= ''; |
|
| 198 | + |
|
| 199 | + // Recupere les < ?php header('Xx: y'); ? > pour $page['headers'] |
|
| 200 | + // note: on essaie d'attrapper aussi certains de ces entetes codes |
|
| 201 | + // "a la main" dans les squelettes, mais evidemment sans exhaustivite |
|
| 202 | + if ( |
|
| 203 | + stripos($corps, 'header') !== false |
|
| 204 | + and preg_match_all( |
|
| 205 | + '/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims', |
|
| 206 | + $corps, |
|
| 207 | + $regs, |
|
| 208 | + PREG_SET_ORDER |
|
| 209 | + ) |
|
| 210 | + ) { |
|
| 211 | + foreach ($regs as $r) { |
|
| 212 | + $corps = str_replace($r[0], '', $corps); |
|
| 213 | + # $j = Content-Type, et pas content-TYPE. |
|
| 214 | + $j = join('-', array_map('ucwords', explode('-', strtolower($r[2])))); |
|
| 215 | + |
|
| 216 | + if ($j == 'X-Spip-Filtre' and isset($headers[$j])) { |
|
| 217 | + $headers[$j] .= '|' . $r[3]; |
|
| 218 | + } else { |
|
| 219 | + $headers[$j] = str_replace(['\\\\',"\\'",'\\"'], ['\\',"'",'"'], $r[3]); |
|
| 220 | + } |
|
| 221 | + } |
|
| 222 | + } |
|
| 223 | + // S'agit-il d'un resultat constant ou contenant du code php |
|
| 224 | + $process_ins = ( |
|
| 225 | + strpos($corps, '<' . '?') === false |
|
| 226 | + or |
|
| 227 | + (strpos($corps, '<' . '?xml') !== false and |
|
| 228 | + strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) |
|
| 229 | + ) |
|
| 230 | + ? 'html' |
|
| 231 | + : 'php'; |
|
| 232 | + |
|
| 233 | + $skel = [ |
|
| 234 | + 'squelette' => $nom, |
|
| 235 | + 'source' => $source, |
|
| 236 | + 'process_ins' => $process_ins, |
|
| 237 | + 'invalideurs' => $cache, |
|
| 238 | + 'entetes' => $headers, |
|
| 239 | + 'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0 |
|
| 240 | + ]; |
|
| 241 | + |
|
| 242 | + // traiter #FILTRE{} et filtres |
|
| 243 | + if (!isset($filtres[$nom])) { |
|
| 244 | + $filtres[$nom] = pipeline('declarer_filtres_squelettes', ['args' => $skel, 'data' => []]); |
|
| 245 | + } |
|
| 246 | + $filtres_headers = []; |
|
| 247 | + if (isset($headers['X-Spip-Filtre']) and strlen($headers['X-Spip-Filtre'])) { |
|
| 248 | + $filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre'])); |
|
| 249 | + unset($headers['X-Spip-Filtre']); |
|
| 250 | + } |
|
| 251 | + if (is_array($filtres[$nom]) || $filtres[$nom] instanceof \Countable ? count($filtres[$nom]) : 0 or count($filtres_headers)) { |
|
| 252 | + include_spip('public/sandbox'); |
|
| 253 | + $corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]); |
|
| 254 | + |
|
| 255 | + if ($process_ins == 'html') { |
|
| 256 | + $skel['process_ins'] = ( |
|
| 257 | + strpos($corps, '<' . '?') === false |
|
| 258 | + or |
|
| 259 | + (strpos($corps, '<' . '?xml') !== false and |
|
| 260 | + strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) |
|
| 261 | + ) |
|
| 262 | + ? 'html' |
|
| 263 | + : 'php'; |
|
| 264 | + } |
|
| 265 | + } |
|
| 266 | + |
|
| 267 | + $skel['entetes'] = $headers; |
|
| 268 | + $skel['texte'] = $corps; |
|
| 269 | + |
|
| 270 | + return $skel; |
|
| 271 | 271 | } |
| 272 | 272 | |
| 273 | 273 | // |
@@ -281,7 +281,7 @@ discard block |
||
| 281 | 281 | inserer_balise_dynamique(balise_%s_dyn(%s), array(%s)); |
| 282 | 282 | if ($lang_select) lang_select(); |
| 283 | 283 | ?' |
| 284 | - . '>'); |
|
| 284 | + . '>'); |
|
| 285 | 285 | |
| 286 | 286 | /** |
| 287 | 287 | * Synthétise une balise dynamique : crée l'appel à l'inclusion |
@@ -301,35 +301,35 @@ discard block |
||
| 301 | 301 | * Code PHP pour inclure le squelette de la balise dynamique |
| 302 | 302 | **/ |
| 303 | 303 | function synthetiser_balise_dynamique($nom, $args, $file, $context_compil) { |
| 304 | - if ( |
|
| 305 | - strncmp($file, '/', 1) !== 0 |
|
| 306 | - // pas de lien symbolique sous Windows |
|
| 307 | - and !(stristr(PHP_OS, 'WIN') and str_contains($file, ':')) |
|
| 308 | - ) { |
|
| 309 | - $file = './" . _DIR_RACINE . "' . $file; |
|
| 310 | - } |
|
| 311 | - |
|
| 312 | - $lang = $context_compil[4]; |
|
| 313 | - if (preg_match(',\W,', $lang)) { |
|
| 314 | - $lang = ''; |
|
| 315 | - } |
|
| 316 | - |
|
| 317 | - $args = array_map('argumenter_squelette', $args); |
|
| 318 | - if (!empty($context_compil['appel_php_depuis_modele'])) { |
|
| 319 | - $args[0] = 'arguments_balise_dyn_depuis_modele(' . $args[0] . ')'; |
|
| 320 | - } |
|
| 321 | - $args = join(', ', $args); |
|
| 322 | - |
|
| 323 | - $r = sprintf( |
|
| 324 | - CODE_INCLURE_BALISE, |
|
| 325 | - $file, |
|
| 326 | - $lang, |
|
| 327 | - $nom, |
|
| 328 | - $args, |
|
| 329 | - join(', ', array_map('_q', $context_compil)) |
|
| 330 | - ); |
|
| 331 | - |
|
| 332 | - return $r; |
|
| 304 | + if ( |
|
| 305 | + strncmp($file, '/', 1) !== 0 |
|
| 306 | + // pas de lien symbolique sous Windows |
|
| 307 | + and !(stristr(PHP_OS, 'WIN') and str_contains($file, ':')) |
|
| 308 | + ) { |
|
| 309 | + $file = './" . _DIR_RACINE . "' . $file; |
|
| 310 | + } |
|
| 311 | + |
|
| 312 | + $lang = $context_compil[4]; |
|
| 313 | + if (preg_match(',\W,', $lang)) { |
|
| 314 | + $lang = ''; |
|
| 315 | + } |
|
| 316 | + |
|
| 317 | + $args = array_map('argumenter_squelette', $args); |
|
| 318 | + if (!empty($context_compil['appel_php_depuis_modele'])) { |
|
| 319 | + $args[0] = 'arguments_balise_dyn_depuis_modele(' . $args[0] . ')'; |
|
| 320 | + } |
|
| 321 | + $args = join(', ', $args); |
|
| 322 | + |
|
| 323 | + $r = sprintf( |
|
| 324 | + CODE_INCLURE_BALISE, |
|
| 325 | + $file, |
|
| 326 | + $lang, |
|
| 327 | + $nom, |
|
| 328 | + $args, |
|
| 329 | + join(', ', array_map('_q', $context_compil)) |
|
| 330 | + ); |
|
| 331 | + |
|
| 332 | + return $r; |
|
| 333 | 333 | } |
| 334 | 334 | |
| 335 | 335 | /** |
@@ -347,18 +347,18 @@ discard block |
||
| 347 | 347 | **/ |
| 348 | 348 | function argumenter_squelette($v) { |
| 349 | 349 | |
| 350 | - if (is_object($v)) { |
|
| 351 | - return var_export($v, true); |
|
| 352 | - } elseif (!is_array($v)) { |
|
| 353 | - return "'" . texte_script((string) $v) . "'"; |
|
| 354 | - } else { |
|
| 355 | - $out = []; |
|
| 356 | - foreach ($v as $k => $val) { |
|
| 357 | - $out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val); |
|
| 358 | - } |
|
| 359 | - |
|
| 360 | - return 'array(' . join(', ', $out) . ')'; |
|
| 361 | - } |
|
| 350 | + if (is_object($v)) { |
|
| 351 | + return var_export($v, true); |
|
| 352 | + } elseif (!is_array($v)) { |
|
| 353 | + return "'" . texte_script((string) $v) . "'"; |
|
| 354 | + } else { |
|
| 355 | + $out = []; |
|
| 356 | + foreach ($v as $k => $val) { |
|
| 357 | + $out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val); |
|
| 358 | + } |
|
| 359 | + |
|
| 360 | + return 'array(' . join(', ', $out) . ')'; |
|
| 361 | + } |
|
| 362 | 362 | } |
| 363 | 363 | |
| 364 | 364 | /** |
@@ -377,13 +377,13 @@ discard block |
||
| 377 | 377 | * @return string |
| 378 | 378 | */ |
| 379 | 379 | function executer_balise_dynamique_dans_un_modele(...$args) { |
| 380 | - if (test_espace_prive()) { |
|
| 381 | - return executer_balise_dynamique(...$args); |
|
| 382 | - } |
|
| 383 | - else { |
|
| 384 | - $str_args = base64_encode(serialize($args)); |
|
| 385 | - return '<?' . "php \$_zargs=unserialize(base64_decode('$str_args'));echo executer_balise_dynamique(...\$_zargs); ?" . ">\n"; |
|
| 386 | - } |
|
| 380 | + if (test_espace_prive()) { |
|
| 381 | + return executer_balise_dynamique(...$args); |
|
| 382 | + } |
|
| 383 | + else { |
|
| 384 | + $str_args = base64_encode(serialize($args)); |
|
| 385 | + return '<?' . "php \$_zargs=unserialize(base64_decode('$str_args'));echo executer_balise_dynamique(...\$_zargs); ?" . ">\n"; |
|
| 386 | + } |
|
| 387 | 387 | } |
| 388 | 388 | |
| 389 | 389 | |
@@ -414,87 +414,87 @@ discard block |
||
| 414 | 414 | * Code PHP d'exécutant l'inclusion du squelette (ou texte) de la balise dynamique |
| 415 | 415 | **/ |
| 416 | 416 | function executer_balise_dynamique($nom, $args, $context_compil) { |
| 417 | - /** @var string Nom de la balise à charger (balise demandée ou balise générique) */ |
|
| 418 | - $nom_balise = $nom; |
|
| 419 | - /** @var string Nom de la balise générique (si utilisée) */ |
|
| 420 | - $nom_balise_generique = ''; |
|
| 421 | - |
|
| 422 | - $appel_php_depuis_modele = false; |
|
| 423 | - if ( |
|
| 424 | - is_array($context_compil) |
|
| 425 | - and !is_numeric($context_compil[3]) |
|
| 426 | - and empty($context_compil[0]) |
|
| 427 | - and empty($context_compil[1]) |
|
| 428 | - and empty($context_compil[2]) |
|
| 429 | - and empty($context_compil[3]) |
|
| 430 | - ) { |
|
| 431 | - $appel_php_depuis_modele = true; |
|
| 432 | - } |
|
| 433 | - |
|
| 434 | - if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) { |
|
| 435 | - // Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article') |
|
| 436 | - if ($balise_generique = chercher_balise_generique($nom)) { |
|
| 437 | - // injecter en premier arg le nom de la balise |
|
| 438 | - array_unshift($args, $nom); |
|
| 439 | - $nom_balise_generique = $balise_generique['nom_generique']; |
|
| 440 | - $fonction_balise = $balise_generique['fonction_generique']; |
|
| 441 | - $nom_balise = $nom_balise_generique; |
|
| 442 | - } |
|
| 443 | - unset($balise_generique); |
|
| 444 | - } |
|
| 445 | - |
|
| 446 | - if (!$fonction_balise) { |
|
| 447 | - $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]]; |
|
| 448 | - erreur_squelette($msg, $context_compil); |
|
| 449 | - |
|
| 450 | - return ''; |
|
| 451 | - } |
|
| 452 | - |
|
| 453 | - // retrouver le fichier qui a déclaré la fonction |
|
| 454 | - // même si la fonction dynamique est déclarée dans un fichier de fonctions. |
|
| 455 | - // Attention sous windows, getFileName() retourne un antislash. |
|
| 456 | - $reflector = new ReflectionFunction($fonction_balise); |
|
| 457 | - $file = str_replace('\\', '/', $reflector->getFileName()); |
|
| 458 | - if (strncmp($file, str_replace('\\', '/', _ROOT_RACINE), strlen(_ROOT_RACINE)) === 0) { |
|
| 459 | - $file = substr($file, strlen(_ROOT_RACINE)); |
|
| 460 | - } |
|
| 461 | - |
|
| 462 | - // Y a-t-il une fonction de traitement des arguments ? |
|
| 463 | - $f = 'balise_' . $nom_balise . '_stat'; |
|
| 464 | - |
|
| 465 | - $r = !function_exists($f) ? $args : $f($args, $context_compil); |
|
| 466 | - |
|
| 467 | - if (!is_array($r)) { |
|
| 468 | - return $r; |
|
| 469 | - } |
|
| 470 | - |
|
| 471 | - // verifier que la fonction dyn est la, |
|
| 472 | - // sinon se replier sur la generique si elle existe |
|
| 473 | - if (!function_exists('balise_' . $nom_balise . '_dyn')) { |
|
| 474 | - if ( |
|
| 475 | - $balise_generique = chercher_balise_generique($nom) |
|
| 476 | - and $nom_balise_generique = $balise_generique['nom_generique'] |
|
| 477 | - and $file = include_spip('balise/' . strtolower($nom_balise_generique)) |
|
| 478 | - and function_exists('balise_' . $nom_balise_generique . '_dyn') |
|
| 479 | - ) { |
|
| 480 | - // et lui injecter en premier arg le nom de la balise |
|
| 481 | - array_unshift($r, $nom); |
|
| 482 | - $nom_balise = $nom_balise_generique; |
|
| 483 | - if (!_DIR_RESTREINT) { |
|
| 484 | - $file = _DIR_RESTREINT_ABS . $file; |
|
| 485 | - } |
|
| 486 | - } else { |
|
| 487 | - $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]]; |
|
| 488 | - erreur_squelette($msg, $context_compil); |
|
| 489 | - |
|
| 490 | - return ''; |
|
| 491 | - } |
|
| 492 | - } |
|
| 493 | - |
|
| 494 | - if ($appel_php_depuis_modele) { |
|
| 495 | - $context_compil['appel_php_depuis_modele'] = true; |
|
| 496 | - } |
|
| 497 | - return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil); |
|
| 417 | + /** @var string Nom de la balise à charger (balise demandée ou balise générique) */ |
|
| 418 | + $nom_balise = $nom; |
|
| 419 | + /** @var string Nom de la balise générique (si utilisée) */ |
|
| 420 | + $nom_balise_generique = ''; |
|
| 421 | + |
|
| 422 | + $appel_php_depuis_modele = false; |
|
| 423 | + if ( |
|
| 424 | + is_array($context_compil) |
|
| 425 | + and !is_numeric($context_compil[3]) |
|
| 426 | + and empty($context_compil[0]) |
|
| 427 | + and empty($context_compil[1]) |
|
| 428 | + and empty($context_compil[2]) |
|
| 429 | + and empty($context_compil[3]) |
|
| 430 | + ) { |
|
| 431 | + $appel_php_depuis_modele = true; |
|
| 432 | + } |
|
| 433 | + |
|
| 434 | + if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) { |
|
| 435 | + // Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article') |
|
| 436 | + if ($balise_generique = chercher_balise_generique($nom)) { |
|
| 437 | + // injecter en premier arg le nom de la balise |
|
| 438 | + array_unshift($args, $nom); |
|
| 439 | + $nom_balise_generique = $balise_generique['nom_generique']; |
|
| 440 | + $fonction_balise = $balise_generique['fonction_generique']; |
|
| 441 | + $nom_balise = $nom_balise_generique; |
|
| 442 | + } |
|
| 443 | + unset($balise_generique); |
|
| 444 | + } |
|
| 445 | + |
|
| 446 | + if (!$fonction_balise) { |
|
| 447 | + $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]]; |
|
| 448 | + erreur_squelette($msg, $context_compil); |
|
| 449 | + |
|
| 450 | + return ''; |
|
| 451 | + } |
|
| 452 | + |
|
| 453 | + // retrouver le fichier qui a déclaré la fonction |
|
| 454 | + // même si la fonction dynamique est déclarée dans un fichier de fonctions. |
|
| 455 | + // Attention sous windows, getFileName() retourne un antislash. |
|
| 456 | + $reflector = new ReflectionFunction($fonction_balise); |
|
| 457 | + $file = str_replace('\\', '/', $reflector->getFileName()); |
|
| 458 | + if (strncmp($file, str_replace('\\', '/', _ROOT_RACINE), strlen(_ROOT_RACINE)) === 0) { |
|
| 459 | + $file = substr($file, strlen(_ROOT_RACINE)); |
|
| 460 | + } |
|
| 461 | + |
|
| 462 | + // Y a-t-il une fonction de traitement des arguments ? |
|
| 463 | + $f = 'balise_' . $nom_balise . '_stat'; |
|
| 464 | + |
|
| 465 | + $r = !function_exists($f) ? $args : $f($args, $context_compil); |
|
| 466 | + |
|
| 467 | + if (!is_array($r)) { |
|
| 468 | + return $r; |
|
| 469 | + } |
|
| 470 | + |
|
| 471 | + // verifier que la fonction dyn est la, |
|
| 472 | + // sinon se replier sur la generique si elle existe |
|
| 473 | + if (!function_exists('balise_' . $nom_balise . '_dyn')) { |
|
| 474 | + if ( |
|
| 475 | + $balise_generique = chercher_balise_generique($nom) |
|
| 476 | + and $nom_balise_generique = $balise_generique['nom_generique'] |
|
| 477 | + and $file = include_spip('balise/' . strtolower($nom_balise_generique)) |
|
| 478 | + and function_exists('balise_' . $nom_balise_generique . '_dyn') |
|
| 479 | + ) { |
|
| 480 | + // et lui injecter en premier arg le nom de la balise |
|
| 481 | + array_unshift($r, $nom); |
|
| 482 | + $nom_balise = $nom_balise_generique; |
|
| 483 | + if (!_DIR_RESTREINT) { |
|
| 484 | + $file = _DIR_RESTREINT_ABS . $file; |
|
| 485 | + } |
|
| 486 | + } else { |
|
| 487 | + $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]]; |
|
| 488 | + erreur_squelette($msg, $context_compil); |
|
| 489 | + |
|
| 490 | + return ''; |
|
| 491 | + } |
|
| 492 | + } |
|
| 493 | + |
|
| 494 | + if ($appel_php_depuis_modele) { |
|
| 495 | + $context_compil['appel_php_depuis_modele'] = true; |
|
| 496 | + } |
|
| 497 | + return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil); |
|
| 498 | 498 | } |
| 499 | 499 | |
| 500 | 500 | /** |
@@ -509,23 +509,23 @@ discard block |
||
| 509 | 509 | * @return array|null |
| 510 | 510 | */ |
| 511 | 511 | function chercher_balise_generique($nom) { |
| 512 | - if (!str_contains($nom, '_')) { |
|
| 513 | - return null; |
|
| 514 | - } |
|
| 515 | - $nom_generique = $nom; |
|
| 516 | - while (false !== ($p = strrpos($nom_generique, '_'))) { |
|
| 517 | - $nom_generique = substr($nom_generique, 0, $p + 1); |
|
| 518 | - $fonction_generique = charger_fonction($nom_generique, 'balise', true); |
|
| 519 | - if ($fonction_generique) { |
|
| 520 | - return [ |
|
| 521 | - 'nom' => $nom, |
|
| 522 | - 'nom_generique' => $nom_generique, |
|
| 523 | - 'fonction_generique' => $fonction_generique, |
|
| 524 | - ]; |
|
| 525 | - } |
|
| 526 | - $nom_generique = substr($nom_generique, 0, -1); |
|
| 527 | - } |
|
| 528 | - return null; |
|
| 512 | + if (!str_contains($nom, '_')) { |
|
| 513 | + return null; |
|
| 514 | + } |
|
| 515 | + $nom_generique = $nom; |
|
| 516 | + while (false !== ($p = strrpos($nom_generique, '_'))) { |
|
| 517 | + $nom_generique = substr($nom_generique, 0, $p + 1); |
|
| 518 | + $fonction_generique = charger_fonction($nom_generique, 'balise', true); |
|
| 519 | + if ($fonction_generique) { |
|
| 520 | + return [ |
|
| 521 | + 'nom' => $nom, |
|
| 522 | + 'nom_generique' => $nom_generique, |
|
| 523 | + 'fonction_generique' => $fonction_generique, |
|
| 524 | + ]; |
|
| 525 | + } |
|
| 526 | + $nom_generique = substr($nom_generique, 0, -1); |
|
| 527 | + } |
|
| 528 | + return null; |
|
| 529 | 529 | } |
| 530 | 530 | |
| 531 | 531 | |
@@ -549,50 +549,50 @@ discard block |
||
| 549 | 549 | * @return null; |
| 550 | 550 | **/ |
| 551 | 551 | function lang_select_public($lang, $lang_select, $titre = null) { |
| 552 | - // Cas 1. forcer_lang = true et pas de critere {lang_select} |
|
| 553 | - if ( |
|
| 554 | - isset($GLOBALS['forcer_lang']) and $GLOBALS['forcer_lang'] |
|
| 555 | - and $lang_select !== 'oui' |
|
| 556 | - ) { |
|
| 557 | - $lang = $GLOBALS['spip_lang']; |
|
| 558 | - } // Cas 2. l'objet n'a pas de langue definie (ou definie a '') |
|
| 559 | - elseif (!strlen($lang)) { |
|
| 560 | - $lang = $GLOBALS['spip_lang']; |
|
| 561 | - } // Cas 3. l'objet est multilingue ! |
|
| 562 | - elseif ( |
|
| 563 | - $lang_select !== 'oui' |
|
| 564 | - and strlen($titre) > 10 |
|
| 565 | - and str_contains($titre, '<multi>') |
|
| 566 | - and str_contains(echappe_html($titre), '<multi>') |
|
| 567 | - ) { |
|
| 568 | - $lang = $GLOBALS['spip_lang']; |
|
| 569 | - } |
|
| 570 | - |
|
| 571 | - // faire un lang_select() eventuellement sur la langue inchangee |
|
| 572 | - lang_select($lang); |
|
| 573 | - |
|
| 574 | - return; |
|
| 552 | + // Cas 1. forcer_lang = true et pas de critere {lang_select} |
|
| 553 | + if ( |
|
| 554 | + isset($GLOBALS['forcer_lang']) and $GLOBALS['forcer_lang'] |
|
| 555 | + and $lang_select !== 'oui' |
|
| 556 | + ) { |
|
| 557 | + $lang = $GLOBALS['spip_lang']; |
|
| 558 | + } // Cas 2. l'objet n'a pas de langue definie (ou definie a '') |
|
| 559 | + elseif (!strlen($lang)) { |
|
| 560 | + $lang = $GLOBALS['spip_lang']; |
|
| 561 | + } // Cas 3. l'objet est multilingue ! |
|
| 562 | + elseif ( |
|
| 563 | + $lang_select !== 'oui' |
|
| 564 | + and strlen($titre) > 10 |
|
| 565 | + and str_contains($titre, '<multi>') |
|
| 566 | + and str_contains(echappe_html($titre), '<multi>') |
|
| 567 | + ) { |
|
| 568 | + $lang = $GLOBALS['spip_lang']; |
|
| 569 | + } |
|
| 570 | + |
|
| 571 | + // faire un lang_select() eventuellement sur la langue inchangee |
|
| 572 | + lang_select($lang); |
|
| 573 | + |
|
| 574 | + return; |
|
| 575 | 575 | } |
| 576 | 576 | |
| 577 | 577 | |
| 578 | 578 | // Si un tableau &doublons[articles] est passe en parametre, |
| 579 | 579 | // il faut le nettoyer car il pourrait etre injecte en SQL |
| 580 | 580 | function nettoyer_env_doublons($envd) { |
| 581 | - foreach ($envd as $table => $liste) { |
|
| 582 | - $n = ''; |
|
| 583 | - foreach (explode(',', $liste) as $val) { |
|
| 584 | - if ($a = intval($val) and $val === strval($a)) { |
|
| 585 | - $n .= ',' . $val; |
|
| 586 | - } |
|
| 587 | - } |
|
| 588 | - if (strlen($n)) { |
|
| 589 | - $envd[$table] = $n; |
|
| 590 | - } else { |
|
| 591 | - unset($envd[$table]); |
|
| 592 | - } |
|
| 593 | - } |
|
| 594 | - |
|
| 595 | - return $envd; |
|
| 581 | + foreach ($envd as $table => $liste) { |
|
| 582 | + $n = ''; |
|
| 583 | + foreach (explode(',', $liste) as $val) { |
|
| 584 | + if ($a = intval($val) and $val === strval($a)) { |
|
| 585 | + $n .= ',' . $val; |
|
| 586 | + } |
|
| 587 | + } |
|
| 588 | + if (strlen($n)) { |
|
| 589 | + $envd[$table] = $n; |
|
| 590 | + } else { |
|
| 591 | + unset($envd[$table]); |
|
| 592 | + } |
|
| 593 | + } |
|
| 594 | + |
|
| 595 | + return $envd; |
|
| 596 | 596 | } |
| 597 | 597 | |
| 598 | 598 | /** |
@@ -611,21 +611,21 @@ discard block |
||
| 611 | 611 | * Opérateur trouvé (SELF ou SUBSELECT) sinon false. |
| 612 | 612 | **/ |
| 613 | 613 | function match_self($w) { |
| 614 | - if (is_string($w)) { |
|
| 615 | - return false; |
|
| 616 | - } |
|
| 617 | - if (is_array($w)) { |
|
| 618 | - if (in_array(reset($w), ['SELF', 'SUBSELECT'])) { |
|
| 619 | - return $w; |
|
| 620 | - } |
|
| 621 | - foreach (array_filter($w, 'is_array') as $sw) { |
|
| 622 | - if ($m = match_self($sw)) { |
|
| 623 | - return $m; |
|
| 624 | - } |
|
| 625 | - } |
|
| 626 | - } |
|
| 627 | - |
|
| 628 | - return false; |
|
| 614 | + if (is_string($w)) { |
|
| 615 | + return false; |
|
| 616 | + } |
|
| 617 | + if (is_array($w)) { |
|
| 618 | + if (in_array(reset($w), ['SELF', 'SUBSELECT'])) { |
|
| 619 | + return $w; |
|
| 620 | + } |
|
| 621 | + foreach (array_filter($w, 'is_array') as $sw) { |
|
| 622 | + if ($m = match_self($sw)) { |
|
| 623 | + return $m; |
|
| 624 | + } |
|
| 625 | + } |
|
| 626 | + } |
|
| 627 | + |
|
| 628 | + return false; |
|
| 629 | 629 | } |
| 630 | 630 | |
| 631 | 631 | /** |
@@ -641,16 +641,16 @@ discard block |
||
| 641 | 641 | * est remplacée par son code. |
| 642 | 642 | **/ |
| 643 | 643 | function remplace_sous_requete($w, $sousrequete) { |
| 644 | - if (is_array($w)) { |
|
| 645 | - if (in_array(reset($w), ['SELF', 'SUBSELECT'])) { |
|
| 646 | - return $sousrequete; |
|
| 647 | - } |
|
| 648 | - foreach ($w as $k => $sw) { |
|
| 649 | - $w[$k] = remplace_sous_requete($sw, $sousrequete); |
|
| 650 | - } |
|
| 651 | - } |
|
| 652 | - |
|
| 653 | - return $w; |
|
| 644 | + if (is_array($w)) { |
|
| 645 | + if (in_array(reset($w), ['SELF', 'SUBSELECT'])) { |
|
| 646 | + return $sousrequete; |
|
| 647 | + } |
|
| 648 | + foreach ($w as $k => $sw) { |
|
| 649 | + $w[$k] = remplace_sous_requete($sw, $sousrequete); |
|
| 650 | + } |
|
| 651 | + } |
|
| 652 | + |
|
| 653 | + return $w; |
|
| 654 | 654 | } |
| 655 | 655 | |
| 656 | 656 | /** |
@@ -664,17 +664,17 @@ discard block |
||
| 664 | 664 | * - Conditions avec des sous requêtes |
| 665 | 665 | **/ |
| 666 | 666 | function trouver_sous_requetes($where) { |
| 667 | - $where_simples = []; |
|
| 668 | - $where_sous = []; |
|
| 669 | - foreach ($where as $k => $w) { |
|
| 670 | - if (match_self($w)) { |
|
| 671 | - $where_sous[$k] = $w; |
|
| 672 | - } else { |
|
| 673 | - $where_simples[$k] = $w; |
|
| 674 | - } |
|
| 675 | - } |
|
| 676 | - |
|
| 677 | - return [$where_simples, $where_sous]; |
|
| 667 | + $where_simples = []; |
|
| 668 | + $where_sous = []; |
|
| 669 | + foreach ($where as $k => $w) { |
|
| 670 | + if (match_self($w)) { |
|
| 671 | + $where_sous[$k] = $w; |
|
| 672 | + } else { |
|
| 673 | + $where_simples[$k] = $w; |
|
| 674 | + } |
|
| 675 | + } |
|
| 676 | + |
|
| 677 | + return [$where_simples, $where_sous]; |
|
| 678 | 678 | } |
| 679 | 679 | |
| 680 | 680 | |
@@ -700,292 +700,292 @@ discard block |
||
| 700 | 700 | * @return resource |
| 701 | 701 | */ |
| 702 | 702 | function calculer_select( |
| 703 | - $select = [], |
|
| 704 | - $from = [], |
|
| 705 | - $from_type = [], |
|
| 706 | - $where = [], |
|
| 707 | - $join = [], |
|
| 708 | - $groupby = [], |
|
| 709 | - $orderby = [], |
|
| 710 | - $limit = '', |
|
| 711 | - $having = [], |
|
| 712 | - $table = '', |
|
| 713 | - $id = '', |
|
| 714 | - $serveur = '', |
|
| 715 | - $requeter = true |
|
| 703 | + $select = [], |
|
| 704 | + $from = [], |
|
| 705 | + $from_type = [], |
|
| 706 | + $where = [], |
|
| 707 | + $join = [], |
|
| 708 | + $groupby = [], |
|
| 709 | + $orderby = [], |
|
| 710 | + $limit = '', |
|
| 711 | + $having = [], |
|
| 712 | + $table = '', |
|
| 713 | + $id = '', |
|
| 714 | + $serveur = '', |
|
| 715 | + $requeter = true |
|
| 716 | 716 | ) { |
| 717 | 717 | |
| 718 | - // retirer les criteres vides: |
|
| 719 | - // {X ?} avec X absent de l'URL |
|
| 720 | - // {par #ENV{X}} avec X absent de l'URL |
|
| 721 | - // IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil) |
|
| 722 | - $menage = false; |
|
| 723 | - foreach ($where as $k => $v) { |
|
| 724 | - if (is_array($v) and count($v)) { |
|
| 725 | - if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) { |
|
| 726 | - $op = false; |
|
| 727 | - } elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) { |
|
| 728 | - $op = false; |
|
| 729 | - } else { |
|
| 730 | - $op = $v[0] ?: $v; |
|
| 731 | - } |
|
| 732 | - } else { |
|
| 733 | - $op = $v; |
|
| 734 | - } |
|
| 735 | - if ((!$op) or ($op == 1) or ($op == '0=0')) { |
|
| 736 | - unset($where[$k]); |
|
| 737 | - $menage = true; |
|
| 738 | - } |
|
| 739 | - } |
|
| 740 | - |
|
| 741 | - // evacuer les eventuels groupby vide issus d'un calcul dynamique |
|
| 742 | - $groupby = array_diff($groupby, ['']); |
|
| 743 | - |
|
| 744 | - // remplacer les sous requetes recursives au calcul |
|
| 745 | - [$where_simples, $where_sous] = trouver_sous_requetes($where); |
|
| 746 | - foreach ($where_sous as $k => $w) { |
|
| 747 | - $menage = true; |
|
| 748 | - // on recupere la sous requete |
|
| 749 | - $sous = match_self($w); |
|
| 750 | - if ($sous[0] == 'SELF') { |
|
| 751 | - // c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where) |
|
| 752 | - array_push($where_simples, $sous[2]); |
|
| 753 | - $wheresub = [ |
|
| 754 | - $sous[2], |
|
| 755 | - '0=0' |
|
| 756 | - ]; // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where |
|
| 757 | - $jsub = $join; |
|
| 758 | - // trouver les jointures utiles a |
|
| 759 | - // reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees |
|
| 760 | - // ie L1.objet='article' |
|
| 761 | - // on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction |
|
| 762 | - $i = 0; |
|
| 763 | - do { |
|
| 764 | - $where[$k] = remplace_sous_requete($w, '(' . calculer_select( |
|
| 765 | - [$sous[1] . ' AS id'], |
|
| 766 | - $from, |
|
| 767 | - $from_type, |
|
| 768 | - $wheresub, |
|
| 769 | - $jsub, |
|
| 770 | - [], |
|
| 771 | - [], |
|
| 772 | - '', |
|
| 773 | - $having, |
|
| 774 | - $table, |
|
| 775 | - $id, |
|
| 776 | - $serveur, |
|
| 777 | - false |
|
| 778 | - ) . ')'); |
|
| 779 | - if (!$i) { |
|
| 780 | - $i = 1; |
|
| 781 | - $wherestring = calculer_where_to_string($where[$k]); |
|
| 782 | - foreach ($join as $cle => $wj) { |
|
| 783 | - if ( |
|
| 784 | - (is_countable($wj) ? count($wj) : 0) == 4 |
|
| 785 | - and str_contains($wherestring, (string) "{$cle}.") |
|
| 786 | - ) { |
|
| 787 | - $i = 0; |
|
| 788 | - $wheresub[] = $wj[3]; |
|
| 789 | - unset($jsub[$cle][3]); |
|
| 790 | - } |
|
| 791 | - } |
|
| 792 | - } |
|
| 793 | - } while ($i++ < 1); |
|
| 794 | - } |
|
| 795 | - if ($sous[0] == 'SUBSELECT') { |
|
| 796 | - // c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having) |
|
| 797 | - array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ? |
|
| 798 | - $where[$k] = remplace_sous_requete($w, '(' . calculer_select( |
|
| 799 | - $sous[1], # select |
|
| 800 | - $sous[2], #from |
|
| 801 | - [], #from_type |
|
| 802 | - $sous[3] ? (is_array($sous[3]) ? $sous[3] : [$sous[3]]) : [], |
|
| 803 | - #where, qui peut etre de la forme string comme dans sql_select |
|
| 804 | - [], #join |
|
| 805 | - $sous[4] ?: [], #groupby |
|
| 806 | - $sous[5] ?: [], #orderby |
|
| 807 | - $sous[6], #limit |
|
| 808 | - $sous[7] ?: [], #having |
|
| 809 | - $table, |
|
| 810 | - $id, |
|
| 811 | - $serveur, |
|
| 812 | - false |
|
| 813 | - ) . ')'); |
|
| 814 | - } |
|
| 815 | - array_pop($where_simples); |
|
| 816 | - } |
|
| 817 | - |
|
| 818 | - foreach ($having as $k => $v) { |
|
| 819 | - if ((!$v) or ($v == 1) or ($v == '0=0')) { |
|
| 820 | - unset($having[$k]); |
|
| 821 | - } |
|
| 822 | - } |
|
| 823 | - |
|
| 824 | - // Installer les jointures. |
|
| 825 | - // Retirer celles seulement utiles aux criteres finalement absents mais |
|
| 826 | - // parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln |
|
| 827 | - // si elle est seulement utile a Ln+1 elle meme inutile |
|
| 828 | - |
|
| 829 | - $afrom = []; |
|
| 830 | - $equiv = []; |
|
| 831 | - $k = count($join); |
|
| 832 | - foreach (array_reverse($join, true) as $cledef => $j) { |
|
| 833 | - $cle = $cledef; |
|
| 834 | - // le format de join est : |
|
| 835 | - // array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]]) |
|
| 836 | - $join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber |
|
| 837 | - if (count($join[$cle]) == 2) { |
|
| 838 | - $join[$cle][] = $join[$cle][1]; |
|
| 839 | - } |
|
| 840 | - if ((is_array($join[$cle]) || $join[$cle] instanceof \Countable ? count($join[$cle]) : 0) == 3) { |
|
| 841 | - $join[$cle][] = ''; |
|
| 842 | - } |
|
| 843 | - [$t, $c, $carr, $and] = $join[$cle]; |
|
| 844 | - // si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste |
|
| 845 | - // pour compat avec ancienne convention |
|
| 846 | - if (is_numeric($cle)) { |
|
| 847 | - $cle = "L$k"; |
|
| 848 | - } |
|
| 849 | - $cle_where_lie = "JOIN-$cle"; |
|
| 850 | - if ( |
|
| 851 | - !$menage |
|
| 852 | - or isset($afrom[$cle]) |
|
| 853 | - or calculer_jointnul($cle, $select) |
|
| 854 | - or calculer_jointnul($cle, array_diff_key($join, [$cle => $join[$cle]])) |
|
| 855 | - or calculer_jointnul($cle, $having) |
|
| 856 | - or calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => ''])) |
|
| 857 | - ) { |
|
| 858 | - // corriger les references non explicites dans select |
|
| 859 | - // ou groupby |
|
| 860 | - foreach ($select as $i => $s) { |
|
| 861 | - if ($s == $c) { |
|
| 862 | - $select[$i] = "$cle.$c AS $c"; |
|
| 863 | - break; |
|
| 864 | - } |
|
| 865 | - } |
|
| 866 | - foreach ($groupby as $i => $g) { |
|
| 867 | - if ($g == $c) { |
|
| 868 | - $groupby[$i] = "$cle.$c"; |
|
| 869 | - break; |
|
| 870 | - } |
|
| 871 | - } |
|
| 872 | - // on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin |
|
| 873 | - // sans recours a preg_match |
|
| 874 | - // un implode(' ',..) est fait dans reinjecte_joint un peu plus bas |
|
| 875 | - $afrom[$t][$cle] = [ |
|
| 876 | - "\n" . |
|
| 877 | - ($from_type[$cle] ?? 'INNER') . ' JOIN', |
|
| 878 | - $from[$cle], |
|
| 879 | - "AS $cle", |
|
| 880 | - 'ON (', |
|
| 881 | - "$cle.$c", |
|
| 882 | - '=', |
|
| 883 | - "$t.$carr", |
|
| 884 | - ($and ? 'AND ' . $and : '') . |
|
| 885 | - ')' |
|
| 886 | - ]; |
|
| 887 | - if (isset($afrom[$cle])) { |
|
| 888 | - $afrom[$t] = $afrom[$t] + $afrom[$cle]; |
|
| 889 | - unset($afrom[$cle]); |
|
| 890 | - } |
|
| 891 | - $equiv[] = $carr; |
|
| 892 | - } else { |
|
| 893 | - unset($join[$cledef]); |
|
| 894 | - if (isset($where_simples[$cle_where_lie])) { |
|
| 895 | - unset($where_simples[$cle_where_lie]); |
|
| 896 | - unset($where[$cle_where_lie]); |
|
| 897 | - } |
|
| 898 | - } |
|
| 899 | - unset($from[$cle]); |
|
| 900 | - $k--; |
|
| 901 | - } |
|
| 902 | - |
|
| 903 | - if (count($afrom)) { |
|
| 904 | - // Regarder si la table principale ne sert finalement a rien comme dans |
|
| 905 | - //<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3> |
|
| 906 | - //<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2> |
|
| 907 | - //<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5> |
|
| 908 | - // ou dans |
|
| 909 | - //<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8> |
|
| 910 | - // qui comporte plusieurs jointures |
|
| 911 | - // ou dans |
|
| 912 | - // <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6> |
|
| 913 | - // <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7> |
|
| 914 | - // penser a regarder aussi la clause orderby pour ne pas simplifier abusivement |
|
| 915 | - // <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9> |
|
| 916 | - // penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement |
|
| 917 | - // <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10> |
|
| 918 | - |
|
| 919 | - $t = key($from); |
|
| 920 | - $c = current($from); |
|
| 921 | - reset($from); |
|
| 922 | - $e = '/\b(' . "$t\\." . join('|' . $t . '\.', $equiv) . ')\b/'; |
|
| 923 | - if ( |
|
| 924 | - !(strpos($t, ' ') or // jointure des le depart cf boucle_doc |
|
| 925 | - calculer_jointnul($t, $select, $e) or |
|
| 926 | - calculer_jointnul($t, $join, $e) or |
|
| 927 | - calculer_jointnul($t, $where, $e) or |
|
| 928 | - calculer_jointnul($t, $orderby, $e) or |
|
| 929 | - calculer_jointnul($t, $groupby, $e) or |
|
| 930 | - calculer_jointnul($t, $having, $e)) |
|
| 931 | - && count($afrom[$t]) |
|
| 932 | - ) { |
|
| 933 | - $nfrom = reset($afrom[$t]); |
|
| 934 | - $nt = array_key_first($afrom[$t]); |
|
| 935 | - unset($from[$t]); |
|
| 936 | - $from[$nt] = $nfrom[1]; |
|
| 937 | - unset($afrom[$t][$nt]); |
|
| 938 | - $afrom[$nt] = $afrom[$t]; |
|
| 939 | - unset($afrom[$t]); |
|
| 940 | - $e = '/\b' . preg_quote($nfrom[6]) . '\b/'; |
|
| 941 | - $t = $nfrom[4]; |
|
| 942 | - $alias = ''; |
|
| 943 | - // verifier que les deux cles sont homonymes, sinon installer un alias dans le select |
|
| 944 | - $oldcle = explode('.', $nfrom[6]); |
|
| 945 | - $oldcle = end($oldcle); |
|
| 946 | - $newcle = explode('.', $nfrom[4]); |
|
| 947 | - $newcle = end($newcle); |
|
| 948 | - if ($newcle != $oldcle) { |
|
| 949 | - // si l'ancienne cle etait deja dans le select avec un AS |
|
| 950 | - // reprendre simplement ce AS |
|
| 951 | - $as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/'; |
|
| 952 | - if (preg_match($as, implode(',', $select), $m)) { |
|
| 953 | - $alias = ''; |
|
| 954 | - } else { |
|
| 955 | - $alias = ', ' . $nfrom[4] . " AS $oldcle"; |
|
| 956 | - } |
|
| 957 | - } |
|
| 958 | - $select = remplacer_jointnul($t . $alias, $select, $e); |
|
| 959 | - $join = remplacer_jointnul($t, $join, $e); |
|
| 960 | - $where = remplacer_jointnul($t, $where, $e); |
|
| 961 | - $having = remplacer_jointnul($t, $having, $e); |
|
| 962 | - $groupby = remplacer_jointnul($t, $groupby, $e); |
|
| 963 | - $orderby = remplacer_jointnul($t, $orderby, $e); |
|
| 964 | - } |
|
| 965 | - $from = reinjecte_joint($afrom, $from); |
|
| 966 | - } |
|
| 967 | - if (empty($GLOBALS['debug']) or !is_array($GLOBALS['debug'])) { |
|
| 968 | - $wasdebug = empty($GLOBALS['debug']) ? false : $GLOBALS['debug']; |
|
| 969 | - $GLOBALS['debug'] = []; |
|
| 970 | - if ($wasdebug) { |
|
| 971 | - $GLOBALS['debug']['debug'] = true; |
|
| 972 | - } |
|
| 973 | - } |
|
| 974 | - $GLOBALS['debug']['aucasou'] = [$table, $id, $serveur, $requeter]; |
|
| 975 | - $r = sql_select( |
|
| 976 | - $select, |
|
| 977 | - $from, |
|
| 978 | - $where, |
|
| 979 | - $groupby, |
|
| 980 | - array_filter($orderby), |
|
| 981 | - $limit, |
|
| 982 | - $having, |
|
| 983 | - $serveur, |
|
| 984 | - $requeter |
|
| 985 | - ); |
|
| 986 | - unset($GLOBALS['debug']['aucasou']); |
|
| 987 | - |
|
| 988 | - return $r; |
|
| 718 | + // retirer les criteres vides: |
|
| 719 | + // {X ?} avec X absent de l'URL |
|
| 720 | + // {par #ENV{X}} avec X absent de l'URL |
|
| 721 | + // IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil) |
|
| 722 | + $menage = false; |
|
| 723 | + foreach ($where as $k => $v) { |
|
| 724 | + if (is_array($v) and count($v)) { |
|
| 725 | + if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) { |
|
| 726 | + $op = false; |
|
| 727 | + } elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) { |
|
| 728 | + $op = false; |
|
| 729 | + } else { |
|
| 730 | + $op = $v[0] ?: $v; |
|
| 731 | + } |
|
| 732 | + } else { |
|
| 733 | + $op = $v; |
|
| 734 | + } |
|
| 735 | + if ((!$op) or ($op == 1) or ($op == '0=0')) { |
|
| 736 | + unset($where[$k]); |
|
| 737 | + $menage = true; |
|
| 738 | + } |
|
| 739 | + } |
|
| 740 | + |
|
| 741 | + // evacuer les eventuels groupby vide issus d'un calcul dynamique |
|
| 742 | + $groupby = array_diff($groupby, ['']); |
|
| 743 | + |
|
| 744 | + // remplacer les sous requetes recursives au calcul |
|
| 745 | + [$where_simples, $where_sous] = trouver_sous_requetes($where); |
|
| 746 | + foreach ($where_sous as $k => $w) { |
|
| 747 | + $menage = true; |
|
| 748 | + // on recupere la sous requete |
|
| 749 | + $sous = match_self($w); |
|
| 750 | + if ($sous[0] == 'SELF') { |
|
| 751 | + // c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where) |
|
| 752 | + array_push($where_simples, $sous[2]); |
|
| 753 | + $wheresub = [ |
|
| 754 | + $sous[2], |
|
| 755 | + '0=0' |
|
| 756 | + ]; // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where |
|
| 757 | + $jsub = $join; |
|
| 758 | + // trouver les jointures utiles a |
|
| 759 | + // reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees |
|
| 760 | + // ie L1.objet='article' |
|
| 761 | + // on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction |
|
| 762 | + $i = 0; |
|
| 763 | + do { |
|
| 764 | + $where[$k] = remplace_sous_requete($w, '(' . calculer_select( |
|
| 765 | + [$sous[1] . ' AS id'], |
|
| 766 | + $from, |
|
| 767 | + $from_type, |
|
| 768 | + $wheresub, |
|
| 769 | + $jsub, |
|
| 770 | + [], |
|
| 771 | + [], |
|
| 772 | + '', |
|
| 773 | + $having, |
|
| 774 | + $table, |
|
| 775 | + $id, |
|
| 776 | + $serveur, |
|
| 777 | + false |
|
| 778 | + ) . ')'); |
|
| 779 | + if (!$i) { |
|
| 780 | + $i = 1; |
|
| 781 | + $wherestring = calculer_where_to_string($where[$k]); |
|
| 782 | + foreach ($join as $cle => $wj) { |
|
| 783 | + if ( |
|
| 784 | + (is_countable($wj) ? count($wj) : 0) == 4 |
|
| 785 | + and str_contains($wherestring, (string) "{$cle}.") |
|
| 786 | + ) { |
|
| 787 | + $i = 0; |
|
| 788 | + $wheresub[] = $wj[3]; |
|
| 789 | + unset($jsub[$cle][3]); |
|
| 790 | + } |
|
| 791 | + } |
|
| 792 | + } |
|
| 793 | + } while ($i++ < 1); |
|
| 794 | + } |
|
| 795 | + if ($sous[0] == 'SUBSELECT') { |
|
| 796 | + // c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having) |
|
| 797 | + array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ? |
|
| 798 | + $where[$k] = remplace_sous_requete($w, '(' . calculer_select( |
|
| 799 | + $sous[1], # select |
|
| 800 | + $sous[2], #from |
|
| 801 | + [], #from_type |
|
| 802 | + $sous[3] ? (is_array($sous[3]) ? $sous[3] : [$sous[3]]) : [], |
|
| 803 | + #where, qui peut etre de la forme string comme dans sql_select |
|
| 804 | + [], #join |
|
| 805 | + $sous[4] ?: [], #groupby |
|
| 806 | + $sous[5] ?: [], #orderby |
|
| 807 | + $sous[6], #limit |
|
| 808 | + $sous[7] ?: [], #having |
|
| 809 | + $table, |
|
| 810 | + $id, |
|
| 811 | + $serveur, |
|
| 812 | + false |
|
| 813 | + ) . ')'); |
|
| 814 | + } |
|
| 815 | + array_pop($where_simples); |
|
| 816 | + } |
|
| 817 | + |
|
| 818 | + foreach ($having as $k => $v) { |
|
| 819 | + if ((!$v) or ($v == 1) or ($v == '0=0')) { |
|
| 820 | + unset($having[$k]); |
|
| 821 | + } |
|
| 822 | + } |
|
| 823 | + |
|
| 824 | + // Installer les jointures. |
|
| 825 | + // Retirer celles seulement utiles aux criteres finalement absents mais |
|
| 826 | + // parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln |
|
| 827 | + // si elle est seulement utile a Ln+1 elle meme inutile |
|
| 828 | + |
|
| 829 | + $afrom = []; |
|
| 830 | + $equiv = []; |
|
| 831 | + $k = count($join); |
|
| 832 | + foreach (array_reverse($join, true) as $cledef => $j) { |
|
| 833 | + $cle = $cledef; |
|
| 834 | + // le format de join est : |
|
| 835 | + // array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]]) |
|
| 836 | + $join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber |
|
| 837 | + if (count($join[$cle]) == 2) { |
|
| 838 | + $join[$cle][] = $join[$cle][1]; |
|
| 839 | + } |
|
| 840 | + if ((is_array($join[$cle]) || $join[$cle] instanceof \Countable ? count($join[$cle]) : 0) == 3) { |
|
| 841 | + $join[$cle][] = ''; |
|
| 842 | + } |
|
| 843 | + [$t, $c, $carr, $and] = $join[$cle]; |
|
| 844 | + // si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste |
|
| 845 | + // pour compat avec ancienne convention |
|
| 846 | + if (is_numeric($cle)) { |
|
| 847 | + $cle = "L$k"; |
|
| 848 | + } |
|
| 849 | + $cle_where_lie = "JOIN-$cle"; |
|
| 850 | + if ( |
|
| 851 | + !$menage |
|
| 852 | + or isset($afrom[$cle]) |
|
| 853 | + or calculer_jointnul($cle, $select) |
|
| 854 | + or calculer_jointnul($cle, array_diff_key($join, [$cle => $join[$cle]])) |
|
| 855 | + or calculer_jointnul($cle, $having) |
|
| 856 | + or calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => ''])) |
|
| 857 | + ) { |
|
| 858 | + // corriger les references non explicites dans select |
|
| 859 | + // ou groupby |
|
| 860 | + foreach ($select as $i => $s) { |
|
| 861 | + if ($s == $c) { |
|
| 862 | + $select[$i] = "$cle.$c AS $c"; |
|
| 863 | + break; |
|
| 864 | + } |
|
| 865 | + } |
|
| 866 | + foreach ($groupby as $i => $g) { |
|
| 867 | + if ($g == $c) { |
|
| 868 | + $groupby[$i] = "$cle.$c"; |
|
| 869 | + break; |
|
| 870 | + } |
|
| 871 | + } |
|
| 872 | + // on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin |
|
| 873 | + // sans recours a preg_match |
|
| 874 | + // un implode(' ',..) est fait dans reinjecte_joint un peu plus bas |
|
| 875 | + $afrom[$t][$cle] = [ |
|
| 876 | + "\n" . |
|
| 877 | + ($from_type[$cle] ?? 'INNER') . ' JOIN', |
|
| 878 | + $from[$cle], |
|
| 879 | + "AS $cle", |
|
| 880 | + 'ON (', |
|
| 881 | + "$cle.$c", |
|
| 882 | + '=', |
|
| 883 | + "$t.$carr", |
|
| 884 | + ($and ? 'AND ' . $and : '') . |
|
| 885 | + ')' |
|
| 886 | + ]; |
|
| 887 | + if (isset($afrom[$cle])) { |
|
| 888 | + $afrom[$t] = $afrom[$t] + $afrom[$cle]; |
|
| 889 | + unset($afrom[$cle]); |
|
| 890 | + } |
|
| 891 | + $equiv[] = $carr; |
|
| 892 | + } else { |
|
| 893 | + unset($join[$cledef]); |
|
| 894 | + if (isset($where_simples[$cle_where_lie])) { |
|
| 895 | + unset($where_simples[$cle_where_lie]); |
|
| 896 | + unset($where[$cle_where_lie]); |
|
| 897 | + } |
|
| 898 | + } |
|
| 899 | + unset($from[$cle]); |
|
| 900 | + $k--; |
|
| 901 | + } |
|
| 902 | + |
|
| 903 | + if (count($afrom)) { |
|
| 904 | + // Regarder si la table principale ne sert finalement a rien comme dans |
|
| 905 | + //<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3> |
|
| 906 | + //<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2> |
|
| 907 | + //<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5> |
|
| 908 | + // ou dans |
|
| 909 | + //<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8> |
|
| 910 | + // qui comporte plusieurs jointures |
|
| 911 | + // ou dans |
|
| 912 | + // <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6> |
|
| 913 | + // <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7> |
|
| 914 | + // penser a regarder aussi la clause orderby pour ne pas simplifier abusivement |
|
| 915 | + // <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9> |
|
| 916 | + // penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement |
|
| 917 | + // <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10> |
|
| 918 | + |
|
| 919 | + $t = key($from); |
|
| 920 | + $c = current($from); |
|
| 921 | + reset($from); |
|
| 922 | + $e = '/\b(' . "$t\\." . join('|' . $t . '\.', $equiv) . ')\b/'; |
|
| 923 | + if ( |
|
| 924 | + !(strpos($t, ' ') or // jointure des le depart cf boucle_doc |
|
| 925 | + calculer_jointnul($t, $select, $e) or |
|
| 926 | + calculer_jointnul($t, $join, $e) or |
|
| 927 | + calculer_jointnul($t, $where, $e) or |
|
| 928 | + calculer_jointnul($t, $orderby, $e) or |
|
| 929 | + calculer_jointnul($t, $groupby, $e) or |
|
| 930 | + calculer_jointnul($t, $having, $e)) |
|
| 931 | + && count($afrom[$t]) |
|
| 932 | + ) { |
|
| 933 | + $nfrom = reset($afrom[$t]); |
|
| 934 | + $nt = array_key_first($afrom[$t]); |
|
| 935 | + unset($from[$t]); |
|
| 936 | + $from[$nt] = $nfrom[1]; |
|
| 937 | + unset($afrom[$t][$nt]); |
|
| 938 | + $afrom[$nt] = $afrom[$t]; |
|
| 939 | + unset($afrom[$t]); |
|
| 940 | + $e = '/\b' . preg_quote($nfrom[6]) . '\b/'; |
|
| 941 | + $t = $nfrom[4]; |
|
| 942 | + $alias = ''; |
|
| 943 | + // verifier que les deux cles sont homonymes, sinon installer un alias dans le select |
|
| 944 | + $oldcle = explode('.', $nfrom[6]); |
|
| 945 | + $oldcle = end($oldcle); |
|
| 946 | + $newcle = explode('.', $nfrom[4]); |
|
| 947 | + $newcle = end($newcle); |
|
| 948 | + if ($newcle != $oldcle) { |
|
| 949 | + // si l'ancienne cle etait deja dans le select avec un AS |
|
| 950 | + // reprendre simplement ce AS |
|
| 951 | + $as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/'; |
|
| 952 | + if (preg_match($as, implode(',', $select), $m)) { |
|
| 953 | + $alias = ''; |
|
| 954 | + } else { |
|
| 955 | + $alias = ', ' . $nfrom[4] . " AS $oldcle"; |
|
| 956 | + } |
|
| 957 | + } |
|
| 958 | + $select = remplacer_jointnul($t . $alias, $select, $e); |
|
| 959 | + $join = remplacer_jointnul($t, $join, $e); |
|
| 960 | + $where = remplacer_jointnul($t, $where, $e); |
|
| 961 | + $having = remplacer_jointnul($t, $having, $e); |
|
| 962 | + $groupby = remplacer_jointnul($t, $groupby, $e); |
|
| 963 | + $orderby = remplacer_jointnul($t, $orderby, $e); |
|
| 964 | + } |
|
| 965 | + $from = reinjecte_joint($afrom, $from); |
|
| 966 | + } |
|
| 967 | + if (empty($GLOBALS['debug']) or !is_array($GLOBALS['debug'])) { |
|
| 968 | + $wasdebug = empty($GLOBALS['debug']) ? false : $GLOBALS['debug']; |
|
| 969 | + $GLOBALS['debug'] = []; |
|
| 970 | + if ($wasdebug) { |
|
| 971 | + $GLOBALS['debug']['debug'] = true; |
|
| 972 | + } |
|
| 973 | + } |
|
| 974 | + $GLOBALS['debug']['aucasou'] = [$table, $id, $serveur, $requeter]; |
|
| 975 | + $r = sql_select( |
|
| 976 | + $select, |
|
| 977 | + $from, |
|
| 978 | + $where, |
|
| 979 | + $groupby, |
|
| 980 | + array_filter($orderby), |
|
| 981 | + $limit, |
|
| 982 | + $having, |
|
| 983 | + $serveur, |
|
| 984 | + $requeter |
|
| 985 | + ); |
|
| 986 | + unset($GLOBALS['debug']['aucasou']); |
|
| 987 | + |
|
| 988 | + return $r; |
|
| 989 | 989 | } |
| 990 | 990 | |
| 991 | 991 | /** |
@@ -996,79 +996,79 @@ discard block |
||
| 996 | 996 | * @return string |
| 997 | 997 | */ |
| 998 | 998 | function calculer_where_to_string($v, $join = 'AND') { |
| 999 | - if (empty($v)) { |
|
| 1000 | - return ''; |
|
| 1001 | - } |
|
| 1002 | - |
|
| 1003 | - if (!is_array($v)) { |
|
| 1004 | - return $v; |
|
| 1005 | - } else { |
|
| 1006 | - $exp = ''; |
|
| 1007 | - if (strtoupper($join) === 'AND') { |
|
| 1008 | - return $exp . join(" $join ", array_map('calculer_where_to_string', $v)); |
|
| 1009 | - } else { |
|
| 1010 | - return $exp . join($join, $v); |
|
| 1011 | - } |
|
| 1012 | - } |
|
| 999 | + if (empty($v)) { |
|
| 1000 | + return ''; |
|
| 1001 | + } |
|
| 1002 | + |
|
| 1003 | + if (!is_array($v)) { |
|
| 1004 | + return $v; |
|
| 1005 | + } else { |
|
| 1006 | + $exp = ''; |
|
| 1007 | + if (strtoupper($join) === 'AND') { |
|
| 1008 | + return $exp . join(" $join ", array_map('calculer_where_to_string', $v)); |
|
| 1009 | + } else { |
|
| 1010 | + return $exp . join($join, $v); |
|
| 1011 | + } |
|
| 1012 | + } |
|
| 1013 | 1013 | } |
| 1014 | 1014 | |
| 1015 | 1015 | |
| 1016 | 1016 | //condition suffisante (mais non necessaire) pour qu'une table soit utile |
| 1017 | 1017 | |
| 1018 | 1018 | function calculer_jointnul($cle, $exp, $equiv = '') { |
| 1019 | - if (!is_array($exp)) { |
|
| 1020 | - if ($equiv) { |
|
| 1021 | - $exp = preg_replace($equiv, '', $exp); |
|
| 1022 | - } |
|
| 1023 | - |
|
| 1024 | - return preg_match("/\\b$cle\\./", $exp); |
|
| 1025 | - } else { |
|
| 1026 | - foreach ($exp as $v) { |
|
| 1027 | - if (calculer_jointnul($cle, $v, $equiv)) { |
|
| 1028 | - return true; |
|
| 1029 | - } |
|
| 1030 | - } |
|
| 1031 | - |
|
| 1032 | - return false; |
|
| 1033 | - } |
|
| 1019 | + if (!is_array($exp)) { |
|
| 1020 | + if ($equiv) { |
|
| 1021 | + $exp = preg_replace($equiv, '', $exp); |
|
| 1022 | + } |
|
| 1023 | + |
|
| 1024 | + return preg_match("/\\b$cle\\./", $exp); |
|
| 1025 | + } else { |
|
| 1026 | + foreach ($exp as $v) { |
|
| 1027 | + if (calculer_jointnul($cle, $v, $equiv)) { |
|
| 1028 | + return true; |
|
| 1029 | + } |
|
| 1030 | + } |
|
| 1031 | + |
|
| 1032 | + return false; |
|
| 1033 | + } |
|
| 1034 | 1034 | } |
| 1035 | 1035 | |
| 1036 | 1036 | function reinjecte_joint($afrom, $from) { |
| 1037 | - $from_synth = []; |
|
| 1038 | - foreach ($from as $k => $v) { |
|
| 1039 | - $from_synth[$k] = $from[$k]; |
|
| 1040 | - if (isset($afrom[$k])) { |
|
| 1041 | - foreach ($afrom[$k] as $kk => $vv) { |
|
| 1042 | - $afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]); |
|
| 1043 | - } |
|
| 1044 | - $from_synth["$k@"] = implode(' ', $afrom[$k]); |
|
| 1045 | - unset($afrom[$k]); |
|
| 1046 | - } |
|
| 1047 | - } |
|
| 1048 | - |
|
| 1049 | - return $from_synth; |
|
| 1037 | + $from_synth = []; |
|
| 1038 | + foreach ($from as $k => $v) { |
|
| 1039 | + $from_synth[$k] = $from[$k]; |
|
| 1040 | + if (isset($afrom[$k])) { |
|
| 1041 | + foreach ($afrom[$k] as $kk => $vv) { |
|
| 1042 | + $afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]); |
|
| 1043 | + } |
|
| 1044 | + $from_synth["$k@"] = implode(' ', $afrom[$k]); |
|
| 1045 | + unset($afrom[$k]); |
|
| 1046 | + } |
|
| 1047 | + } |
|
| 1048 | + |
|
| 1049 | + return $from_synth; |
|
| 1050 | 1050 | } |
| 1051 | 1051 | |
| 1052 | 1052 | function remplacer_jointnul($cle, $exp, $equiv = '') { |
| 1053 | - if (!is_array($exp)) { |
|
| 1054 | - return preg_replace($equiv, $cle, $exp); |
|
| 1055 | - } else { |
|
| 1056 | - foreach ($exp as $k => $v) { |
|
| 1057 | - $exp[$k] = remplacer_jointnul($cle, $v, $equiv); |
|
| 1058 | - } |
|
| 1059 | - |
|
| 1060 | - return $exp; |
|
| 1061 | - } |
|
| 1053 | + if (!is_array($exp)) { |
|
| 1054 | + return preg_replace($equiv, $cle, $exp); |
|
| 1055 | + } else { |
|
| 1056 | + foreach ($exp as $k => $v) { |
|
| 1057 | + $exp[$k] = remplacer_jointnul($cle, $v, $equiv); |
|
| 1058 | + } |
|
| 1059 | + |
|
| 1060 | + return $exp; |
|
| 1061 | + } |
|
| 1062 | 1062 | } |
| 1063 | 1063 | |
| 1064 | 1064 | // calcul du nom du squelette |
| 1065 | 1065 | function calculer_nom_fonction_squel($skel, $mime_type = 'html', string $connect = '') { |
| 1066 | - // ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine |
|
| 1067 | - if ($l = strlen(_DIR_RACINE) and strncmp($skel, _DIR_RACINE, $l) == 0) { |
|
| 1068 | - $skel = substr($skel, strlen(_DIR_RACINE)); |
|
| 1069 | - } |
|
| 1070 | - |
|
| 1071 | - return $mime_type |
|
| 1072 | - . (!$connect ? '' : preg_replace('/\W/', '_', $connect)) . '_' |
|
| 1073 | - . md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : '')); |
|
| 1066 | + // ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine |
|
| 1067 | + if ($l = strlen(_DIR_RACINE) and strncmp($skel, _DIR_RACINE, $l) == 0) { |
|
| 1068 | + $skel = substr($skel, strlen(_DIR_RACINE)); |
|
| 1069 | + } |
|
| 1070 | + |
|
| 1071 | + return $mime_type |
|
| 1072 | + . (!$connect ? '' : preg_replace('/\W/', '_', $connect)) . '_' |
|
| 1073 | + . md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : '')); |
|
| 1074 | 1074 | } |
@@ -53,7 +53,7 @@ discard block |
||
| 53 | 53 | $GLOBALS['debug_objets']['courant'] = $nom; |
| 54 | 54 | } |
| 55 | 55 | |
| 56 | - $phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php'; |
|
| 56 | + $phpfile = sous_repertoire(_DIR_SKELS, '', false, true).$nom.'.php'; |
|
| 57 | 57 | |
| 58 | 58 | // si squelette est deja compile et perenne, le charger |
| 59 | 59 | if (!squelette_obsolete($phpfile, $source)) { |
@@ -66,7 +66,7 @@ discard block |
||
| 66 | 66 | #} |
| 67 | 67 | } |
| 68 | 68 | |
| 69 | - if (file_exists($lib = $squelette . '_fonctions' . '.php')) { |
|
| 69 | + if (file_exists($lib = $squelette.'_fonctions'.'.php')) { |
|
| 70 | 70 | include_once $lib; |
| 71 | 71 | } |
| 72 | 72 | |
@@ -94,7 +94,7 @@ discard block |
||
| 94 | 94 | eval("return true; $f ;"); |
| 95 | 95 | } catch (\ParseError $e) { |
| 96 | 96 | // Code syntaxiquement faux (critere etc mal programme') |
| 97 | - $msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage(); |
|
| 97 | + $msg = _T('zbug_erreur_compilation').' | Line '.$e->getLine().' : '.$e->getMessage(); |
|
| 98 | 98 | erreur_squelette($msg, $boucle); |
| 99 | 99 | // continuer pour trouver d'autres fautes eventuelles |
| 100 | 100 | // mais prevenir que c'est mort |
@@ -122,7 +122,7 @@ discard block |
||
| 122 | 122 | |
| 123 | 123 | if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
| 124 | 124 | // Tracer ce qui vient d'etre compile |
| 125 | - $GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code; |
|
| 125 | + $GLOBALS['debug_objets']['code'][$nom.'tout'] = $code; |
|
| 126 | 126 | |
| 127 | 127 | // si c'est ce que demande le debusqueur, lui passer la main |
| 128 | 128 | if ( |
@@ -146,13 +146,13 @@ discard block |
||
| 146 | 146 | $code = " |
| 147 | 147 | /* |
| 148 | 148 | * Squelette : $sourcefile |
| 149 | - * Date : " . gmdate('D, d M Y H:i:s', @filemtime($sourcefile)) . ' GMT |
|
| 150 | - * Compile : ' . gmdate('D, d M Y H:i:s', time()) . ' GMT |
|
| 151 | - * ' . (!$boucles ? 'Pas de boucle' : ('Boucles : ' . $noms)) . ' |
|
| 149 | + * Date : ".gmdate('D, d M Y H:i:s', @filemtime($sourcefile)).' GMT |
|
| 150 | + * Compile : ' . gmdate('D, d M Y H:i:s', time()).' GMT |
|
| 151 | + * ' . (!$boucles ? 'Pas de boucle' : ('Boucles : '.$noms)).' |
|
| 152 | 152 | */ '; |
| 153 | 153 | } |
| 154 | 154 | |
| 155 | - $code = '<' . "?php\n" . $code . join('', $boucles) . "\n"; |
|
| 155 | + $code = '<'."?php\n".$code.join('', $boucles)."\n"; |
|
| 156 | 156 | if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) { |
| 157 | 157 | ecrire_fichier($phpfile, $code); |
| 158 | 158 | } |
@@ -214,18 +214,18 @@ discard block |
||
| 214 | 214 | $j = join('-', array_map('ucwords', explode('-', strtolower($r[2])))); |
| 215 | 215 | |
| 216 | 216 | if ($j == 'X-Spip-Filtre' and isset($headers[$j])) { |
| 217 | - $headers[$j] .= '|' . $r[3]; |
|
| 217 | + $headers[$j] .= '|'.$r[3]; |
|
| 218 | 218 | } else { |
| 219 | - $headers[$j] = str_replace(['\\\\',"\\'",'\\"'], ['\\',"'",'"'], $r[3]); |
|
| 219 | + $headers[$j] = str_replace(['\\\\', "\\'", '\\"'], ['\\', "'", '"'], $r[3]); |
|
| 220 | 220 | } |
| 221 | 221 | } |
| 222 | 222 | } |
| 223 | 223 | // S'agit-il d'un resultat constant ou contenant du code php |
| 224 | 224 | $process_ins = ( |
| 225 | - strpos($corps, '<' . '?') === false |
|
| 225 | + strpos($corps, '<'.'?') === false |
|
| 226 | 226 | or |
| 227 | - (strpos($corps, '<' . '?xml') !== false and |
|
| 228 | - strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) |
|
| 227 | + (strpos($corps, '<'.'?xml') !== false and |
|
| 228 | + strpos(str_replace('<'.'?xml', '', $corps), '<'.'?') === false) |
|
| 229 | 229 | ) |
| 230 | 230 | ? 'html' |
| 231 | 231 | : 'php'; |
@@ -254,10 +254,10 @@ discard block |
||
| 254 | 254 | |
| 255 | 255 | if ($process_ins == 'html') { |
| 256 | 256 | $skel['process_ins'] = ( |
| 257 | - strpos($corps, '<' . '?') === false |
|
| 257 | + strpos($corps, '<'.'?') === false |
|
| 258 | 258 | or |
| 259 | - (strpos($corps, '<' . '?xml') !== false and |
|
| 260 | - strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) |
|
| 259 | + (strpos($corps, '<'.'?xml') !== false and |
|
| 260 | + strpos(str_replace('<'.'?xml', '', $corps), '<'.'?') === false) |
|
| 261 | 261 | ) |
| 262 | 262 | ? 'html' |
| 263 | 263 | : 'php'; |
@@ -275,7 +275,7 @@ discard block |
||
| 275 | 275 | // |
| 276 | 276 | |
| 277 | 277 | /** Code PHP pour inclure une balise dynamique à l'exécution d'une page */ |
| 278 | -define('CODE_INCLURE_BALISE', '<' . '?php |
|
| 278 | +define('CODE_INCLURE_BALISE', '<'.'?php |
|
| 279 | 279 | include_once("%s"); |
| 280 | 280 | if ($lang_select = "%s") $lang_select = lang_select($lang_select); |
| 281 | 281 | inserer_balise_dynamique(balise_%s_dyn(%s), array(%s)); |
@@ -306,7 +306,7 @@ discard block |
||
| 306 | 306 | // pas de lien symbolique sous Windows |
| 307 | 307 | and !(stristr(PHP_OS, 'WIN') and str_contains($file, ':')) |
| 308 | 308 | ) { |
| 309 | - $file = './" . _DIR_RACINE . "' . $file; |
|
| 309 | + $file = './" . _DIR_RACINE . "'.$file; |
|
| 310 | 310 | } |
| 311 | 311 | |
| 312 | 312 | $lang = $context_compil[4]; |
@@ -316,7 +316,7 @@ discard block |
||
| 316 | 316 | |
| 317 | 317 | $args = array_map('argumenter_squelette', $args); |
| 318 | 318 | if (!empty($context_compil['appel_php_depuis_modele'])) { |
| 319 | - $args[0] = 'arguments_balise_dyn_depuis_modele(' . $args[0] . ')'; |
|
| 319 | + $args[0] = 'arguments_balise_dyn_depuis_modele('.$args[0].')'; |
|
| 320 | 320 | } |
| 321 | 321 | $args = join(', ', $args); |
| 322 | 322 | |
@@ -350,14 +350,14 @@ discard block |
||
| 350 | 350 | if (is_object($v)) { |
| 351 | 351 | return var_export($v, true); |
| 352 | 352 | } elseif (!is_array($v)) { |
| 353 | - return "'" . texte_script((string) $v) . "'"; |
|
| 353 | + return "'".texte_script((string) $v)."'"; |
|
| 354 | 354 | } else { |
| 355 | 355 | $out = []; |
| 356 | 356 | foreach ($v as $k => $val) { |
| 357 | - $out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val); |
|
| 357 | + $out [] = argumenter_squelette($k).'=>'.argumenter_squelette($val); |
|
| 358 | 358 | } |
| 359 | 359 | |
| 360 | - return 'array(' . join(', ', $out) . ')'; |
|
| 360 | + return 'array('.join(', ', $out).')'; |
|
| 361 | 361 | } |
| 362 | 362 | } |
| 363 | 363 | |
@@ -382,7 +382,7 @@ discard block |
||
| 382 | 382 | } |
| 383 | 383 | else { |
| 384 | 384 | $str_args = base64_encode(serialize($args)); |
| 385 | - return '<?' . "php \$_zargs=unserialize(base64_decode('$str_args'));echo executer_balise_dynamique(...\$_zargs); ?" . ">\n"; |
|
| 385 | + return '<?'."php \$_zargs=unserialize(base64_decode('$str_args'));echo executer_balise_dynamique(...\$_zargs); ?".">\n"; |
|
| 386 | 386 | } |
| 387 | 387 | } |
| 388 | 388 | |
@@ -460,7 +460,7 @@ discard block |
||
| 460 | 460 | } |
| 461 | 461 | |
| 462 | 462 | // Y a-t-il une fonction de traitement des arguments ? |
| 463 | - $f = 'balise_' . $nom_balise . '_stat'; |
|
| 463 | + $f = 'balise_'.$nom_balise.'_stat'; |
|
| 464 | 464 | |
| 465 | 465 | $r = !function_exists($f) ? $args : $f($args, $context_compil); |
| 466 | 466 | |
@@ -470,18 +470,18 @@ discard block |
||
| 470 | 470 | |
| 471 | 471 | // verifier que la fonction dyn est la, |
| 472 | 472 | // sinon se replier sur la generique si elle existe |
| 473 | - if (!function_exists('balise_' . $nom_balise . '_dyn')) { |
|
| 473 | + if (!function_exists('balise_'.$nom_balise.'_dyn')) { |
|
| 474 | 474 | if ( |
| 475 | 475 | $balise_generique = chercher_balise_generique($nom) |
| 476 | 476 | and $nom_balise_generique = $balise_generique['nom_generique'] |
| 477 | - and $file = include_spip('balise/' . strtolower($nom_balise_generique)) |
|
| 478 | - and function_exists('balise_' . $nom_balise_generique . '_dyn') |
|
| 477 | + and $file = include_spip('balise/'.strtolower($nom_balise_generique)) |
|
| 478 | + and function_exists('balise_'.$nom_balise_generique.'_dyn') |
|
| 479 | 479 | ) { |
| 480 | 480 | // et lui injecter en premier arg le nom de la balise |
| 481 | 481 | array_unshift($r, $nom); |
| 482 | 482 | $nom_balise = $nom_balise_generique; |
| 483 | 483 | if (!_DIR_RESTREINT) { |
| 484 | - $file = _DIR_RESTREINT_ABS . $file; |
|
| 484 | + $file = _DIR_RESTREINT_ABS.$file; |
|
| 485 | 485 | } |
| 486 | 486 | } else { |
| 487 | 487 | $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]]; |
@@ -582,7 +582,7 @@ discard block |
||
| 582 | 582 | $n = ''; |
| 583 | 583 | foreach (explode(',', $liste) as $val) { |
| 584 | 584 | if ($a = intval($val) and $val === strval($a)) { |
| 585 | - $n .= ',' . $val; |
|
| 585 | + $n .= ','.$val; |
|
| 586 | 586 | } |
| 587 | 587 | } |
| 588 | 588 | if (strlen($n)) { |
@@ -761,8 +761,8 @@ discard block |
||
| 761 | 761 | // on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction |
| 762 | 762 | $i = 0; |
| 763 | 763 | do { |
| 764 | - $where[$k] = remplace_sous_requete($w, '(' . calculer_select( |
|
| 765 | - [$sous[1] . ' AS id'], |
|
| 764 | + $where[$k] = remplace_sous_requete($w, '('.calculer_select( |
|
| 765 | + [$sous[1].' AS id'], |
|
| 766 | 766 | $from, |
| 767 | 767 | $from_type, |
| 768 | 768 | $wheresub, |
@@ -775,7 +775,7 @@ discard block |
||
| 775 | 775 | $id, |
| 776 | 776 | $serveur, |
| 777 | 777 | false |
| 778 | - ) . ')'); |
|
| 778 | + ).')'); |
|
| 779 | 779 | if (!$i) { |
| 780 | 780 | $i = 1; |
| 781 | 781 | $wherestring = calculer_where_to_string($where[$k]); |
@@ -795,7 +795,7 @@ discard block |
||
| 795 | 795 | if ($sous[0] == 'SUBSELECT') { |
| 796 | 796 | // c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having) |
| 797 | 797 | array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ? |
| 798 | - $where[$k] = remplace_sous_requete($w, '(' . calculer_select( |
|
| 798 | + $where[$k] = remplace_sous_requete($w, '('.calculer_select( |
|
| 799 | 799 | $sous[1], # select |
| 800 | 800 | $sous[2], #from |
| 801 | 801 | [], #from_type |
@@ -810,7 +810,7 @@ discard block |
||
| 810 | 810 | $id, |
| 811 | 811 | $serveur, |
| 812 | 812 | false |
| 813 | - ) . ')'); |
|
| 813 | + ).')'); |
|
| 814 | 814 | } |
| 815 | 815 | array_pop($where_simples); |
| 816 | 816 | } |
@@ -873,15 +873,15 @@ discard block |
||
| 873 | 873 | // sans recours a preg_match |
| 874 | 874 | // un implode(' ',..) est fait dans reinjecte_joint un peu plus bas |
| 875 | 875 | $afrom[$t][$cle] = [ |
| 876 | - "\n" . |
|
| 877 | - ($from_type[$cle] ?? 'INNER') . ' JOIN', |
|
| 876 | + "\n". |
|
| 877 | + ($from_type[$cle] ?? 'INNER').' JOIN', |
|
| 878 | 878 | $from[$cle], |
| 879 | 879 | "AS $cle", |
| 880 | 880 | 'ON (', |
| 881 | 881 | "$cle.$c", |
| 882 | 882 | '=', |
| 883 | 883 | "$t.$carr", |
| 884 | - ($and ? 'AND ' . $and : '') . |
|
| 884 | + ($and ? 'AND '.$and : ''). |
|
| 885 | 885 | ')' |
| 886 | 886 | ]; |
| 887 | 887 | if (isset($afrom[$cle])) { |
@@ -919,7 +919,7 @@ discard block |
||
| 919 | 919 | $t = key($from); |
| 920 | 920 | $c = current($from); |
| 921 | 921 | reset($from); |
| 922 | - $e = '/\b(' . "$t\\." . join('|' . $t . '\.', $equiv) . ')\b/'; |
|
| 922 | + $e = '/\b('."$t\\.".join('|'.$t.'\.', $equiv).')\b/'; |
|
| 923 | 923 | if ( |
| 924 | 924 | !(strpos($t, ' ') or // jointure des le depart cf boucle_doc |
| 925 | 925 | calculer_jointnul($t, $select, $e) or |
@@ -937,7 +937,7 @@ discard block |
||
| 937 | 937 | unset($afrom[$t][$nt]); |
| 938 | 938 | $afrom[$nt] = $afrom[$t]; |
| 939 | 939 | unset($afrom[$t]); |
| 940 | - $e = '/\b' . preg_quote($nfrom[6]) . '\b/'; |
|
| 940 | + $e = '/\b'.preg_quote($nfrom[6]).'\b/'; |
|
| 941 | 941 | $t = $nfrom[4]; |
| 942 | 942 | $alias = ''; |
| 943 | 943 | // verifier que les deux cles sont homonymes, sinon installer un alias dans le select |
@@ -948,14 +948,14 @@ discard block |
||
| 948 | 948 | if ($newcle != $oldcle) { |
| 949 | 949 | // si l'ancienne cle etait deja dans le select avec un AS |
| 950 | 950 | // reprendre simplement ce AS |
| 951 | - $as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/'; |
|
| 951 | + $as = '/\b'.preg_quote($nfrom[6]).'\s+(AS\s+\w+)\b/'; |
|
| 952 | 952 | if (preg_match($as, implode(',', $select), $m)) { |
| 953 | 953 | $alias = ''; |
| 954 | 954 | } else { |
| 955 | - $alias = ', ' . $nfrom[4] . " AS $oldcle"; |
|
| 955 | + $alias = ', '.$nfrom[4]." AS $oldcle"; |
|
| 956 | 956 | } |
| 957 | 957 | } |
| 958 | - $select = remplacer_jointnul($t . $alias, $select, $e); |
|
| 958 | + $select = remplacer_jointnul($t.$alias, $select, $e); |
|
| 959 | 959 | $join = remplacer_jointnul($t, $join, $e); |
| 960 | 960 | $where = remplacer_jointnul($t, $where, $e); |
| 961 | 961 | $having = remplacer_jointnul($t, $having, $e); |
@@ -1005,9 +1005,9 @@ discard block |
||
| 1005 | 1005 | } else { |
| 1006 | 1006 | $exp = ''; |
| 1007 | 1007 | if (strtoupper($join) === 'AND') { |
| 1008 | - return $exp . join(" $join ", array_map('calculer_where_to_string', $v)); |
|
| 1008 | + return $exp.join(" $join ", array_map('calculer_where_to_string', $v)); |
|
| 1009 | 1009 | } else { |
| 1010 | - return $exp . join($join, $v); |
|
| 1010 | + return $exp.join($join, $v); |
|
| 1011 | 1011 | } |
| 1012 | 1012 | } |
| 1013 | 1013 | } |
@@ -1069,6 +1069,6 @@ discard block |
||
| 1069 | 1069 | } |
| 1070 | 1070 | |
| 1071 | 1071 | return $mime_type |
| 1072 | - . (!$connect ? '' : preg_replace('/\W/', '_', $connect)) . '_' |
|
| 1073 | - . md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : '')); |
|
| 1072 | + . (!$connect ? '' : preg_replace('/\W/', '_', $connect)).'_' |
|
| 1073 | + . md5($GLOBALS['spip_version_code'].' * '.$skel.(isset($GLOBALS['marqueur_skel']) ? '*'.$GLOBALS['marqueur_skel'] : '')); |
|
| 1074 | 1074 | } |
@@ -379,8 +379,7 @@ |
||
| 379 | 379 | function executer_balise_dynamique_dans_un_modele(...$args) { |
| 380 | 380 | if (test_espace_prive()) { |
| 381 | 381 | return executer_balise_dynamique(...$args); |
| 382 | - } |
|
| 383 | - else { |
|
| 382 | + } else { |
|
| 384 | 383 | $str_args = base64_encode(serialize($args)); |
| 385 | 384 | return '<?' . "php \$_zargs=unserialize(base64_decode('$str_args'));echo executer_balise_dynamique(...\$_zargs); ?" . ">\n"; |
| 386 | 385 | } |
@@ -126,7 +126,7 @@ discard block |
||
| 126 | 126 | $select = true |
| 127 | 127 | ) { |
| 128 | 128 | if (!is_string($defaut)) { |
| 129 | - $defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)'; |
|
| 129 | + $defaut = '($Pile[0][\''.strtolower($nom_champ).'\'] ?? null)'; |
|
| 130 | 130 | } |
| 131 | 131 | |
| 132 | 132 | $idb_origine = $idb; |
@@ -159,7 +159,7 @@ discard block |
||
| 159 | 159 | } |
| 160 | 160 | // renseigner la boucle source de ce champ pour les traitements |
| 161 | 161 | $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb; |
| 162 | - $champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']'; |
|
| 162 | + $champ = '$Pile[$SP'.($i ? "-$i" : '').'][\''.$c.'\']'; |
|
| 163 | 163 | if (!$joker) { |
| 164 | 164 | return index_compose($conditionnel, $champ); |
| 165 | 165 | } |
@@ -200,7 +200,7 @@ discard block |
||
| 200 | 200 | function index_compose($conditionnel, $defaut) { |
| 201 | 201 | while ($c = array_pop($conditionnel)) { |
| 202 | 202 | // si on passe defaut = '', ne pas générer d'erreur de compilation. |
| 203 | - $defaut = "($c:(" . ($defaut ?: "''") . '))'; |
|
| 203 | + $defaut = "($c:(".($defaut ?: "''").'))'; |
|
| 204 | 204 | } |
| 205 | 205 | |
| 206 | 206 | return $defaut; |
@@ -247,7 +247,7 @@ discard block |
||
| 247 | 247 | if (!$r) { |
| 248 | 248 | $joker = false; // indiquer a l'appelant |
| 249 | 249 | # continuer pour chercher l'erreur suivante |
| 250 | - return ["'#" . $r . ':' . $nom_champ . "'", '']; |
|
| 250 | + return ["'#".$r.':'.$nom_champ."'", '']; |
|
| 251 | 251 | } |
| 252 | 252 | |
| 253 | 253 | $desc = $boucles[$idb]->show; |
@@ -290,7 +290,7 @@ discard block |
||
| 290 | 290 | if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) { |
| 291 | 291 | [, $_table, $_nom_champ] = $r; |
| 292 | 292 | if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) { |
| 293 | - $_alias = $cle . '_' . $_nom_champ; |
|
| 293 | + $_alias = $cle.'_'.$_nom_champ; |
|
| 294 | 294 | return index_exception( |
| 295 | 295 | $boucles[$idb], |
| 296 | 296 | $desc, |
@@ -371,8 +371,8 @@ discard block |
||
| 371 | 371 | $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep); |
| 372 | 372 | } |
| 373 | 373 | if ($t == null) { |
| 374 | - [$e, $x] = $excep; #PHP4 affecte de gauche a droite |
|
| 375 | - $excep = $x; #PHP5 de droite a gauche ! |
|
| 374 | + [$e, $x] = $excep; #PHP4 affecte de gauche a droite |
|
| 375 | + $excep = $x; #PHP5 de droite a gauche ! |
|
| 376 | 376 | $j = $trouver_table($e, $boucle->sql_serveur); |
| 377 | 377 | if (!$j) { |
| 378 | 378 | return ['', '']; |
@@ -384,7 +384,7 @@ discard block |
||
| 384 | 384 | $l = (preg_split('/\s*,\s*/', $k)); |
| 385 | 385 | $k = $desc['key']['PRIMARY KEY']; |
| 386 | 386 | if (!in_array($k, $l)) { |
| 387 | - spip_log("jointure impossible $e " . implode(',', $l)); |
|
| 387 | + spip_log("jointure impossible $e ".implode(',', $l)); |
|
| 388 | 388 | |
| 389 | 389 | return ['', '']; |
| 390 | 390 | } |
@@ -400,7 +400,7 @@ discard block |
||
| 400 | 400 | // demander a SQL de gerer le synonyme |
| 401 | 401 | // ca permet que excep soit dynamique (Cedric, 2/3/06) |
| 402 | 402 | if ($excep != $nom_champ) { |
| 403 | - $excep .= ' AS ' . $nom_champ; |
|
| 403 | + $excep .= ' AS '.$nom_champ; |
|
| 404 | 404 | } |
| 405 | 405 | |
| 406 | 406 | return ["$t.$excep", $nom_champ]; |
@@ -648,7 +648,7 @@ discard block |
||
| 648 | 648 | implode(',', $collecte), |
| 649 | 649 | ($collecte ? $param : substr($param, 1)), # virer la virgule |
| 650 | 650 | memoriser_contexte_compil($p), |
| 651 | - ($supp ? ', ' . implode(',', $supp) : ('')) |
|
| 651 | + ($supp ? ', '.implode(',', $supp) : ('')) |
|
| 652 | 652 | ); |
| 653 | 653 | |
| 654 | 654 | $p->interdire_scripts = false; |
@@ -682,7 +682,7 @@ discard block |
||
| 682 | 682 | * @return array |
| 683 | 683 | * Liste des codes PHP d'éxecution des balises collectées |
| 684 | 684 | **/ |
| 685 | -function collecter_balise_dynamique(array $l, Champ &$p, string $nom): array { |
|
| 685 | +function collecter_balise_dynamique(array $l, Champ & $p, string $nom): array { |
|
| 686 | 686 | $args = []; |
| 687 | 687 | foreach ($l as $c) { |
| 688 | 688 | if ($c === null) { |
@@ -747,7 +747,7 @@ discard block |
||
| 747 | 747 | $nom = $p->id_boucle; |
| 748 | 748 | |
| 749 | 749 | if ($nom && trouver_nom_serveur_distant($p)) { |
| 750 | - spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit')); |
|
| 750 | + spip_log($nom.':'.$p->nom_champ.' '._T('zbug_distant_interdit')); |
|
| 751 | 751 | |
| 752 | 752 | return false; |
| 753 | 753 | } |
@@ -823,7 +823,7 @@ discard block |
||
| 823 | 823 | && $p->descr['documents'] |
| 824 | 824 | && (str_contains($ps, 'propre') || str_contains($ps, 'typo')) |
| 825 | 825 | ) { |
| 826 | - $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')'; |
|
| 826 | + $ps = 'traiter_doublons_documents($doublons, '.$ps.')'; |
|
| 827 | 827 | } |
| 828 | 828 | |
| 829 | 829 | // La protection des champs par |safehtml est assuree par les extensions |
@@ -927,7 +927,7 @@ discard block |
||
| 927 | 927 | function compose_filtres_args($p, $args, $sep) { |
| 928 | 928 | $arglist = ''; |
| 929 | 929 | foreach ($args as $arg) { |
| 930 | - $arglist .= $sep . |
|
| 930 | + $arglist .= $sep. |
|
| 931 | 931 | calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle); |
| 932 | 932 | } |
| 933 | 933 | |
@@ -977,7 +977,7 @@ discard block |
||
| 977 | 977 | while ($b != '') { |
| 978 | 978 | foreach ($p->boucles[$b]->criteres as $critere) { |
| 979 | 979 | if ($critere->op == $motif) { |
| 980 | - $p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") . |
|
| 980 | + $p->code = '$Pile[$SP'.(($n == 0) ? '' : "-$n"). |
|
| 981 | 981 | "]['$champ']"; |
| 982 | 982 | $b = ''; |
| 983 | 983 | break 2; |
@@ -1005,6 +1005,6 @@ discard block |
||
| 1005 | 1005 | */ |
| 1006 | 1006 | function zbug_presenter_champ($p, $champ = '') { |
| 1007 | 1007 | $balise = $champ ?: $p->nom_champ; |
| 1008 | - $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : ''; |
|
| 1008 | + $explicite = $p->nom_boucle ? $p->nom_boucle.':' : ''; |
|
| 1009 | 1009 | return "#{$explicite}{$balise}"; |
| 1010 | 1010 | } |
@@ -18,7 +18,7 @@ discard block |
||
| 18 | 18 | * @package SPIP\Core\Compilateur\References |
| 19 | 19 | **/ |
| 20 | 20 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 21 | - return; |
|
| 21 | + return; |
|
| 22 | 22 | } |
| 23 | 23 | |
| 24 | 24 | /** |
@@ -43,14 +43,14 @@ discard block |
||
| 43 | 43 | * - '' si une référence explicite incorrecte est envoyée |
| 44 | 44 | */ |
| 45 | 45 | function index_boucle($p) { |
| 46 | - if (strlen($p->nom_boucle)) { |
|
| 47 | - // retourne l’index explicite demandé s’il existe |
|
| 48 | - if (!empty($p->boucles[$p->nom_boucle])) { |
|
| 49 | - return $p->nom_boucle; |
|
| 50 | - } |
|
| 51 | - return ''; |
|
| 52 | - } |
|
| 53 | - return $p->id_boucle; |
|
| 46 | + if (strlen($p->nom_boucle)) { |
|
| 47 | + // retourne l’index explicite demandé s’il existe |
|
| 48 | + if (!empty($p->boucles[$p->nom_boucle])) { |
|
| 49 | + return $p->nom_boucle; |
|
| 50 | + } |
|
| 51 | + return ''; |
|
| 52 | + } |
|
| 53 | + return $p->id_boucle; |
|
| 54 | 54 | } |
| 55 | 55 | |
| 56 | 56 | |
@@ -73,17 +73,17 @@ discard block |
||
| 73 | 73 | * - '' si une référence explicite incorrecte est envoyée |
| 74 | 74 | */ |
| 75 | 75 | function index_boucle_mere($p) { |
| 76 | - if (strlen($p->nom_boucle)) { |
|
| 77 | - // retourne l’index explicite demandé s’il existe |
|
| 78 | - if (!empty($p->boucles[$p->nom_boucle])) { |
|
| 79 | - return $p->nom_boucle; |
|
| 80 | - } |
|
| 81 | - return ''; |
|
| 82 | - } |
|
| 83 | - if (!empty($p->descr['id_mere'])) { |
|
| 84 | - return $p->descr['id_mere']; |
|
| 85 | - } |
|
| 86 | - return ''; |
|
| 76 | + if (strlen($p->nom_boucle)) { |
|
| 77 | + // retourne l’index explicite demandé s’il existe |
|
| 78 | + if (!empty($p->boucles[$p->nom_boucle])) { |
|
| 79 | + return $p->nom_boucle; |
|
| 80 | + } |
|
| 81 | + return ''; |
|
| 82 | + } |
|
| 83 | + if (!empty($p->descr['id_mere'])) { |
|
| 84 | + return $p->descr['id_mere']; |
|
| 85 | + } |
|
| 86 | + return ''; |
|
| 87 | 87 | } |
| 88 | 88 | |
| 89 | 89 | /** |
@@ -117,74 +117,74 @@ discard block |
||
| 117 | 117 | * Code PHP pour obtenir le champ SQL |
| 118 | 118 | */ |
| 119 | 119 | function index_pile( |
| 120 | - $idb, |
|
| 121 | - $nom_champ, |
|
| 122 | - &$boucles, |
|
| 123 | - $explicite = '', |
|
| 124 | - $defaut = null, |
|
| 125 | - $remonte_pile = true, |
|
| 126 | - $select = true |
|
| 120 | + $idb, |
|
| 121 | + $nom_champ, |
|
| 122 | + &$boucles, |
|
| 123 | + $explicite = '', |
|
| 124 | + $defaut = null, |
|
| 125 | + $remonte_pile = true, |
|
| 126 | + $select = true |
|
| 127 | 127 | ) { |
| 128 | - if (!is_string($defaut)) { |
|
| 129 | - $defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)'; |
|
| 130 | - } |
|
| 131 | - |
|
| 132 | - $idb_origine = $idb; |
|
| 133 | - $nom_champ_origine = $nom_champ; |
|
| 134 | - |
|
| 135 | - $i = 0; |
|
| 136 | - if (strlen($explicite)) { |
|
| 137 | - // Recherche d'un champ dans un etage superieur |
|
| 138 | - while (($idb !== $explicite) && ($idb !== '')) { |
|
| 139 | - # spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'"); |
|
| 140 | - $i++; |
|
| 141 | - $idb = $boucles[$idb]->id_parent; |
|
| 142 | - } |
|
| 143 | - } |
|
| 144 | - |
|
| 145 | - # spip_log("Cherche: $nom_champ a partir de '$idb'"); |
|
| 146 | - $nom_champ = strtolower($nom_champ); |
|
| 147 | - $conditionnel = []; |
|
| 148 | - // attention: entre la boucle nommee 0, "" et le tableau vide, |
|
| 149 | - // il y a incoherences qu'il vaut mieux eviter |
|
| 150 | - while (isset($boucles[$idb])) { |
|
| 151 | - $joker = true; |
|
| 152 | - // modifie $joker si tous les champs sont autorisés. |
|
| 153 | - // $t = le select pour le champ, si on l'a trouvé (ou si joker) |
|
| 154 | - // $c = le nom du champ demandé |
|
| 155 | - [$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker); |
|
| 156 | - if ($t) { |
|
| 157 | - if ($select && !in_array($t, $boucles[$idb]->select)) { |
|
| 158 | - $boucles[$idb]->select[] = $t; |
|
| 159 | - } |
|
| 160 | - // renseigner la boucle source de ce champ pour les traitements |
|
| 161 | - $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb; |
|
| 162 | - $champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']'; |
|
| 163 | - if (!$joker) { |
|
| 164 | - return index_compose($conditionnel, $champ); |
|
| 165 | - } |
|
| 166 | - |
|
| 167 | - // tant que l'on trouve des tables avec joker, on continue |
|
| 168 | - // avec la boucle parente et on conditionne à l'exécution |
|
| 169 | - // la présence du champ. Si le champ existe à l'exécution |
|
| 170 | - // dans une boucle, il est pris, sinon on le cherche dans le parent... |
|
| 171 | - $conditionnel[] = "isset($champ)?$champ"; |
|
| 172 | - } |
|
| 173 | - |
|
| 174 | - if ($remonte_pile) { |
|
| 175 | - # spip_log("On remonte vers $i"); |
|
| 176 | - // Sinon on remonte d'un cran |
|
| 177 | - $idb = $boucles[$idb]->id_parent; |
|
| 178 | - $i++; |
|
| 179 | - } else { |
|
| 180 | - $idb = null; |
|
| 181 | - } |
|
| 182 | - } |
|
| 183 | - |
|
| 184 | - # spip_log("Pas vu $nom_champ"); |
|
| 185 | - // esperons qu'il y sera |
|
| 186 | - // ou qu'on a fourni une valeur par "defaut" plus pertinent |
|
| 187 | - return index_compose($conditionnel, $defaut); |
|
| 128 | + if (!is_string($defaut)) { |
|
| 129 | + $defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)'; |
|
| 130 | + } |
|
| 131 | + |
|
| 132 | + $idb_origine = $idb; |
|
| 133 | + $nom_champ_origine = $nom_champ; |
|
| 134 | + |
|
| 135 | + $i = 0; |
|
| 136 | + if (strlen($explicite)) { |
|
| 137 | + // Recherche d'un champ dans un etage superieur |
|
| 138 | + while (($idb !== $explicite) && ($idb !== '')) { |
|
| 139 | + # spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'"); |
|
| 140 | + $i++; |
|
| 141 | + $idb = $boucles[$idb]->id_parent; |
|
| 142 | + } |
|
| 143 | + } |
|
| 144 | + |
|
| 145 | + # spip_log("Cherche: $nom_champ a partir de '$idb'"); |
|
| 146 | + $nom_champ = strtolower($nom_champ); |
|
| 147 | + $conditionnel = []; |
|
| 148 | + // attention: entre la boucle nommee 0, "" et le tableau vide, |
|
| 149 | + // il y a incoherences qu'il vaut mieux eviter |
|
| 150 | + while (isset($boucles[$idb])) { |
|
| 151 | + $joker = true; |
|
| 152 | + // modifie $joker si tous les champs sont autorisés. |
|
| 153 | + // $t = le select pour le champ, si on l'a trouvé (ou si joker) |
|
| 154 | + // $c = le nom du champ demandé |
|
| 155 | + [$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker); |
|
| 156 | + if ($t) { |
|
| 157 | + if ($select && !in_array($t, $boucles[$idb]->select)) { |
|
| 158 | + $boucles[$idb]->select[] = $t; |
|
| 159 | + } |
|
| 160 | + // renseigner la boucle source de ce champ pour les traitements |
|
| 161 | + $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb; |
|
| 162 | + $champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']'; |
|
| 163 | + if (!$joker) { |
|
| 164 | + return index_compose($conditionnel, $champ); |
|
| 165 | + } |
|
| 166 | + |
|
| 167 | + // tant que l'on trouve des tables avec joker, on continue |
|
| 168 | + // avec la boucle parente et on conditionne à l'exécution |
|
| 169 | + // la présence du champ. Si le champ existe à l'exécution |
|
| 170 | + // dans une boucle, il est pris, sinon on le cherche dans le parent... |
|
| 171 | + $conditionnel[] = "isset($champ)?$champ"; |
|
| 172 | + } |
|
| 173 | + |
|
| 174 | + if ($remonte_pile) { |
|
| 175 | + # spip_log("On remonte vers $i"); |
|
| 176 | + // Sinon on remonte d'un cran |
|
| 177 | + $idb = $boucles[$idb]->id_parent; |
|
| 178 | + $i++; |
|
| 179 | + } else { |
|
| 180 | + $idb = null; |
|
| 181 | + } |
|
| 182 | + } |
|
| 183 | + |
|
| 184 | + # spip_log("Pas vu $nom_champ"); |
|
| 185 | + // esperons qu'il y sera |
|
| 186 | + // ou qu'on a fourni une valeur par "defaut" plus pertinent |
|
| 187 | + return index_compose($conditionnel, $defaut); |
|
| 188 | 188 | } |
| 189 | 189 | |
| 190 | 190 | /** |
@@ -198,12 +198,12 @@ discard block |
||
| 198 | 198 | * @return string Code PHP complet de recherche d'un champ |
| 199 | 199 | */ |
| 200 | 200 | function index_compose($conditionnel, $defaut) { |
| 201 | - while ($c = array_pop($conditionnel)) { |
|
| 202 | - // si on passe defaut = '', ne pas générer d'erreur de compilation. |
|
| 203 | - $defaut = "($c:(" . ($defaut ?: "''") . '))'; |
|
| 204 | - } |
|
| 201 | + while ($c = array_pop($conditionnel)) { |
|
| 202 | + // si on passe defaut = '', ne pas générer d'erreur de compilation. |
|
| 203 | + $defaut = "($c:(" . ($defaut ?: "''") . '))'; |
|
| 204 | + } |
|
| 205 | 205 | |
| 206 | - return $defaut; |
|
| 206 | + return $defaut; |
|
| 207 | 207 | } |
| 208 | 208 | |
| 209 | 209 | /** |
@@ -239,98 +239,98 @@ discard block |
||
| 239 | 239 | **/ |
| 240 | 240 | function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) { |
| 241 | 241 | |
| 242 | - $r = $boucles[$idb]->type_requete; |
|
| 243 | - // boucle recursive, c'est foutu... |
|
| 244 | - if ($r == TYPE_RECURSIF) { |
|
| 245 | - return []; |
|
| 246 | - } |
|
| 247 | - if (!$r) { |
|
| 248 | - $joker = false; // indiquer a l'appelant |
|
| 249 | - # continuer pour chercher l'erreur suivante |
|
| 250 | - return ["'#" . $r . ':' . $nom_champ . "'", '']; |
|
| 251 | - } |
|
| 252 | - |
|
| 253 | - $desc = $boucles[$idb]->show; |
|
| 254 | - // le nom du champ est il une exception de la table ? un alias ? |
|
| 255 | - $excep = $GLOBALS['exceptions_des_tables'][$r] ?? ''; |
|
| 256 | - if ($excep) { |
|
| 257 | - $excep = $excep[$nom_champ] ?? ''; |
|
| 258 | - } |
|
| 259 | - |
|
| 260 | - // il y a un alias connu pour ce champ |
|
| 261 | - if ($excep) { |
|
| 262 | - $joker = false; // indiquer a l'appelant |
|
| 263 | - return index_exception($boucles[$idb], $desc, $nom_champ, $excep); |
|
| 264 | - } |
|
| 265 | - |
|
| 266 | - // le champ existe dans la table, on le prend. |
|
| 267 | - if (isset($desc['field'][$nom_champ])) { |
|
| 268 | - $t = $boucles[$idb]->id_table ?? ''; |
|
| 269 | - $joker = false; // indiquer a l'appelant |
|
| 270 | - // note: dans certains cas ('valeur' d’une boucle DATA, sans id_table), retourne ['.valeur', 'valeur'] … |
|
| 271 | - return ["$t.$nom_champ", $nom_champ]; |
|
| 272 | - } |
|
| 273 | - |
|
| 274 | - // Tous les champs sont-ils acceptés ? |
|
| 275 | - // Si oui, on retourne le champ, et on lève le flag joker |
|
| 276 | - // C'est le cas des itérateurs DATA qui acceptent tout |
|
| 277 | - // et testent la présence du champ à l'exécution et non à la compilation |
|
| 278 | - // car ils ne connaissent pas ici leurs contenus. |
|
| 279 | - if ( |
|
| 280 | - /*$joker AND */ |
|
| 281 | - isset($desc['field']['*']) |
|
| 282 | - ) { |
|
| 283 | - $joker = true; // indiquer a l'appelant |
|
| 284 | - return [$nom_champ, $nom_champ]; |
|
| 285 | - } |
|
| 286 | - |
|
| 287 | - $joker = false; // indiquer a l'appelant |
|
| 288 | - |
|
| 289 | - // la table de jointure est explicitement indiquée (rubrique.titre) |
|
| 290 | - if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) { |
|
| 291 | - [, $_table, $_nom_champ] = $r; |
|
| 292 | - if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) { |
|
| 293 | - $_alias = $cle . '_' . $_nom_champ; |
|
| 294 | - return index_exception( |
|
| 295 | - $boucles[$idb], |
|
| 296 | - $desc, |
|
| 297 | - $_alias, |
|
| 298 | - [$_table, $_nom_champ] |
|
| 299 | - ); |
|
| 300 | - } |
|
| 301 | - return ['', '']; |
|
| 302 | - } |
|
| 303 | - |
|
| 304 | - // pas d'alias, pas de champ, pas de joker... |
|
| 305 | - // tenter via une jointure... |
|
| 306 | - |
|
| 307 | - // regarder si le champ est deja dans une jointure existante |
|
| 308 | - // sinon, si il y a des joitures explicites, la construire |
|
| 309 | - if ( |
|
| 310 | - !($t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) |
|
| 311 | - && $boucles[$idb]->jointures_explicites |
|
| 312 | - ) { |
|
| 313 | - // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!! |
|
| 314 | - // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites |
|
| 315 | - // mais est-ce ce qu'on veut ? |
|
| 316 | - $jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites); |
|
| 317 | - if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) { |
|
| 318 | - $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]); |
|
| 319 | - } |
|
| 320 | - } |
|
| 321 | - |
|
| 322 | - if ($t) { |
|
| 323 | - // si on a trouvé une jointure possible, on fait comme |
|
| 324 | - // si c'était une exception pour le champ demandé |
|
| 325 | - return index_exception( |
|
| 326 | - $boucles[$idb], |
|
| 327 | - $desc, |
|
| 328 | - $nom_champ, |
|
| 329 | - [$t[1]['id_table'], reset($t[2])] |
|
| 330 | - ); |
|
| 331 | - } |
|
| 332 | - |
|
| 333 | - return ['', '']; |
|
| 242 | + $r = $boucles[$idb]->type_requete; |
|
| 243 | + // boucle recursive, c'est foutu... |
|
| 244 | + if ($r == TYPE_RECURSIF) { |
|
| 245 | + return []; |
|
| 246 | + } |
|
| 247 | + if (!$r) { |
|
| 248 | + $joker = false; // indiquer a l'appelant |
|
| 249 | + # continuer pour chercher l'erreur suivante |
|
| 250 | + return ["'#" . $r . ':' . $nom_champ . "'", '']; |
|
| 251 | + } |
|
| 252 | + |
|
| 253 | + $desc = $boucles[$idb]->show; |
|
| 254 | + // le nom du champ est il une exception de la table ? un alias ? |
|
| 255 | + $excep = $GLOBALS['exceptions_des_tables'][$r] ?? ''; |
|
| 256 | + if ($excep) { |
|
| 257 | + $excep = $excep[$nom_champ] ?? ''; |
|
| 258 | + } |
|
| 259 | + |
|
| 260 | + // il y a un alias connu pour ce champ |
|
| 261 | + if ($excep) { |
|
| 262 | + $joker = false; // indiquer a l'appelant |
|
| 263 | + return index_exception($boucles[$idb], $desc, $nom_champ, $excep); |
|
| 264 | + } |
|
| 265 | + |
|
| 266 | + // le champ existe dans la table, on le prend. |
|
| 267 | + if (isset($desc['field'][$nom_champ])) { |
|
| 268 | + $t = $boucles[$idb]->id_table ?? ''; |
|
| 269 | + $joker = false; // indiquer a l'appelant |
|
| 270 | + // note: dans certains cas ('valeur' d’une boucle DATA, sans id_table), retourne ['.valeur', 'valeur'] … |
|
| 271 | + return ["$t.$nom_champ", $nom_champ]; |
|
| 272 | + } |
|
| 273 | + |
|
| 274 | + // Tous les champs sont-ils acceptés ? |
|
| 275 | + // Si oui, on retourne le champ, et on lève le flag joker |
|
| 276 | + // C'est le cas des itérateurs DATA qui acceptent tout |
|
| 277 | + // et testent la présence du champ à l'exécution et non à la compilation |
|
| 278 | + // car ils ne connaissent pas ici leurs contenus. |
|
| 279 | + if ( |
|
| 280 | + /*$joker AND */ |
|
| 281 | + isset($desc['field']['*']) |
|
| 282 | + ) { |
|
| 283 | + $joker = true; // indiquer a l'appelant |
|
| 284 | + return [$nom_champ, $nom_champ]; |
|
| 285 | + } |
|
| 286 | + |
|
| 287 | + $joker = false; // indiquer a l'appelant |
|
| 288 | + |
|
| 289 | + // la table de jointure est explicitement indiquée (rubrique.titre) |
|
| 290 | + if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) { |
|
| 291 | + [, $_table, $_nom_champ] = $r; |
|
| 292 | + if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) { |
|
| 293 | + $_alias = $cle . '_' . $_nom_champ; |
|
| 294 | + return index_exception( |
|
| 295 | + $boucles[$idb], |
|
| 296 | + $desc, |
|
| 297 | + $_alias, |
|
| 298 | + [$_table, $_nom_champ] |
|
| 299 | + ); |
|
| 300 | + } |
|
| 301 | + return ['', '']; |
|
| 302 | + } |
|
| 303 | + |
|
| 304 | + // pas d'alias, pas de champ, pas de joker... |
|
| 305 | + // tenter via une jointure... |
|
| 306 | + |
|
| 307 | + // regarder si le champ est deja dans une jointure existante |
|
| 308 | + // sinon, si il y a des joitures explicites, la construire |
|
| 309 | + if ( |
|
| 310 | + !($t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) |
|
| 311 | + && $boucles[$idb]->jointures_explicites |
|
| 312 | + ) { |
|
| 313 | + // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!! |
|
| 314 | + // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites |
|
| 315 | + // mais est-ce ce qu'on veut ? |
|
| 316 | + $jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites); |
|
| 317 | + if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) { |
|
| 318 | + $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]); |
|
| 319 | + } |
|
| 320 | + } |
|
| 321 | + |
|
| 322 | + if ($t) { |
|
| 323 | + // si on a trouvé une jointure possible, on fait comme |
|
| 324 | + // si c'était une exception pour le champ demandé |
|
| 325 | + return index_exception( |
|
| 326 | + $boucles[$idb], |
|
| 327 | + $desc, |
|
| 328 | + $nom_champ, |
|
| 329 | + [$t[1]['id_table'], reset($t[2])] |
|
| 330 | + ); |
|
| 331 | + } |
|
| 332 | + |
|
| 333 | + return ['', '']; |
|
| 334 | 334 | } |
| 335 | 335 | |
| 336 | 336 | |
@@ -358,52 +358,52 @@ discard block |
||
| 358 | 358 | * est une expression pour le SELECT de la boucle du style "mots.titre AS titre_mot" |
| 359 | 359 | **/ |
| 360 | 360 | function index_exception(&$boucle, $desc, $nom_champ, $excep) { |
| 361 | - static $trouver_table; |
|
| 362 | - if (!$trouver_table) { |
|
| 363 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 364 | - } |
|
| 365 | - |
|
| 366 | - if (is_array($excep)) { |
|
| 367 | - // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables |
|
| 368 | - $t = null; |
|
| 369 | - if (count($excep) == 3) { |
|
| 370 | - $index_exception_derogatoire = array_pop($excep); |
|
| 371 | - $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep); |
|
| 372 | - } |
|
| 373 | - if ($t == null) { |
|
| 374 | - [$e, $x] = $excep; #PHP4 affecte de gauche a droite |
|
| 375 | - $excep = $x; #PHP5 de droite a gauche ! |
|
| 376 | - $j = $trouver_table($e, $boucle->sql_serveur); |
|
| 377 | - if (!$j) { |
|
| 378 | - return ['', '']; |
|
| 379 | - } |
|
| 380 | - $e = $j['table']; |
|
| 381 | - if (!$t = array_search($e, $boucle->from)) { |
|
| 382 | - $k = $j['key']['PRIMARY KEY']; |
|
| 383 | - if (strpos($k, ',')) { |
|
| 384 | - $l = (preg_split('/\s*,\s*/', $k)); |
|
| 385 | - $k = $desc['key']['PRIMARY KEY']; |
|
| 386 | - if (!in_array($k, $l)) { |
|
| 387 | - spip_log("jointure impossible $e " . implode(',', $l)); |
|
| 388 | - |
|
| 389 | - return ['', '']; |
|
| 390 | - } |
|
| 391 | - } |
|
| 392 | - $k = [$boucle->id_table, [$e], $k]; |
|
| 393 | - fabrique_jointures($boucle, [$k]); |
|
| 394 | - $t = array_search($e, $boucle->from); |
|
| 395 | - } |
|
| 396 | - } |
|
| 397 | - } else { |
|
| 398 | - $t = $boucle->id_table; |
|
| 399 | - } |
|
| 400 | - // demander a SQL de gerer le synonyme |
|
| 401 | - // ca permet que excep soit dynamique (Cedric, 2/3/06) |
|
| 402 | - if ($excep != $nom_champ) { |
|
| 403 | - $excep .= ' AS ' . $nom_champ; |
|
| 404 | - } |
|
| 405 | - |
|
| 406 | - return ["$t.$excep", $nom_champ]; |
|
| 361 | + static $trouver_table; |
|
| 362 | + if (!$trouver_table) { |
|
| 363 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 364 | + } |
|
| 365 | + |
|
| 366 | + if (is_array($excep)) { |
|
| 367 | + // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables |
|
| 368 | + $t = null; |
|
| 369 | + if (count($excep) == 3) { |
|
| 370 | + $index_exception_derogatoire = array_pop($excep); |
|
| 371 | + $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep); |
|
| 372 | + } |
|
| 373 | + if ($t == null) { |
|
| 374 | + [$e, $x] = $excep; #PHP4 affecte de gauche a droite |
|
| 375 | + $excep = $x; #PHP5 de droite a gauche ! |
|
| 376 | + $j = $trouver_table($e, $boucle->sql_serveur); |
|
| 377 | + if (!$j) { |
|
| 378 | + return ['', '']; |
|
| 379 | + } |
|
| 380 | + $e = $j['table']; |
|
| 381 | + if (!$t = array_search($e, $boucle->from)) { |
|
| 382 | + $k = $j['key']['PRIMARY KEY']; |
|
| 383 | + if (strpos($k, ',')) { |
|
| 384 | + $l = (preg_split('/\s*,\s*/', $k)); |
|
| 385 | + $k = $desc['key']['PRIMARY KEY']; |
|
| 386 | + if (!in_array($k, $l)) { |
|
| 387 | + spip_log("jointure impossible $e " . implode(',', $l)); |
|
| 388 | + |
|
| 389 | + return ['', '']; |
|
| 390 | + } |
|
| 391 | + } |
|
| 392 | + $k = [$boucle->id_table, [$e], $k]; |
|
| 393 | + fabrique_jointures($boucle, [$k]); |
|
| 394 | + $t = array_search($e, $boucle->from); |
|
| 395 | + } |
|
| 396 | + } |
|
| 397 | + } else { |
|
| 398 | + $t = $boucle->id_table; |
|
| 399 | + } |
|
| 400 | + // demander a SQL de gerer le synonyme |
|
| 401 | + // ca permet que excep soit dynamique (Cedric, 2/3/06) |
|
| 402 | + if ($excep != $nom_champ) { |
|
| 403 | + $excep .= ' AS ' . $nom_champ; |
|
| 404 | + } |
|
| 405 | + |
|
| 406 | + return ["$t.$excep", $nom_champ]; |
|
| 407 | 407 | } |
| 408 | 408 | |
| 409 | 409 | /** |
@@ -428,7 +428,7 @@ discard block |
||
| 428 | 428 | * Code PHP pour retrouver le champ |
| 429 | 429 | */ |
| 430 | 430 | function champ_sql($champ, $p, $defaut = null, $remonte_pile = true) { |
| 431 | - return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile); |
|
| 431 | + return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile); |
|
| 432 | 432 | } |
| 433 | 433 | |
| 434 | 434 | |
@@ -448,9 +448,9 @@ discard block |
||
| 448 | 448 | * Code PHP pour d'exécution de la balise et de ses filtres |
| 449 | 449 | **/ |
| 450 | 450 | function calculer_champ($p) { |
| 451 | - $p = calculer_balise($p->nom_champ, $p); |
|
| 451 | + $p = calculer_balise($p->nom_champ, $p); |
|
| 452 | 452 | |
| 453 | - return applique_filtres($p); |
|
| 453 | + return applique_filtres($p); |
|
| 454 | 454 | } |
| 455 | 455 | |
| 456 | 456 | |
@@ -487,26 +487,26 @@ discard block |
||
| 487 | 487 | **/ |
| 488 | 488 | function calculer_balise(string $nom, Champ $p): Champ { |
| 489 | 489 | |
| 490 | - // S'agit-t-il d'une balise_XXXX[_dist]() ? |
|
| 491 | - if ($f = charger_fonction($nom, 'balise', true)) { |
|
| 492 | - $p->balise_calculee = true; |
|
| 493 | - $res = $f($p); |
|
| 494 | - if ($res !== null && is_object($res)) { |
|
| 495 | - return $res; |
|
| 496 | - } |
|
| 497 | - } |
|
| 498 | - |
|
| 499 | - // Certaines des balises comportant un _ sont generiques |
|
| 500 | - if ($balise_generique = chercher_balise_generique($nom)) { |
|
| 501 | - $res = $balise_generique['fonction_generique']($p); |
|
| 502 | - if ($res !== null && is_object($res)) { |
|
| 503 | - return $res; |
|
| 504 | - } |
|
| 505 | - } |
|
| 506 | - |
|
| 507 | - $f = charger_fonction('DEFAUT', 'calculer_balise'); |
|
| 508 | - |
|
| 509 | - return $f($nom, $p); |
|
| 490 | + // S'agit-t-il d'une balise_XXXX[_dist]() ? |
|
| 491 | + if ($f = charger_fonction($nom, 'balise', true)) { |
|
| 492 | + $p->balise_calculee = true; |
|
| 493 | + $res = $f($p); |
|
| 494 | + if ($res !== null && is_object($res)) { |
|
| 495 | + return $res; |
|
| 496 | + } |
|
| 497 | + } |
|
| 498 | + |
|
| 499 | + // Certaines des balises comportant un _ sont generiques |
|
| 500 | + if ($balise_generique = chercher_balise_generique($nom)) { |
|
| 501 | + $res = $balise_generique['fonction_generique']($p); |
|
| 502 | + if ($res !== null && is_object($res)) { |
|
| 503 | + return $res; |
|
| 504 | + } |
|
| 505 | + } |
|
| 506 | + |
|
| 507 | + $f = charger_fonction('DEFAUT', 'calculer_balise'); |
|
| 508 | + |
|
| 509 | + return $f($nom, $p); |
|
| 510 | 510 | } |
| 511 | 511 | |
| 512 | 512 | |
@@ -534,33 +534,33 @@ discard block |
||
| 534 | 534 | **/ |
| 535 | 535 | function calculer_balise_DEFAUT_dist($nom, $p) { |
| 536 | 536 | |
| 537 | - // ca pourrait etre un champ SQL homonyme, |
|
| 538 | - $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle); |
|
| 539 | - |
|
| 540 | - // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour |
|
| 541 | - // il faut recracher {...} quand ce n'est finalement pas des args |
|
| 542 | - if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) { |
|
| 543 | - $code = addslashes($p->fonctions[0][1]); |
|
| 544 | - $p->code .= " . '$code'"; |
|
| 545 | - } |
|
| 546 | - |
|
| 547 | - // ne pas passer le filtre securite sur les id_xxx |
|
| 548 | - if (str_starts_with($nom, 'ID_')) { |
|
| 549 | - $p->interdire_scripts = false; |
|
| 550 | - } |
|
| 551 | - |
|
| 552 | - // Compatibilite ascendante avec les couleurs html (#FEFEFE) : |
|
| 553 | - // SI le champ SQL n'est pas trouve |
|
| 554 | - // ET si la balise a une forme de couleur |
|
| 555 | - // ET s'il n'y a ni filtre ni etoile |
|
| 556 | - // ALORS retourner la couleur. |
|
| 557 | - // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)] |
|
| 558 | - if (preg_match('/^[A-F]{1,6}$/i', $nom) && !$p->etoile && !$p->fonctions) { |
|
| 559 | - $p->code = "'#$nom'"; |
|
| 560 | - $p->interdire_scripts = false; |
|
| 561 | - } |
|
| 562 | - |
|
| 563 | - return $p; |
|
| 537 | + // ca pourrait etre un champ SQL homonyme, |
|
| 538 | + $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle); |
|
| 539 | + |
|
| 540 | + // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour |
|
| 541 | + // il faut recracher {...} quand ce n'est finalement pas des args |
|
| 542 | + if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) { |
|
| 543 | + $code = addslashes($p->fonctions[0][1]); |
|
| 544 | + $p->code .= " . '$code'"; |
|
| 545 | + } |
|
| 546 | + |
|
| 547 | + // ne pas passer le filtre securite sur les id_xxx |
|
| 548 | + if (str_starts_with($nom, 'ID_')) { |
|
| 549 | + $p->interdire_scripts = false; |
|
| 550 | + } |
|
| 551 | + |
|
| 552 | + // Compatibilite ascendante avec les couleurs html (#FEFEFE) : |
|
| 553 | + // SI le champ SQL n'est pas trouve |
|
| 554 | + // ET si la balise a une forme de couleur |
|
| 555 | + // ET s'il n'y a ni filtre ni etoile |
|
| 556 | + // ALORS retourner la couleur. |
|
| 557 | + // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)] |
|
| 558 | + if (preg_match('/^[A-F]{1,6}$/i', $nom) && !$p->etoile && !$p->fonctions) { |
|
| 559 | + $p->code = "'#$nom'"; |
|
| 560 | + $p->interdire_scripts = false; |
|
| 561 | + } |
|
| 562 | + |
|
| 563 | + return $p; |
|
| 564 | 564 | } |
| 565 | 565 | |
| 566 | 566 | |
@@ -608,52 +608,52 @@ discard block |
||
| 608 | 608 | **/ |
| 609 | 609 | function calculer_balise_dynamique($p, $nom, $l, $supp = []) { |
| 610 | 610 | |
| 611 | - if (!balise_distante_interdite($p)) { |
|
| 612 | - $p->code = "''"; |
|
| 613 | - |
|
| 614 | - return $p; |
|
| 615 | - } |
|
| 616 | - // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour |
|
| 617 | - // il faut recracher {...} quand ce n'est finalement pas des args |
|
| 618 | - if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) { |
|
| 619 | - $p->fonctions = []; |
|
| 620 | - } |
|
| 621 | - |
|
| 622 | - if ($p->param && ($c = $p->param[0])) { |
|
| 623 | - // liste d'arguments commence toujours par la chaine vide |
|
| 624 | - array_shift($c); |
|
| 625 | - // construire la liste d'arguments comme pour un filtre |
|
| 626 | - $param = compose_filtres_args($p, $c, ','); |
|
| 627 | - } else { |
|
| 628 | - $param = ''; |
|
| 629 | - } |
|
| 630 | - $collecte = collecter_balise_dynamique($l, $p, $nom); |
|
| 631 | - |
|
| 632 | - $dans_un_modele = false; |
|
| 633 | - if ( |
|
| 634 | - !empty($p->descr['sourcefile']) && ($f = $p->descr['sourcefile']) && basename(dirname($f)) === 'modeles' |
|
| 635 | - ) { |
|
| 636 | - $dans_un_modele = true; |
|
| 637 | - } |
|
| 638 | - |
|
| 639 | - // un modele est toujours inséré en texte dans son contenant |
|
| 640 | - // donc si on est dans le public avec un cache on va perdre le dynamisme |
|
| 641 | - // et on risque de mettre en cache les valeurs pre-remplies du formulaire |
|
| 642 | - // on passe donc par une fonction proxy qui si besoin va collecter les arguments |
|
| 643 | - // et injecter le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction |
|
| 644 | - // (dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)) |
|
| 645 | - $p->code = sprintf( |
|
| 646 | - $dans_un_modele ? CODE_EXECUTER_BALISE_MODELE : CODE_EXECUTER_BALISE, |
|
| 647 | - $nom, |
|
| 648 | - implode(',', $collecte), |
|
| 649 | - ($collecte ? $param : substr($param, 1)), # virer la virgule |
|
| 650 | - memoriser_contexte_compil($p), |
|
| 651 | - ($supp ? ', ' . implode(',', $supp) : ('')) |
|
| 652 | - ); |
|
| 653 | - |
|
| 654 | - $p->interdire_scripts = false; |
|
| 655 | - |
|
| 656 | - return $p; |
|
| 611 | + if (!balise_distante_interdite($p)) { |
|
| 612 | + $p->code = "''"; |
|
| 613 | + |
|
| 614 | + return $p; |
|
| 615 | + } |
|
| 616 | + // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour |
|
| 617 | + // il faut recracher {...} quand ce n'est finalement pas des args |
|
| 618 | + if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) { |
|
| 619 | + $p->fonctions = []; |
|
| 620 | + } |
|
| 621 | + |
|
| 622 | + if ($p->param && ($c = $p->param[0])) { |
|
| 623 | + // liste d'arguments commence toujours par la chaine vide |
|
| 624 | + array_shift($c); |
|
| 625 | + // construire la liste d'arguments comme pour un filtre |
|
| 626 | + $param = compose_filtres_args($p, $c, ','); |
|
| 627 | + } else { |
|
| 628 | + $param = ''; |
|
| 629 | + } |
|
| 630 | + $collecte = collecter_balise_dynamique($l, $p, $nom); |
|
| 631 | + |
|
| 632 | + $dans_un_modele = false; |
|
| 633 | + if ( |
|
| 634 | + !empty($p->descr['sourcefile']) && ($f = $p->descr['sourcefile']) && basename(dirname($f)) === 'modeles' |
|
| 635 | + ) { |
|
| 636 | + $dans_un_modele = true; |
|
| 637 | + } |
|
| 638 | + |
|
| 639 | + // un modele est toujours inséré en texte dans son contenant |
|
| 640 | + // donc si on est dans le public avec un cache on va perdre le dynamisme |
|
| 641 | + // et on risque de mettre en cache les valeurs pre-remplies du formulaire |
|
| 642 | + // on passe donc par une fonction proxy qui si besoin va collecter les arguments |
|
| 643 | + // et injecter le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction |
|
| 644 | + // (dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)) |
|
| 645 | + $p->code = sprintf( |
|
| 646 | + $dans_un_modele ? CODE_EXECUTER_BALISE_MODELE : CODE_EXECUTER_BALISE, |
|
| 647 | + $nom, |
|
| 648 | + implode(',', $collecte), |
|
| 649 | + ($collecte ? $param : substr($param, 1)), # virer la virgule |
|
| 650 | + memoriser_contexte_compil($p), |
|
| 651 | + ($supp ? ', ' . implode(',', $supp) : ('')) |
|
| 652 | + ); |
|
| 653 | + |
|
| 654 | + $p->interdire_scripts = false; |
|
| 655 | + |
|
| 656 | + return $p; |
|
| 657 | 657 | } |
| 658 | 658 | |
| 659 | 659 | |
@@ -683,17 +683,17 @@ discard block |
||
| 683 | 683 | * Liste des codes PHP d'éxecution des balises collectées |
| 684 | 684 | **/ |
| 685 | 685 | function collecter_balise_dynamique(array $l, Champ &$p, string $nom): array { |
| 686 | - $args = []; |
|
| 687 | - foreach ($l as $c) { |
|
| 688 | - if ($c === null) { |
|
| 689 | - $args[] = 'null'; |
|
| 690 | - } else { |
|
| 691 | - $x = calculer_balise($c, $p); |
|
| 692 | - $args[] = $x->code; |
|
| 693 | - } |
|
| 694 | - } |
|
| 695 | - |
|
| 696 | - return $args; |
|
| 686 | + $args = []; |
|
| 687 | + foreach ($l as $c) { |
|
| 688 | + if ($c === null) { |
|
| 689 | + $args[] = 'null'; |
|
| 690 | + } else { |
|
| 691 | + $x = calculer_balise($c, $p); |
|
| 692 | + $args[] = $x->code; |
|
| 693 | + } |
|
| 694 | + } |
|
| 695 | + |
|
| 696 | + return $args; |
|
| 697 | 697 | } |
| 698 | 698 | |
| 699 | 699 | |
@@ -708,19 +708,19 @@ discard block |
||
| 708 | 708 | * Nom de la connexion |
| 709 | 709 | **/ |
| 710 | 710 | function trouver_nom_serveur_distant($p) { |
| 711 | - $nom = $p->id_boucle; |
|
| 712 | - if ( |
|
| 713 | - $nom && isset($p->boucles[$nom]) |
|
| 714 | - ) { |
|
| 715 | - $s = $p->boucles[$nom]->sql_serveur; |
|
| 716 | - if ( |
|
| 717 | - strlen($s) && strlen($serveur = strtolower($s)) && !in_array($serveur, $GLOBALS['exception_des_connect']) |
|
| 718 | - ) { |
|
| 719 | - return $serveur; |
|
| 720 | - } |
|
| 721 | - } |
|
| 722 | - |
|
| 723 | - return ''; |
|
| 711 | + $nom = $p->id_boucle; |
|
| 712 | + if ( |
|
| 713 | + $nom && isset($p->boucles[$nom]) |
|
| 714 | + ) { |
|
| 715 | + $s = $p->boucles[$nom]->sql_serveur; |
|
| 716 | + if ( |
|
| 717 | + strlen($s) && strlen($serveur = strtolower($s)) && !in_array($serveur, $GLOBALS['exception_des_connect']) |
|
| 718 | + ) { |
|
| 719 | + return $serveur; |
|
| 720 | + } |
|
| 721 | + } |
|
| 722 | + |
|
| 723 | + return ''; |
|
| 724 | 724 | } |
| 725 | 725 | |
| 726 | 726 | |
@@ -744,15 +744,15 @@ discard block |
||
| 744 | 744 | * - false : La balise est interdite car le serveur est distant |
| 745 | 745 | **/ |
| 746 | 746 | function balise_distante_interdite($p) { |
| 747 | - $nom = $p->id_boucle; |
|
| 747 | + $nom = $p->id_boucle; |
|
| 748 | 748 | |
| 749 | - if ($nom && trouver_nom_serveur_distant($p)) { |
|
| 750 | - spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit')); |
|
| 749 | + if ($nom && trouver_nom_serveur_distant($p)) { |
|
| 750 | + spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit')); |
|
| 751 | 751 | |
| 752 | - return false; |
|
| 753 | - } |
|
| 752 | + return false; |
|
| 753 | + } |
|
| 754 | 754 | |
| 755 | - return true; |
|
| 755 | + return true; |
|
| 756 | 756 | } |
| 757 | 757 | |
| 758 | 758 | |
@@ -762,75 +762,75 @@ discard block |
||
| 762 | 762 | // |
| 763 | 763 | function champs_traitements($p) { |
| 764 | 764 | |
| 765 | - if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) { |
|
| 766 | - $ps = $GLOBALS['table_des_traitements'][$p->nom_champ]; |
|
| 767 | - } else { |
|
| 768 | - // quand on utilise un traitement catch-all * |
|
| 769 | - // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer |
|
| 770 | - // leur propre securite |
|
| 771 | - $ps = $p->balise_calculee ? false : $GLOBALS['table_des_traitements']['*']; |
|
| 772 | - } |
|
| 773 | - |
|
| 774 | - if (is_array($ps)) { |
|
| 775 | - // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte |
|
| 776 | - $idb = index_boucle($p); |
|
| 777 | - // si le champ a ete trouve dans une boucle parente sa source est renseignee ici |
|
| 778 | - if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) { |
|
| 779 | - $idb = $p->boucles[$idb]->index_champ[$p->nom_champ]; |
|
| 780 | - } |
|
| 781 | - |
|
| 782 | - // mais on peut aussi etre hors boucle. Se mefier. |
|
| 783 | - $type_requete = $p->boucles[$idb]->type_requete ?? false; |
|
| 784 | - $table_sql = $p->boucles[$idb]->show['table_sql'] ?? false; |
|
| 785 | - |
|
| 786 | - // bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.) |
|
| 787 | - if ($type_requete && isset($GLOBALS['table_des_tables'][$type_requete])) { |
|
| 788 | - $type_alias = $type_requete; |
|
| 789 | - $type_requete = $GLOBALS['table_des_tables'][$type_requete]; |
|
| 790 | - } else { |
|
| 791 | - $type_alias = false; |
|
| 792 | - } |
|
| 793 | - |
|
| 794 | - // le traitement peut n'etre defini que pour une table en particulier "spip_articles" |
|
| 795 | - if ($table_sql && isset($ps[$table_sql])) { |
|
| 796 | - $ps = $ps[$table_sql]; |
|
| 797 | - } // ou pour une boucle en particulier "DATA","articles" |
|
| 798 | - elseif ($type_requete && isset($ps[$type_requete])) { |
|
| 799 | - $ps = $ps[$type_requete]; |
|
| 800 | - } // ou pour une boucle utilisant un alias ("hierarchie") |
|
| 801 | - elseif ($type_alias && isset($ps[$type_alias])) { |
|
| 802 | - $ps = $ps[$type_alias]; |
|
| 803 | - } // ou pour indifféremment quelle que soit la boucle |
|
| 804 | - elseif (isset($ps[0])) { |
|
| 805 | - $ps = $ps[0]; |
|
| 806 | - } else { |
|
| 807 | - $ps = false; |
|
| 808 | - } |
|
| 809 | - } |
|
| 810 | - |
|
| 811 | - if (!$ps) { |
|
| 812 | - return $p->code; |
|
| 813 | - } |
|
| 814 | - |
|
| 815 | - // Si une boucle DOCUMENTS{doublons} est presente dans le squelette, |
|
| 816 | - // ou si in INCLURE contient {doublons} |
|
| 817 | - // on insere une fonction de remplissage du tableau des doublons |
|
| 818 | - // dans les filtres propre() ou typo() |
|
| 819 | - // (qui traitent les raccourcis <docXX> referencant les docs) |
|
| 820 | - |
|
| 821 | - if ( |
|
| 822 | - isset($p->descr['documents']) |
|
| 823 | - && $p->descr['documents'] |
|
| 824 | - && (str_contains($ps, 'propre') || str_contains($ps, 'typo')) |
|
| 825 | - ) { |
|
| 826 | - $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')'; |
|
| 827 | - } |
|
| 828 | - |
|
| 829 | - // La protection des champs par |safehtml est assuree par les extensions |
|
| 830 | - // dans la declaration des traitements des champs sensibles |
|
| 831 | - |
|
| 832 | - // Remplacer enfin le placeholder %s par le vrai code de la balise |
|
| 833 | - return str_replace('%s', $p->code, $ps); |
|
| 765 | + if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) { |
|
| 766 | + $ps = $GLOBALS['table_des_traitements'][$p->nom_champ]; |
|
| 767 | + } else { |
|
| 768 | + // quand on utilise un traitement catch-all * |
|
| 769 | + // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer |
|
| 770 | + // leur propre securite |
|
| 771 | + $ps = $p->balise_calculee ? false : $GLOBALS['table_des_traitements']['*']; |
|
| 772 | + } |
|
| 773 | + |
|
| 774 | + if (is_array($ps)) { |
|
| 775 | + // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte |
|
| 776 | + $idb = index_boucle($p); |
|
| 777 | + // si le champ a ete trouve dans une boucle parente sa source est renseignee ici |
|
| 778 | + if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) { |
|
| 779 | + $idb = $p->boucles[$idb]->index_champ[$p->nom_champ]; |
|
| 780 | + } |
|
| 781 | + |
|
| 782 | + // mais on peut aussi etre hors boucle. Se mefier. |
|
| 783 | + $type_requete = $p->boucles[$idb]->type_requete ?? false; |
|
| 784 | + $table_sql = $p->boucles[$idb]->show['table_sql'] ?? false; |
|
| 785 | + |
|
| 786 | + // bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.) |
|
| 787 | + if ($type_requete && isset($GLOBALS['table_des_tables'][$type_requete])) { |
|
| 788 | + $type_alias = $type_requete; |
|
| 789 | + $type_requete = $GLOBALS['table_des_tables'][$type_requete]; |
|
| 790 | + } else { |
|
| 791 | + $type_alias = false; |
|
| 792 | + } |
|
| 793 | + |
|
| 794 | + // le traitement peut n'etre defini que pour une table en particulier "spip_articles" |
|
| 795 | + if ($table_sql && isset($ps[$table_sql])) { |
|
| 796 | + $ps = $ps[$table_sql]; |
|
| 797 | + } // ou pour une boucle en particulier "DATA","articles" |
|
| 798 | + elseif ($type_requete && isset($ps[$type_requete])) { |
|
| 799 | + $ps = $ps[$type_requete]; |
|
| 800 | + } // ou pour une boucle utilisant un alias ("hierarchie") |
|
| 801 | + elseif ($type_alias && isset($ps[$type_alias])) { |
|
| 802 | + $ps = $ps[$type_alias]; |
|
| 803 | + } // ou pour indifféremment quelle que soit la boucle |
|
| 804 | + elseif (isset($ps[0])) { |
|
| 805 | + $ps = $ps[0]; |
|
| 806 | + } else { |
|
| 807 | + $ps = false; |
|
| 808 | + } |
|
| 809 | + } |
|
| 810 | + |
|
| 811 | + if (!$ps) { |
|
| 812 | + return $p->code; |
|
| 813 | + } |
|
| 814 | + |
|
| 815 | + // Si une boucle DOCUMENTS{doublons} est presente dans le squelette, |
|
| 816 | + // ou si in INCLURE contient {doublons} |
|
| 817 | + // on insere une fonction de remplissage du tableau des doublons |
|
| 818 | + // dans les filtres propre() ou typo() |
|
| 819 | + // (qui traitent les raccourcis <docXX> referencant les docs) |
|
| 820 | + |
|
| 821 | + if ( |
|
| 822 | + isset($p->descr['documents']) |
|
| 823 | + && $p->descr['documents'] |
|
| 824 | + && (str_contains($ps, 'propre') || str_contains($ps, 'typo')) |
|
| 825 | + ) { |
|
| 826 | + $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')'; |
|
| 827 | + } |
|
| 828 | + |
|
| 829 | + // La protection des champs par |safehtml est assuree par les extensions |
|
| 830 | + // dans la declaration des traitements des champs sensibles |
|
| 831 | + |
|
| 832 | + // Remplacer enfin le placeholder %s par le vrai code de la balise |
|
| 833 | + return str_replace('%s', $p->code, $ps); |
|
| 834 | 834 | } |
| 835 | 835 | |
| 836 | 836 | |
@@ -842,95 +842,95 @@ discard block |
||
| 842 | 842 | // |
| 843 | 843 | function applique_filtres($p) { |
| 844 | 844 | |
| 845 | - // Traitements standards (cf. supra) |
|
| 846 | - $code = $p->etoile == '' ? champs_traitements($p) : $p->code; |
|
| 845 | + // Traitements standards (cf. supra) |
|
| 846 | + $code = $p->etoile == '' ? champs_traitements($p) : $p->code; |
|
| 847 | 847 | |
| 848 | - // Appliquer les filtres perso |
|
| 849 | - if ($p->param) { |
|
| 850 | - $code = compose_filtres($p, $code); |
|
| 851 | - } |
|
| 848 | + // Appliquer les filtres perso |
|
| 849 | + if ($p->param) { |
|
| 850 | + $code = compose_filtres($p, $code); |
|
| 851 | + } |
|
| 852 | 852 | |
| 853 | - // S'il y a un lien avec la session, ajouter un code qui levera |
|
| 854 | - // un drapeau dans la structure d'invalidation $Cache |
|
| 855 | - if (isset($p->descr['session'])) { |
|
| 856 | - $code = "invalideur_session(\$Cache, $code)"; |
|
| 857 | - } |
|
| 853 | + // S'il y a un lien avec la session, ajouter un code qui levera |
|
| 854 | + // un drapeau dans la structure d'invalidation $Cache |
|
| 855 | + if (isset($p->descr['session'])) { |
|
| 856 | + $code = "invalideur_session(\$Cache, $code)"; |
|
| 857 | + } |
|
| 858 | 858 | |
| 859 | - return sandbox_composer_interdire_scripts($code, $p); |
|
| 859 | + return sandbox_composer_interdire_scripts($code, $p); |
|
| 860 | 860 | } |
| 861 | 861 | |
| 862 | 862 | // Cf. function pipeline dans ecrire/inc_utils.php |
| 863 | 863 | function compose_filtres(&$p, $code) { |
| 864 | 864 | |
| 865 | - $image_miette = false; |
|
| 866 | - foreach ($p->param as $filtre) { |
|
| 867 | - $fonc = array_shift($filtre); |
|
| 868 | - if (!$fonc) { |
|
| 869 | - continue; |
|
| 870 | - } // normalement qu'au premier tour. |
|
| 871 | - $is_filtre_image = (str_starts_with($fonc, 'image_') && $fonc != 'image_graver'); |
|
| 872 | - if ($image_miette && !$is_filtre_image) { |
|
| 873 | - // il faut graver maintenant car apres le filtre en cours |
|
| 874 | - // on est pas sur d'avoir encore le nom du fichier dans le pipe |
|
| 875 | - $code = "filtrer('image_graver', $code)"; |
|
| 876 | - $image_miette = false; |
|
| 877 | - } |
|
| 878 | - |
|
| 879 | - // recuperer les arguments du filtre, |
|
| 880 | - // a separer par "," ou ":" dans le cas du filtre "?{a,b}" |
|
| 881 | - $countfiltre = is_countable($filtre) ? count($filtre) : 0; |
|
| 882 | - if ($fonc !== '?') { |
|
| 883 | - $sep = ','; |
|
| 884 | - } else { |
|
| 885 | - $sep = ':'; |
|
| 886 | - // |?{a,b} *doit* avoir exactement 2 arguments ; on les force |
|
| 887 | - if ($countfiltre != 2) { |
|
| 888 | - $filtre = [$filtre[0] ?? '', $filtre[1] ?? '']; |
|
| 889 | - $countfiltre = 2; |
|
| 890 | - } |
|
| 891 | - } |
|
| 892 | - $arglist = compose_filtres_args($p, $filtre, $sep); |
|
| 893 | - $logique = filtre_logique($fonc, $code, substr($arglist, 1)); |
|
| 894 | - if ($logique) { |
|
| 895 | - $code = $logique; |
|
| 896 | - } else { |
|
| 897 | - $code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre); |
|
| 898 | - if ($is_filtre_image) { |
|
| 899 | - $image_miette = true; |
|
| 900 | - } |
|
| 901 | - } |
|
| 902 | - } |
|
| 903 | - // ramasser les images intermediaires inutiles et graver l'image finale |
|
| 904 | - if ($image_miette) { |
|
| 905 | - $code = "filtrer('image_graver',$code)"; |
|
| 906 | - } |
|
| 907 | - |
|
| 908 | - return $code; |
|
| 865 | + $image_miette = false; |
|
| 866 | + foreach ($p->param as $filtre) { |
|
| 867 | + $fonc = array_shift($filtre); |
|
| 868 | + if (!$fonc) { |
|
| 869 | + continue; |
|
| 870 | + } // normalement qu'au premier tour. |
|
| 871 | + $is_filtre_image = (str_starts_with($fonc, 'image_') && $fonc != 'image_graver'); |
|
| 872 | + if ($image_miette && !$is_filtre_image) { |
|
| 873 | + // il faut graver maintenant car apres le filtre en cours |
|
| 874 | + // on est pas sur d'avoir encore le nom du fichier dans le pipe |
|
| 875 | + $code = "filtrer('image_graver', $code)"; |
|
| 876 | + $image_miette = false; |
|
| 877 | + } |
|
| 878 | + |
|
| 879 | + // recuperer les arguments du filtre, |
|
| 880 | + // a separer par "," ou ":" dans le cas du filtre "?{a,b}" |
|
| 881 | + $countfiltre = is_countable($filtre) ? count($filtre) : 0; |
|
| 882 | + if ($fonc !== '?') { |
|
| 883 | + $sep = ','; |
|
| 884 | + } else { |
|
| 885 | + $sep = ':'; |
|
| 886 | + // |?{a,b} *doit* avoir exactement 2 arguments ; on les force |
|
| 887 | + if ($countfiltre != 2) { |
|
| 888 | + $filtre = [$filtre[0] ?? '', $filtre[1] ?? '']; |
|
| 889 | + $countfiltre = 2; |
|
| 890 | + } |
|
| 891 | + } |
|
| 892 | + $arglist = compose_filtres_args($p, $filtre, $sep); |
|
| 893 | + $logique = filtre_logique($fonc, $code, substr($arglist, 1)); |
|
| 894 | + if ($logique) { |
|
| 895 | + $code = $logique; |
|
| 896 | + } else { |
|
| 897 | + $code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre); |
|
| 898 | + if ($is_filtre_image) { |
|
| 899 | + $image_miette = true; |
|
| 900 | + } |
|
| 901 | + } |
|
| 902 | + } |
|
| 903 | + // ramasser les images intermediaires inutiles et graver l'image finale |
|
| 904 | + if ($image_miette) { |
|
| 905 | + $code = "filtrer('image_graver',$code)"; |
|
| 906 | + } |
|
| 907 | + |
|
| 908 | + return $code; |
|
| 909 | 909 | } |
| 910 | 910 | |
| 911 | 911 | // Filtres et,ou,oui,non,sinon,xou,xor,and,or,not,yes |
| 912 | 912 | // et comparateurs |
| 913 | 913 | function filtre_logique($fonc, $code, $arg) { |
| 914 | - return match (true) { |
|
| 915 | - in_array($fonc, $GLOBALS['table_criteres_infixes']) => "($code $fonc $arg)", |
|
| 916 | - $fonc == 'and' || $fonc == 'et' => "((($code) AND ($arg)) ?' ' :'')", |
|
| 917 | - $fonc == 'or' || $fonc == 'ou' => "((($code) OR ($arg)) ?' ' :'')", |
|
| 918 | - $fonc == 'xor' || $fonc == 'xou' => "((($code) XOR ($arg)) ?' ' :'')", |
|
| 919 | - $fonc == 'sinon' => "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)", |
|
| 920 | - $fonc == 'not' || $fonc == 'non' => "(($code) ?'' :' ')", |
|
| 921 | - $fonc == 'yes' || $fonc == 'oui' => "(($code) ?' ' :'')", |
|
| 922 | - default => '', |
|
| 923 | - }; |
|
| 914 | + return match (true) { |
|
| 915 | + in_array($fonc, $GLOBALS['table_criteres_infixes']) => "($code $fonc $arg)", |
|
| 916 | + $fonc == 'and' || $fonc == 'et' => "((($code) AND ($arg)) ?' ' :'')", |
|
| 917 | + $fonc == 'or' || $fonc == 'ou' => "((($code) OR ($arg)) ?' ' :'')", |
|
| 918 | + $fonc == 'xor' || $fonc == 'xou' => "((($code) XOR ($arg)) ?' ' :'')", |
|
| 919 | + $fonc == 'sinon' => "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)", |
|
| 920 | + $fonc == 'not' || $fonc == 'non' => "(($code) ?'' :' ')", |
|
| 921 | + $fonc == 'yes' || $fonc == 'oui' => "(($code) ?' ' :'')", |
|
| 922 | + default => '', |
|
| 923 | + }; |
|
| 924 | 924 | } |
| 925 | 925 | |
| 926 | 926 | function compose_filtres_args($p, $args, $sep) { |
| 927 | - $arglist = ''; |
|
| 928 | - foreach ($args as $arg) { |
|
| 929 | - $arglist .= $sep . |
|
| 930 | - calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle); |
|
| 931 | - } |
|
| 927 | + $arglist = ''; |
|
| 928 | + foreach ($args as $arg) { |
|
| 929 | + $arglist .= $sep . |
|
| 930 | + calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle); |
|
| 931 | + } |
|
| 932 | 932 | |
| 933 | - return $arglist; |
|
| 933 | + return $arglist; |
|
| 934 | 934 | } |
| 935 | 935 | |
| 936 | 936 | |
@@ -948,15 +948,15 @@ discard block |
||
| 948 | 948 | **/ |
| 949 | 949 | function calculer_argument_precedent($idb, $nom_champ, &$boucles, $defaut = null) { |
| 950 | 950 | |
| 951 | - // si recursif, forcer l'extraction du champ SQL mais ignorer le code |
|
| 952 | - if ($boucles[$idb]->externe) { |
|
| 953 | - index_pile($idb, $nom_champ, $boucles, '', $defaut); |
|
| 954 | - // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle |
|
| 955 | - // on ignore le defaut fourni dans ce cas |
|
| 956 | - $defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)"; |
|
| 957 | - } |
|
| 951 | + // si recursif, forcer l'extraction du champ SQL mais ignorer le code |
|
| 952 | + if ($boucles[$idb]->externe) { |
|
| 953 | + index_pile($idb, $nom_champ, $boucles, '', $defaut); |
|
| 954 | + // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle |
|
| 955 | + // on ignore le defaut fourni dans ce cas |
|
| 956 | + $defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)"; |
|
| 957 | + } |
|
| 958 | 958 | |
| 959 | - return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut); |
|
| 959 | + return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut); |
|
| 960 | 960 | } |
| 961 | 961 | |
| 962 | 962 | // |
@@ -970,30 +970,30 @@ discard block |
||
| 970 | 970 | // |
| 971 | 971 | |
| 972 | 972 | function rindex_pile($p, $champ, $motif) { |
| 973 | - $n = 0; |
|
| 974 | - $b = $p->id_boucle; |
|
| 975 | - $p->code = ''; |
|
| 976 | - while ($b != '') { |
|
| 977 | - foreach ($p->boucles[$b]->criteres as $critere) { |
|
| 978 | - if ($critere->op == $motif) { |
|
| 979 | - $p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") . |
|
| 980 | - "]['$champ']"; |
|
| 981 | - $b = ''; |
|
| 982 | - break 2; |
|
| 983 | - } |
|
| 984 | - } |
|
| 985 | - $n++; |
|
| 986 | - $b = $p->boucles[$b]->id_parent; |
|
| 987 | - } |
|
| 988 | - |
|
| 989 | - // si on est hors d'une boucle de {recherche}, cette balise est vide |
|
| 990 | - if (!$p->code) { |
|
| 991 | - $p->code = "''"; |
|
| 992 | - } |
|
| 993 | - |
|
| 994 | - $p->interdire_scripts = false; |
|
| 995 | - |
|
| 996 | - return $p; |
|
| 973 | + $n = 0; |
|
| 974 | + $b = $p->id_boucle; |
|
| 975 | + $p->code = ''; |
|
| 976 | + while ($b != '') { |
|
| 977 | + foreach ($p->boucles[$b]->criteres as $critere) { |
|
| 978 | + if ($critere->op == $motif) { |
|
| 979 | + $p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") . |
|
| 980 | + "]['$champ']"; |
|
| 981 | + $b = ''; |
|
| 982 | + break 2; |
|
| 983 | + } |
|
| 984 | + } |
|
| 985 | + $n++; |
|
| 986 | + $b = $p->boucles[$b]->id_parent; |
|
| 987 | + } |
|
| 988 | + |
|
| 989 | + // si on est hors d'une boucle de {recherche}, cette balise est vide |
|
| 990 | + if (!$p->code) { |
|
| 991 | + $p->code = "''"; |
|
| 992 | + } |
|
| 993 | + |
|
| 994 | + $p->interdire_scripts = false; |
|
| 995 | + |
|
| 996 | + return $p; |
|
| 997 | 997 | } |
| 998 | 998 | |
| 999 | 999 | /** |
@@ -1003,7 +1003,7 @@ discard block |
||
| 1003 | 1003 | * @return string Nom de la balise, avec indication de boucle explicite si présent. |
| 1004 | 1004 | */ |
| 1005 | 1005 | function zbug_presenter_champ($p, $champ = '') { |
| 1006 | - $balise = $champ ?: $p->nom_champ; |
|
| 1007 | - $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : ''; |
|
| 1008 | - return "#{$explicite}{$balise}"; |
|
| 1006 | + $balise = $champ ?: $p->nom_champ; |
|
| 1007 | + $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : ''; |
|
| 1008 | + return "#{$explicite}{$balise}"; |
|
| 1009 | 1009 | } |
@@ -18,15 +18,13 @@ discard block |
||
| 18 | 18 | if ($trace === '?' || defined('_DEBUG_TRACE_QUERIES')) { |
| 19 | 19 | if (defined('_DEBUG_TRACE_QUERIES') && _DEBUG_TRACE_QUERIES) { |
| 20 | 20 | $trace = true; |
| 21 | - } |
|
| 22 | - else { |
|
| 21 | + } else { |
|
| 23 | 22 | if (empty($GLOBALS['visiteur_session'])) { |
| 24 | 23 | // si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir |
| 25 | 24 | // car ici on ne sait pas si c'est un hit anonyme |
| 26 | 25 | // ou une requete SQL faite avant chargement de la session |
| 27 | 26 | $trace = (empty($_GET['var_profile']) ? false : '?'); |
| 28 | - } |
|
| 29 | - else { |
|
| 27 | + } else { |
|
| 30 | 28 | include_spip('inc/autoriser'); |
| 31 | 29 | // gare au bouclage sur calcul de droits au premier appel |
| 32 | 30 | // A fortiori quand on demande une trace |
@@ -47,8 +45,7 @@ discard block |
||
| 47 | 45 | // car ici on ne sait pas si c'est un hit anonyme |
| 48 | 46 | // ou une requete SQL faite avant chargement de la session |
| 49 | 47 | $trace = (empty($_GET['var_profile']) ? false : '?'); |
| 50 | - } |
|
| 51 | - else { |
|
| 48 | + } else { |
|
| 52 | 49 | include_spip('inc/autoriser'); |
| 53 | 50 | // gare au bouclage sur calcul de droits au premier appel |
| 54 | 51 | // A fortiori quand on demande une trace |
@@ -10,187 +10,187 @@ |
||
| 10 | 10 | \***************************************************************************/ |
| 11 | 11 | |
| 12 | 12 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 13 | - return; |
|
| 13 | + return; |
|
| 14 | 14 | } |
| 15 | 15 | |
| 16 | 16 | function trace_query_start() { |
| 17 | - static $trace = '?'; |
|
| 18 | - if ($trace === '?' || defined('_DEBUG_TRACE_QUERIES')) { |
|
| 19 | - if (defined('_DEBUG_TRACE_QUERIES') && _DEBUG_TRACE_QUERIES) { |
|
| 20 | - $trace = true; |
|
| 21 | - } |
|
| 22 | - else { |
|
| 23 | - if (empty($GLOBALS['visiteur_session'])) { |
|
| 24 | - // si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir |
|
| 25 | - // car ici on ne sait pas si c'est un hit anonyme |
|
| 26 | - // ou une requete SQL faite avant chargement de la session |
|
| 27 | - $trace = (empty($_GET['var_profile']) ? false : '?'); |
|
| 28 | - } |
|
| 29 | - else { |
|
| 30 | - include_spip('inc/autoriser'); |
|
| 31 | - // gare au bouclage sur calcul de droits au premier appel |
|
| 32 | - // A fortiori quand on demande une trace |
|
| 33 | - $trace = false; // on ne trace pas la requete provoquee par autoriser('debug') |
|
| 34 | - $trace = (!empty($_GET['var_profile']) && autoriser('debug')); |
|
| 35 | - } |
|
| 36 | - } |
|
| 37 | - } |
|
| 38 | - |
|
| 39 | - return $trace ? microtime() : 0; |
|
| 17 | + static $trace = '?'; |
|
| 18 | + if ($trace === '?' || defined('_DEBUG_TRACE_QUERIES')) { |
|
| 19 | + if (defined('_DEBUG_TRACE_QUERIES') && _DEBUG_TRACE_QUERIES) { |
|
| 20 | + $trace = true; |
|
| 21 | + } |
|
| 22 | + else { |
|
| 23 | + if (empty($GLOBALS['visiteur_session'])) { |
|
| 24 | + // si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir |
|
| 25 | + // car ici on ne sait pas si c'est un hit anonyme |
|
| 26 | + // ou une requete SQL faite avant chargement de la session |
|
| 27 | + $trace = (empty($_GET['var_profile']) ? false : '?'); |
|
| 28 | + } |
|
| 29 | + else { |
|
| 30 | + include_spip('inc/autoriser'); |
|
| 31 | + // gare au bouclage sur calcul de droits au premier appel |
|
| 32 | + // A fortiori quand on demande une trace |
|
| 33 | + $trace = false; // on ne trace pas la requete provoquee par autoriser('debug') |
|
| 34 | + $trace = (!empty($_GET['var_profile']) && autoriser('debug')); |
|
| 35 | + } |
|
| 36 | + } |
|
| 37 | + } |
|
| 38 | + |
|
| 39 | + return $trace ? microtime() : 0; |
|
| 40 | 40 | } |
| 41 | 41 | |
| 42 | 42 | function trace_query_end($query, $start, $result, $erreur, $serveur = '') { |
| 43 | - static $trace = '?'; |
|
| 44 | - if ($trace === '?') { |
|
| 45 | - if (empty($GLOBALS['visiteur_session'])) { |
|
| 46 | - // si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir |
|
| 47 | - // car ici on ne sait pas si c'est un hit anonyme |
|
| 48 | - // ou une requete SQL faite avant chargement de la session |
|
| 49 | - $trace = (empty($_GET['var_profile']) ? false : '?'); |
|
| 50 | - } |
|
| 51 | - else { |
|
| 52 | - include_spip('inc/autoriser'); |
|
| 53 | - // gare au bouclage sur calcul de droits au premier appel |
|
| 54 | - // A fortiori quand on demande une trace |
|
| 55 | - $trace = false; // on ne trace pas la requete provoquee par autoriser('debug') |
|
| 56 | - $trace = (!empty($_GET['var_profile']) && autoriser('debug')); |
|
| 57 | - } |
|
| 58 | - } |
|
| 59 | - if ($start) { |
|
| 60 | - $end = microtime(); |
|
| 61 | - [$usec, $sec] = explode(' ', (string) $start); |
|
| 62 | - [$usec2, $sec2] = explode(' ', $end); |
|
| 63 | - $dt = $sec2 + $usec2 - $sec - $usec; |
|
| 64 | - pipeline('trig_trace_query', ['query' => $query, 'start' => $start, 'end' => $end, 'time' => $dt, 'result' => $result, 'erreur' => $erreur, 'serveur' => $serveur]); |
|
| 65 | - if ($trace) { |
|
| 66 | - trace_query_chrono($dt, $query, $result, $serveur); |
|
| 67 | - } |
|
| 68 | - } |
|
| 69 | - // tracer les erreurs, sauf pour select, c'est fait dans abstract_sql |
|
| 70 | - if ($trace && $erreur && !preg_match('/^select\b/i', (string) $query)) { |
|
| 71 | - erreur_squelette([sql_errno($serveur), $erreur, $query]); |
|
| 72 | - } |
|
| 73 | - |
|
| 74 | - return $result; |
|
| 43 | + static $trace = '?'; |
|
| 44 | + if ($trace === '?') { |
|
| 45 | + if (empty($GLOBALS['visiteur_session'])) { |
|
| 46 | + // si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir |
|
| 47 | + // car ici on ne sait pas si c'est un hit anonyme |
|
| 48 | + // ou une requete SQL faite avant chargement de la session |
|
| 49 | + $trace = (empty($_GET['var_profile']) ? false : '?'); |
|
| 50 | + } |
|
| 51 | + else { |
|
| 52 | + include_spip('inc/autoriser'); |
|
| 53 | + // gare au bouclage sur calcul de droits au premier appel |
|
| 54 | + // A fortiori quand on demande une trace |
|
| 55 | + $trace = false; // on ne trace pas la requete provoquee par autoriser('debug') |
|
| 56 | + $trace = (!empty($_GET['var_profile']) && autoriser('debug')); |
|
| 57 | + } |
|
| 58 | + } |
|
| 59 | + if ($start) { |
|
| 60 | + $end = microtime(); |
|
| 61 | + [$usec, $sec] = explode(' ', (string) $start); |
|
| 62 | + [$usec2, $sec2] = explode(' ', $end); |
|
| 63 | + $dt = $sec2 + $usec2 - $sec - $usec; |
|
| 64 | + pipeline('trig_trace_query', ['query' => $query, 'start' => $start, 'end' => $end, 'time' => $dt, 'result' => $result, 'erreur' => $erreur, 'serveur' => $serveur]); |
|
| 65 | + if ($trace) { |
|
| 66 | + trace_query_chrono($dt, $query, $result, $serveur); |
|
| 67 | + } |
|
| 68 | + } |
|
| 69 | + // tracer les erreurs, sauf pour select, c'est fait dans abstract_sql |
|
| 70 | + if ($trace && $erreur && !preg_match('/^select\b/i', (string) $query)) { |
|
| 71 | + erreur_squelette([sql_errno($serveur), $erreur, $query]); |
|
| 72 | + } |
|
| 73 | + |
|
| 74 | + return $result; |
|
| 75 | 75 | } |
| 76 | 76 | |
| 77 | 77 | function trace_query_chrono($dt, $query, $result, $serveur = '') { |
| 78 | - include_spip('inc/filtres_mini'); |
|
| 79 | - static $tt = 0, $nb = 0; |
|
| 80 | - |
|
| 81 | - $x = _request('var_mode_objet'); |
|
| 82 | - if (isset($GLOBALS['debug']['aucasou'])) { |
|
| 83 | - [, $boucle, $serveur, $contexte] = $GLOBALS['debug']['aucasou']; |
|
| 84 | - if ($x && !preg_match("/$boucle\$/", (string) $x)) { |
|
| 85 | - return; |
|
| 86 | - } |
|
| 87 | - if ($serveur) { |
|
| 88 | - $boucle .= " ($serveur)"; |
|
| 89 | - } |
|
| 90 | - $boucle = "<b>$boucle</b>"; |
|
| 91 | - } else { |
|
| 92 | - if ($x) { |
|
| 93 | - return; |
|
| 94 | - } |
|
| 95 | - $boucle = $contexte = ''; |
|
| 96 | - } |
|
| 97 | - |
|
| 98 | - $tt += $dt; |
|
| 99 | - $nb++; |
|
| 100 | - |
|
| 101 | - $q = preg_replace('/([a-z)`])\s+([A-Z])/', "$1\n<br />$2", spip_htmlentities($query)); |
|
| 102 | - $e = sql_explain($query, $serveur); |
|
| 103 | - $r = str_replace('Resource id ', '', (is_object($result) ? $result::class : $result)); |
|
| 104 | - $GLOBALS['tableau_des_temps'][] = [$dt, $nb, $boucle, $q, $e, $r, $contexte]; |
|
| 78 | + include_spip('inc/filtres_mini'); |
|
| 79 | + static $tt = 0, $nb = 0; |
|
| 80 | + |
|
| 81 | + $x = _request('var_mode_objet'); |
|
| 82 | + if (isset($GLOBALS['debug']['aucasou'])) { |
|
| 83 | + [, $boucle, $serveur, $contexte] = $GLOBALS['debug']['aucasou']; |
|
| 84 | + if ($x && !preg_match("/$boucle\$/", (string) $x)) { |
|
| 85 | + return; |
|
| 86 | + } |
|
| 87 | + if ($serveur) { |
|
| 88 | + $boucle .= " ($serveur)"; |
|
| 89 | + } |
|
| 90 | + $boucle = "<b>$boucle</b>"; |
|
| 91 | + } else { |
|
| 92 | + if ($x) { |
|
| 93 | + return; |
|
| 94 | + } |
|
| 95 | + $boucle = $contexte = ''; |
|
| 96 | + } |
|
| 97 | + |
|
| 98 | + $tt += $dt; |
|
| 99 | + $nb++; |
|
| 100 | + |
|
| 101 | + $q = preg_replace('/([a-z)`])\s+([A-Z])/', "$1\n<br />$2", spip_htmlentities($query)); |
|
| 102 | + $e = sql_explain($query, $serveur); |
|
| 103 | + $r = str_replace('Resource id ', '', (is_object($result) ? $result::class : $result)); |
|
| 104 | + $GLOBALS['tableau_des_temps'][] = [$dt, $nb, $boucle, $q, $e, $r, $contexte]; |
|
| 105 | 105 | } |
| 106 | 106 | |
| 107 | 107 | |
| 108 | 108 | function chrono_requete($temps) { |
| 109 | - $total = 0; |
|
| 110 | - $hors = '<i>' . _T('zbug_hors_compilation') . '</i>'; |
|
| 111 | - $t = $q = $n = $d = []; |
|
| 112 | - // Totaliser les temps et completer le Explain |
|
| 113 | - foreach ($temps as $key => $v) { |
|
| 114 | - [$dt, $nb, $boucle, $query, $explain, $res, $contexte] = $v; |
|
| 115 | - if (is_array($contexte)) { |
|
| 116 | - $k = ($contexte[0] . " $boucle"); |
|
| 117 | - include_spip('public/compiler'); |
|
| 118 | - $env = reconstruire_contexte_compil($contexte); |
|
| 119 | - } else { |
|
| 120 | - $k = $env = $boucle; |
|
| 121 | - } |
|
| 122 | - |
|
| 123 | - $total += $dt; |
|
| 124 | - $t[$key] = $dt; |
|
| 125 | - $q[$key] = $nb; |
|
| 126 | - if (!isset($d[$k])) { |
|
| 127 | - $d[$k] = 0; |
|
| 128 | - $n[$k] = 0; |
|
| 129 | - } |
|
| 130 | - $d[$k] += $dt; |
|
| 131 | - ++$n[$k]; |
|
| 132 | - |
|
| 133 | - if (!is_array($explain)) { |
|
| 134 | - $explain = []; |
|
| 135 | - } |
|
| 136 | - foreach ($explain as $j => $v) { |
|
| 137 | - $explain[$j] = "<tr><th>$j</th><td>" |
|
| 138 | - . str_replace(';', '<br />', (string) $v) |
|
| 139 | - . '</td></tr>'; |
|
| 140 | - } |
|
| 141 | - $e = "<table class='explain'>" |
|
| 142 | - . '<caption>' |
|
| 143 | - . $query |
|
| 144 | - . '</caption>' |
|
| 145 | - . "<tr><th>Time</th><td>$dt</td></tr>" |
|
| 146 | - . "<tr><th>Order</th><td>$nb</td></tr>" |
|
| 147 | - . "<tr><th>Res</th><td>$res</td></tr>" |
|
| 148 | - . implode('', $explain) |
|
| 149 | - . '</table>'; |
|
| 150 | - |
|
| 151 | - $temps[$key] = [$e, $env, $k]; |
|
| 152 | - } |
|
| 153 | - // Trier par temps d'execution decroissant |
|
| 154 | - array_multisort($t, SORT_DESC, $q, $temps); |
|
| 155 | - arsort($d); |
|
| 156 | - $i = 1; |
|
| 157 | - $t = []; |
|
| 158 | - // Fabriquer les liens de navigations dans le tableau des temps |
|
| 159 | - foreach ($temps as $k => $v) { |
|
| 160 | - $titre = strip_tags((string) $v[2]); |
|
| 161 | - $href = quote_amp($GLOBALS['REQUEST_URI']) . "#req$i"; |
|
| 162 | - $href = str_replace("\\'", ''', $href); |
|
| 163 | - |
|
| 164 | - if (!isset($t[$v[2]])) { |
|
| 165 | - $t[$v[2]] = []; |
|
| 166 | - } |
|
| 167 | - $t[$v[2]][] = "<span class='spip-debug-arg'> " |
|
| 168 | - . "<a title='$titre' href='$href'>$i</a>" |
|
| 169 | - . '</span>' |
|
| 170 | - . ((count($t[$v[2]]) % 10 == 9) ? '<br />' : ''); |
|
| 171 | - $i++; |
|
| 172 | - } |
|
| 173 | - |
|
| 174 | - if ($d['']) { |
|
| 175 | - $d[$hors] = $d['']; |
|
| 176 | - $n[$hors] = $n['']; |
|
| 177 | - $t[$hors] = $t['']; |
|
| 178 | - } |
|
| 179 | - unset($d['']); |
|
| 180 | - // Fabriquer le tableau des liens de navigation dans le grand tableau |
|
| 181 | - foreach ($d as $k => $v) { |
|
| 182 | - $d[$k] = $n[$k] . "</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>" |
|
| 183 | - . implode('', $t[$k]); |
|
| 184 | - } |
|
| 185 | - |
|
| 186 | - $navigation = [ |
|
| 187 | - _T('zbug_statistiques'), |
|
| 188 | - '<tr><td>' |
|
| 189 | - . implode("</td></tr>\n<tr><td>", $d) |
|
| 190 | - . "</td></tr>\n" |
|
| 191 | - . (# _request('var_mode_objet') ? '' : |
|
| 192 | - ('<tr><td>' . (is_countable($temps) ? count($temps) : 0) . '</td><td>' . _T('info_total') . '</td><td class="time">' . $total . '</td><td></td></tr>')) |
|
| 193 | - ]; |
|
| 194 | - |
|
| 195 | - return [$temps, $navigation]; |
|
| 109 | + $total = 0; |
|
| 110 | + $hors = '<i>' . _T('zbug_hors_compilation') . '</i>'; |
|
| 111 | + $t = $q = $n = $d = []; |
|
| 112 | + // Totaliser les temps et completer le Explain |
|
| 113 | + foreach ($temps as $key => $v) { |
|
| 114 | + [$dt, $nb, $boucle, $query, $explain, $res, $contexte] = $v; |
|
| 115 | + if (is_array($contexte)) { |
|
| 116 | + $k = ($contexte[0] . " $boucle"); |
|
| 117 | + include_spip('public/compiler'); |
|
| 118 | + $env = reconstruire_contexte_compil($contexte); |
|
| 119 | + } else { |
|
| 120 | + $k = $env = $boucle; |
|
| 121 | + } |
|
| 122 | + |
|
| 123 | + $total += $dt; |
|
| 124 | + $t[$key] = $dt; |
|
| 125 | + $q[$key] = $nb; |
|
| 126 | + if (!isset($d[$k])) { |
|
| 127 | + $d[$k] = 0; |
|
| 128 | + $n[$k] = 0; |
|
| 129 | + } |
|
| 130 | + $d[$k] += $dt; |
|
| 131 | + ++$n[$k]; |
|
| 132 | + |
|
| 133 | + if (!is_array($explain)) { |
|
| 134 | + $explain = []; |
|
| 135 | + } |
|
| 136 | + foreach ($explain as $j => $v) { |
|
| 137 | + $explain[$j] = "<tr><th>$j</th><td>" |
|
| 138 | + . str_replace(';', '<br />', (string) $v) |
|
| 139 | + . '</td></tr>'; |
|
| 140 | + } |
|
| 141 | + $e = "<table class='explain'>" |
|
| 142 | + . '<caption>' |
|
| 143 | + . $query |
|
| 144 | + . '</caption>' |
|
| 145 | + . "<tr><th>Time</th><td>$dt</td></tr>" |
|
| 146 | + . "<tr><th>Order</th><td>$nb</td></tr>" |
|
| 147 | + . "<tr><th>Res</th><td>$res</td></tr>" |
|
| 148 | + . implode('', $explain) |
|
| 149 | + . '</table>'; |
|
| 150 | + |
|
| 151 | + $temps[$key] = [$e, $env, $k]; |
|
| 152 | + } |
|
| 153 | + // Trier par temps d'execution decroissant |
|
| 154 | + array_multisort($t, SORT_DESC, $q, $temps); |
|
| 155 | + arsort($d); |
|
| 156 | + $i = 1; |
|
| 157 | + $t = []; |
|
| 158 | + // Fabriquer les liens de navigations dans le tableau des temps |
|
| 159 | + foreach ($temps as $k => $v) { |
|
| 160 | + $titre = strip_tags((string) $v[2]); |
|
| 161 | + $href = quote_amp($GLOBALS['REQUEST_URI']) . "#req$i"; |
|
| 162 | + $href = str_replace("\\'", ''', $href); |
|
| 163 | + |
|
| 164 | + if (!isset($t[$v[2]])) { |
|
| 165 | + $t[$v[2]] = []; |
|
| 166 | + } |
|
| 167 | + $t[$v[2]][] = "<span class='spip-debug-arg'> " |
|
| 168 | + . "<a title='$titre' href='$href'>$i</a>" |
|
| 169 | + . '</span>' |
|
| 170 | + . ((count($t[$v[2]]) % 10 == 9) ? '<br />' : ''); |
|
| 171 | + $i++; |
|
| 172 | + } |
|
| 173 | + |
|
| 174 | + if ($d['']) { |
|
| 175 | + $d[$hors] = $d['']; |
|
| 176 | + $n[$hors] = $n['']; |
|
| 177 | + $t[$hors] = $t['']; |
|
| 178 | + } |
|
| 179 | + unset($d['']); |
|
| 180 | + // Fabriquer le tableau des liens de navigation dans le grand tableau |
|
| 181 | + foreach ($d as $k => $v) { |
|
| 182 | + $d[$k] = $n[$k] . "</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>" |
|
| 183 | + . implode('', $t[$k]); |
|
| 184 | + } |
|
| 185 | + |
|
| 186 | + $navigation = [ |
|
| 187 | + _T('zbug_statistiques'), |
|
| 188 | + '<tr><td>' |
|
| 189 | + . implode("</td></tr>\n<tr><td>", $d) |
|
| 190 | + . "</td></tr>\n" |
|
| 191 | + . (# _request('var_mode_objet') ? '' : |
|
| 192 | + ('<tr><td>' . (is_countable($temps) ? count($temps) : 0) . '</td><td>' . _T('info_total') . '</td><td class="time">' . $total . '</td><td></td></tr>')) |
|
| 193 | + ]; |
|
| 194 | + |
|
| 195 | + return [$temps, $navigation]; |
|
| 196 | 196 | } |
@@ -107,13 +107,13 @@ discard block |
||
| 107 | 107 | |
| 108 | 108 | function chrono_requete($temps) { |
| 109 | 109 | $total = 0; |
| 110 | - $hors = '<i>' . _T('zbug_hors_compilation') . '</i>'; |
|
| 110 | + $hors = '<i>'._T('zbug_hors_compilation').'</i>'; |
|
| 111 | 111 | $t = $q = $n = $d = []; |
| 112 | 112 | // Totaliser les temps et completer le Explain |
| 113 | 113 | foreach ($temps as $key => $v) { |
| 114 | 114 | [$dt, $nb, $boucle, $query, $explain, $res, $contexte] = $v; |
| 115 | 115 | if (is_array($contexte)) { |
| 116 | - $k = ($contexte[0] . " $boucle"); |
|
| 116 | + $k = ($contexte[0]." $boucle"); |
|
| 117 | 117 | include_spip('public/compiler'); |
| 118 | 118 | $env = reconstruire_contexte_compil($contexte); |
| 119 | 119 | } else { |
@@ -158,7 +158,7 @@ discard block |
||
| 158 | 158 | // Fabriquer les liens de navigations dans le tableau des temps |
| 159 | 159 | foreach ($temps as $k => $v) { |
| 160 | 160 | $titre = strip_tags((string) $v[2]); |
| 161 | - $href = quote_amp($GLOBALS['REQUEST_URI']) . "#req$i"; |
|
| 161 | + $href = quote_amp($GLOBALS['REQUEST_URI'])."#req$i"; |
|
| 162 | 162 | $href = str_replace("\\'", ''', $href); |
| 163 | 163 | |
| 164 | 164 | if (!isset($t[$v[2]])) { |
@@ -179,7 +179,7 @@ discard block |
||
| 179 | 179 | unset($d['']); |
| 180 | 180 | // Fabriquer le tableau des liens de navigation dans le grand tableau |
| 181 | 181 | foreach ($d as $k => $v) { |
| 182 | - $d[$k] = $n[$k] . "</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>" |
|
| 182 | + $d[$k] = $n[$k]."</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>" |
|
| 183 | 183 | . implode('', $t[$k]); |
| 184 | 184 | } |
| 185 | 185 | |
@@ -189,7 +189,7 @@ discard block |
||
| 189 | 189 | . implode("</td></tr>\n<tr><td>", $d) |
| 190 | 190 | . "</td></tr>\n" |
| 191 | 191 | . (# _request('var_mode_objet') ? '' : |
| 192 | - ('<tr><td>' . (is_countable($temps) ? count($temps) : 0) . '</td><td>' . _T('info_total') . '</td><td class="time">' . $total . '</td><td></td></tr>')) |
|
| 192 | + ('<tr><td>'.(is_countable($temps) ? count($temps) : 0).'</td><td>'._T('info_total').'</td><td class="time">'.$total.'</td><td></td></tr>')) |
|
| 193 | 193 | ]; |
| 194 | 194 | |
| 195 | 195 | return [$temps, $navigation]; |
@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | */ |
| 17 | 17 | |
| 18 | 18 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 19 | - return; |
|
| 19 | + return; |
|
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | /** |
@@ -40,54 +40,54 @@ discard block |
||
| 40 | 40 | */ |
| 41 | 41 | function action_referencer_traduction_dist($objet, $id_objet, $id_trad) { |
| 42 | 42 | |
| 43 | - // ne rien faire si id_trad est ambigu |
|
| 44 | - if (!is_numeric($id_trad)) { |
|
| 45 | - return false; |
|
| 46 | - } |
|
| 43 | + // ne rien faire si id_trad est ambigu |
|
| 44 | + if (!is_numeric($id_trad)) { |
|
| 45 | + return false; |
|
| 46 | + } |
|
| 47 | 47 | |
| 48 | - $table_objet_sql = table_objet_sql($objet); |
|
| 49 | - $id_table_objet = id_table_objet($objet); |
|
| 48 | + $table_objet_sql = table_objet_sql($objet); |
|
| 49 | + $id_table_objet = id_table_objet($objet); |
|
| 50 | 50 | |
| 51 | - // on a fourni un id_trad : affectation ou modification du groupe de trad |
|
| 52 | - if ($id_trad) { |
|
| 53 | - // selectionner l'objet cible, qui doit etre different de nous-meme, |
|
| 54 | - // et quitter s'il n'existe pas |
|
| 55 | - $id_lier = sql_getfetsel( |
|
| 56 | - 'id_trad', |
|
| 57 | - $table_objet_sql, |
|
| 58 | - "$id_table_objet=" . (int) $id_trad . " AND NOT($id_table_objet=" . (int) $id_objet . ')' |
|
| 59 | - ); |
|
| 60 | - if ($id_lier === null) { |
|
| 61 | - spip_log("echec lien de trad vers objet $objet/$id_objet incorrect ($id_trad)"); |
|
| 51 | + // on a fourni un id_trad : affectation ou modification du groupe de trad |
|
| 52 | + if ($id_trad) { |
|
| 53 | + // selectionner l'objet cible, qui doit etre different de nous-meme, |
|
| 54 | + // et quitter s'il n'existe pas |
|
| 55 | + $id_lier = sql_getfetsel( |
|
| 56 | + 'id_trad', |
|
| 57 | + $table_objet_sql, |
|
| 58 | + "$id_table_objet=" . (int) $id_trad . " AND NOT($id_table_objet=" . (int) $id_objet . ')' |
|
| 59 | + ); |
|
| 60 | + if ($id_lier === null) { |
|
| 61 | + spip_log("echec lien de trad vers objet $objet/$id_objet incorrect ($id_trad)"); |
|
| 62 | 62 | |
| 63 | - return false; |
|
| 64 | - } |
|
| 63 | + return false; |
|
| 64 | + } |
|
| 65 | 65 | |
| 66 | - // $id_lier est le numero du groupe de traduction |
|
| 67 | - // Si l'objet vise n'est pas deja traduit, son identifiant devient |
|
| 68 | - // le nouvel id_trad de ce nouveau groupe et on l'affecte aux deux |
|
| 69 | - // objets |
|
| 70 | - if ($id_lier == 0) { |
|
| 71 | - sql_updateq($table_objet_sql, ['id_trad' => $id_trad], "$id_table_objet IN ($id_trad, $id_objet)"); |
|
| 72 | - } // si id_lier = id_objet alors on veut changer la reference de tout le groupe de trad |
|
| 73 | - elseif ($id_lier == $id_objet) { |
|
| 74 | - sql_updateq($table_objet_sql, ['id_trad' => $id_trad], "id_trad = $id_lier"); |
|
| 75 | - } // sinon ajouter notre objet dans le groupe |
|
| 76 | - else { |
|
| 77 | - sql_updateq($table_objet_sql, ['id_trad' => $id_lier], "$id_table_objet=" . (int) $id_objet); |
|
| 78 | - } |
|
| 79 | - } // on a fourni un id_trad nul : sortir id_objet du groupe de trad |
|
| 80 | - else { |
|
| 81 | - $old_id_trad = sql_getfetsel('id_trad', $table_objet_sql, "$id_table_objet=" . (int) $id_objet); |
|
| 82 | - // supprimer le lien de traduction |
|
| 83 | - sql_updateq($table_objet_sql, ['id_trad' => 0], "$id_table_objet=" . (int) $id_objet); |
|
| 66 | + // $id_lier est le numero du groupe de traduction |
|
| 67 | + // Si l'objet vise n'est pas deja traduit, son identifiant devient |
|
| 68 | + // le nouvel id_trad de ce nouveau groupe et on l'affecte aux deux |
|
| 69 | + // objets |
|
| 70 | + if ($id_lier == 0) { |
|
| 71 | + sql_updateq($table_objet_sql, ['id_trad' => $id_trad], "$id_table_objet IN ($id_trad, $id_objet)"); |
|
| 72 | + } // si id_lier = id_objet alors on veut changer la reference de tout le groupe de trad |
|
| 73 | + elseif ($id_lier == $id_objet) { |
|
| 74 | + sql_updateq($table_objet_sql, ['id_trad' => $id_trad], "id_trad = $id_lier"); |
|
| 75 | + } // sinon ajouter notre objet dans le groupe |
|
| 76 | + else { |
|
| 77 | + sql_updateq($table_objet_sql, ['id_trad' => $id_lier], "$id_table_objet=" . (int) $id_objet); |
|
| 78 | + } |
|
| 79 | + } // on a fourni un id_trad nul : sortir id_objet du groupe de trad |
|
| 80 | + else { |
|
| 81 | + $old_id_trad = sql_getfetsel('id_trad', $table_objet_sql, "$id_table_objet=" . (int) $id_objet); |
|
| 82 | + // supprimer le lien de traduction |
|
| 83 | + sql_updateq($table_objet_sql, ['id_trad' => 0], "$id_table_objet=" . (int) $id_objet); |
|
| 84 | 84 | |
| 85 | - // Verifier si l'ancien groupe ne comporte plus qu'un seul objet. Alors mettre a zero. |
|
| 86 | - $cpt = sql_countsel($table_objet_sql, 'id_trad=' . (int) $old_id_trad); |
|
| 87 | - if ($cpt == 1) { |
|
| 88 | - sql_updateq($table_objet_sql, ['id_trad' => 0], 'id_trad=' . (int) $old_id_trad); |
|
| 89 | - } |
|
| 90 | - } |
|
| 85 | + // Verifier si l'ancien groupe ne comporte plus qu'un seul objet. Alors mettre a zero. |
|
| 86 | + $cpt = sql_countsel($table_objet_sql, 'id_trad=' . (int) $old_id_trad); |
|
| 87 | + if ($cpt == 1) { |
|
| 88 | + sql_updateq($table_objet_sql, ['id_trad' => 0], 'id_trad=' . (int) $old_id_trad); |
|
| 89 | + } |
|
| 90 | + } |
|
| 91 | 91 | |
| 92 | - return true; |
|
| 92 | + return true; |
|
| 93 | 93 | } |
@@ -55,7 +55,7 @@ discard block |
||
| 55 | 55 | $id_lier = sql_getfetsel( |
| 56 | 56 | 'id_trad', |
| 57 | 57 | $table_objet_sql, |
| 58 | - "$id_table_objet=" . (int) $id_trad . " AND NOT($id_table_objet=" . (int) $id_objet . ')' |
|
| 58 | + "$id_table_objet=".(int) $id_trad." AND NOT($id_table_objet=".(int) $id_objet.')' |
|
| 59 | 59 | ); |
| 60 | 60 | if ($id_lier === null) { |
| 61 | 61 | spip_log("echec lien de trad vers objet $objet/$id_objet incorrect ($id_trad)"); |
@@ -74,18 +74,18 @@ discard block |
||
| 74 | 74 | sql_updateq($table_objet_sql, ['id_trad' => $id_trad], "id_trad = $id_lier"); |
| 75 | 75 | } // sinon ajouter notre objet dans le groupe |
| 76 | 76 | else { |
| 77 | - sql_updateq($table_objet_sql, ['id_trad' => $id_lier], "$id_table_objet=" . (int) $id_objet); |
|
| 77 | + sql_updateq($table_objet_sql, ['id_trad' => $id_lier], "$id_table_objet=".(int) $id_objet); |
|
| 78 | 78 | } |
| 79 | 79 | } // on a fourni un id_trad nul : sortir id_objet du groupe de trad |
| 80 | 80 | else { |
| 81 | - $old_id_trad = sql_getfetsel('id_trad', $table_objet_sql, "$id_table_objet=" . (int) $id_objet); |
|
| 81 | + $old_id_trad = sql_getfetsel('id_trad', $table_objet_sql, "$id_table_objet=".(int) $id_objet); |
|
| 82 | 82 | // supprimer le lien de traduction |
| 83 | - sql_updateq($table_objet_sql, ['id_trad' => 0], "$id_table_objet=" . (int) $id_objet); |
|
| 83 | + sql_updateq($table_objet_sql, ['id_trad' => 0], "$id_table_objet=".(int) $id_objet); |
|
| 84 | 84 | |
| 85 | 85 | // Verifier si l'ancien groupe ne comporte plus qu'un seul objet. Alors mettre a zero. |
| 86 | - $cpt = sql_countsel($table_objet_sql, 'id_trad=' . (int) $old_id_trad); |
|
| 86 | + $cpt = sql_countsel($table_objet_sql, 'id_trad='.(int) $old_id_trad); |
|
| 87 | 87 | if ($cpt == 1) { |
| 88 | - sql_updateq($table_objet_sql, ['id_trad' => 0], 'id_trad=' . (int) $old_id_trad); |
|
| 88 | + sql_updateq($table_objet_sql, ['id_trad' => 0], 'id_trad='.(int) $old_id_trad); |
|
| 89 | 89 | } |
| 90 | 90 | } |
| 91 | 91 | |
@@ -75,7 +75,7 @@ discard block |
||
| 75 | 75 | $t = ($GLOBALS['taille_min'] * $GLOBALS['taille_min']); |
| 76 | 76 | if ($GLOBALS['taille_min'] !== $GLOBALS['taille_max']) { |
| 77 | 77 | $t *= 0.9; // marge de securite |
| 78 | - echo round($t / 1_000_000, 3) . ' Mpx'; |
|
| 78 | + echo round($t / 1_000_000, 3).' Mpx'; |
|
| 79 | 79 | } else { |
| 80 | 80 | // c'est un cas "on a reussi la borne max initiale, donc on a pas de limite connue" |
| 81 | 81 | $t = 0; |
@@ -111,19 +111,19 @@ discard block |
||
| 111 | 111 | $image_source = chemin_image('test.png'); |
| 112 | 112 | $GLOBALS['redirect'] = generer_url_action( |
| 113 | 113 | 'tester_taille', |
| 114 | - "i=$i&arg=" . $GLOBALS['taille_min'] . '-' . $GLOBALS['taille_test'] |
|
| 114 | + "i=$i&arg=".$GLOBALS['taille_min'].'-'.$GLOBALS['taille_test'] |
|
| 115 | 115 | ); |
| 116 | 116 | |
| 117 | 117 | ob_start('action_tester_taille_error_handler'); |
| 118 | 118 | filtrer('image_recadre', $image_source, $taille, $taille); |
| 119 | - $GLOBALS['redirect'] = generer_url_action('tester_taille', "i=$i&arg=$taille-" . $GLOBALS['taille_max']); |
|
| 119 | + $GLOBALS['redirect'] = generer_url_action('tester_taille', "i=$i&arg=$taille-".$GLOBALS['taille_max']); |
|
| 120 | 120 | |
| 121 | 121 | // si la valeur intermediaire a reussi, on teste la valeur maxi qui est peut etre sous estimee |
| 122 | 122 | // si $GLOBALS['taille_min']==0 (car on est au premier coup) |
| 123 | 123 | if ($GLOBALS['taille_min'] == 0) { |
| 124 | 124 | $taille = $GLOBALS['taille_max']; |
| 125 | 125 | filtrer('image_recadre', $image_source, $taille, $taille); |
| 126 | - $GLOBALS['redirect'] = generer_url_action('tester_taille', "i=$i&arg=$taille-" . $GLOBALS['taille_max']); |
|
| 126 | + $GLOBALS['redirect'] = generer_url_action('tester_taille', "i=$i&arg=$taille-".$GLOBALS['taille_max']); |
|
| 127 | 127 | } |
| 128 | 128 | ob_end_clean(); |
| 129 | 129 | |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | */ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | include_spip('inc/headers'); |
| 23 | 23 | |
@@ -34,12 +34,12 @@ discard block |
||
| 34 | 34 | * Sortie du buffer |
| 35 | 35 | **/ |
| 36 | 36 | function action_tester_taille_error_handler($output) { |
| 37 | - // on est ici, donc echec lors de la creation de l'image |
|
| 38 | - if (!empty($GLOBALS['redirect'])) { |
|
| 39 | - return redirige_formulaire($GLOBALS['redirect']); |
|
| 40 | - } |
|
| 37 | + // on est ici, donc echec lors de la creation de l'image |
|
| 38 | + if (!empty($GLOBALS['redirect'])) { |
|
| 39 | + return redirige_formulaire($GLOBALS['redirect']); |
|
| 40 | + } |
|
| 41 | 41 | |
| 42 | - return $output; |
|
| 42 | + return $output; |
|
| 43 | 43 | } |
| 44 | 44 | |
| 45 | 45 | |
@@ -57,77 +57,77 @@ discard block |
||
| 57 | 57 | **/ |
| 58 | 58 | function action_tester_taille_dist() { |
| 59 | 59 | |
| 60 | - if (!autoriser('configurer')) { |
|
| 61 | - return; |
|
| 62 | - } |
|
| 63 | - |
|
| 64 | - $taille = _request('arg'); |
|
| 65 | - $taille = explode('-', (string) $taille); |
|
| 66 | - |
|
| 67 | - $GLOBALS['taille_max'] = end($taille); |
|
| 68 | - $GLOBALS['taille_min'] = 0; |
|
| 69 | - if (count($taille) > 1) { |
|
| 70 | - $GLOBALS['taille_min'] = reset($taille); |
|
| 71 | - } |
|
| 72 | - |
|
| 73 | - // si l'intervalle est assez petit, on garde la valeur min |
|
| 74 | - if ($GLOBALS['taille_max'] * $GLOBALS['taille_max'] - $GLOBALS['taille_min'] * $GLOBALS['taille_min'] < 50000) { |
|
| 75 | - $t = ($GLOBALS['taille_min'] * $GLOBALS['taille_min']); |
|
| 76 | - if ($GLOBALS['taille_min'] !== $GLOBALS['taille_max']) { |
|
| 77 | - $t *= 0.9; // marge de securite |
|
| 78 | - echo round($t / 1_000_000, 3) . ' Mpx'; |
|
| 79 | - } else { |
|
| 80 | - // c'est un cas "on a reussi la borne max initiale, donc on a pas de limite connue" |
|
| 81 | - $t = 0; |
|
| 82 | - echo '∞'; |
|
| 83 | - } |
|
| 84 | - ecrire_meta('max_taille_vignettes', $t, 'non'); |
|
| 85 | - die(); |
|
| 86 | - } |
|
| 87 | - |
|
| 88 | - $taille = $GLOBALS['taille_test'] = round(($GLOBALS['taille_max'] + $GLOBALS['taille_min']) / 2); |
|
| 89 | - |
|
| 90 | - include_spip('inc/filtres'); |
|
| 91 | - // des inclusions representatives d'un hit prive et/ou public pour la conso memoire |
|
| 92 | - include_spip('public/assembler'); |
|
| 93 | - include_spip('public/balises'); |
|
| 94 | - include_spip('public/boucles'); |
|
| 95 | - include_spip('public/cacher'); |
|
| 96 | - include_spip('public/compiler'); |
|
| 97 | - include_spip('public/composer'); |
|
| 98 | - include_spip('public/criteres'); |
|
| 99 | - include_spip('public/interfaces'); |
|
| 100 | - include_spip('public/parametrer'); |
|
| 101 | - include_spip('public/phraser_html'); |
|
| 102 | - include_spip('public/references'); |
|
| 103 | - |
|
| 104 | - include_spip('inc/presentation'); |
|
| 105 | - include_spip('inc/charsets'); |
|
| 106 | - include_spip('inc/documents'); |
|
| 107 | - include_spip('inc/header'); |
|
| 108 | - propre('<doc1>'); // charger propre avec le trairement d'un modele |
|
| 109 | - |
|
| 110 | - $i = _request('i') + 1; |
|
| 111 | - $image_source = chemin_image('test.png'); |
|
| 112 | - $GLOBALS['redirect'] = generer_url_action( |
|
| 113 | - 'tester_taille', |
|
| 114 | - "i=$i&arg=" . $GLOBALS['taille_min'] . '-' . $GLOBALS['taille_test'] |
|
| 115 | - ); |
|
| 116 | - |
|
| 117 | - ob_start('action_tester_taille_error_handler'); |
|
| 118 | - filtrer('image_recadre', $image_source, $taille, $taille); |
|
| 119 | - $GLOBALS['redirect'] = generer_url_action('tester_taille', "i=$i&arg=$taille-" . $GLOBALS['taille_max']); |
|
| 120 | - |
|
| 121 | - // si la valeur intermediaire a reussi, on teste la valeur maxi qui est peut etre sous estimee |
|
| 122 | - // si $GLOBALS['taille_min']==0 (car on est au premier coup) |
|
| 123 | - if ($GLOBALS['taille_min'] == 0) { |
|
| 124 | - $taille = $GLOBALS['taille_max']; |
|
| 125 | - filtrer('image_recadre', $image_source, $taille, $taille); |
|
| 126 | - $GLOBALS['redirect'] = generer_url_action('tester_taille', "i=$i&arg=$taille-" . $GLOBALS['taille_max']); |
|
| 127 | - } |
|
| 128 | - ob_end_clean(); |
|
| 129 | - |
|
| 130 | - |
|
| 131 | - // on est ici, donc pas de plantage |
|
| 132 | - echo redirige_formulaire($GLOBALS['redirect']); |
|
| 60 | + if (!autoriser('configurer')) { |
|
| 61 | + return; |
|
| 62 | + } |
|
| 63 | + |
|
| 64 | + $taille = _request('arg'); |
|
| 65 | + $taille = explode('-', (string) $taille); |
|
| 66 | + |
|
| 67 | + $GLOBALS['taille_max'] = end($taille); |
|
| 68 | + $GLOBALS['taille_min'] = 0; |
|
| 69 | + if (count($taille) > 1) { |
|
| 70 | + $GLOBALS['taille_min'] = reset($taille); |
|
| 71 | + } |
|
| 72 | + |
|
| 73 | + // si l'intervalle est assez petit, on garde la valeur min |
|
| 74 | + if ($GLOBALS['taille_max'] * $GLOBALS['taille_max'] - $GLOBALS['taille_min'] * $GLOBALS['taille_min'] < 50000) { |
|
| 75 | + $t = ($GLOBALS['taille_min'] * $GLOBALS['taille_min']); |
|
| 76 | + if ($GLOBALS['taille_min'] !== $GLOBALS['taille_max']) { |
|
| 77 | + $t *= 0.9; // marge de securite |
|
| 78 | + echo round($t / 1_000_000, 3) . ' Mpx'; |
|
| 79 | + } else { |
|
| 80 | + // c'est un cas "on a reussi la borne max initiale, donc on a pas de limite connue" |
|
| 81 | + $t = 0; |
|
| 82 | + echo '∞'; |
|
| 83 | + } |
|
| 84 | + ecrire_meta('max_taille_vignettes', $t, 'non'); |
|
| 85 | + die(); |
|
| 86 | + } |
|
| 87 | + |
|
| 88 | + $taille = $GLOBALS['taille_test'] = round(($GLOBALS['taille_max'] + $GLOBALS['taille_min']) / 2); |
|
| 89 | + |
|
| 90 | + include_spip('inc/filtres'); |
|
| 91 | + // des inclusions representatives d'un hit prive et/ou public pour la conso memoire |
|
| 92 | + include_spip('public/assembler'); |
|
| 93 | + include_spip('public/balises'); |
|
| 94 | + include_spip('public/boucles'); |
|
| 95 | + include_spip('public/cacher'); |
|
| 96 | + include_spip('public/compiler'); |
|
| 97 | + include_spip('public/composer'); |
|
| 98 | + include_spip('public/criteres'); |
|
| 99 | + include_spip('public/interfaces'); |
|
| 100 | + include_spip('public/parametrer'); |
|
| 101 | + include_spip('public/phraser_html'); |
|
| 102 | + include_spip('public/references'); |
|
| 103 | + |
|
| 104 | + include_spip('inc/presentation'); |
|
| 105 | + include_spip('inc/charsets'); |
|
| 106 | + include_spip('inc/documents'); |
|
| 107 | + include_spip('inc/header'); |
|
| 108 | + propre('<doc1>'); // charger propre avec le trairement d'un modele |
|
| 109 | + |
|
| 110 | + $i = _request('i') + 1; |
|
| 111 | + $image_source = chemin_image('test.png'); |
|
| 112 | + $GLOBALS['redirect'] = generer_url_action( |
|
| 113 | + 'tester_taille', |
|
| 114 | + "i=$i&arg=" . $GLOBALS['taille_min'] . '-' . $GLOBALS['taille_test'] |
|
| 115 | + ); |
|
| 116 | + |
|
| 117 | + ob_start('action_tester_taille_error_handler'); |
|
| 118 | + filtrer('image_recadre', $image_source, $taille, $taille); |
|
| 119 | + $GLOBALS['redirect'] = generer_url_action('tester_taille', "i=$i&arg=$taille-" . $GLOBALS['taille_max']); |
|
| 120 | + |
|
| 121 | + // si la valeur intermediaire a reussi, on teste la valeur maxi qui est peut etre sous estimee |
|
| 122 | + // si $GLOBALS['taille_min']==0 (car on est au premier coup) |
|
| 123 | + if ($GLOBALS['taille_min'] == 0) { |
|
| 124 | + $taille = $GLOBALS['taille_max']; |
|
| 125 | + filtrer('image_recadre', $image_source, $taille, $taille); |
|
| 126 | + $GLOBALS['redirect'] = generer_url_action('tester_taille', "i=$i&arg=$taille-" . $GLOBALS['taille_max']); |
|
| 127 | + } |
|
| 128 | + ob_end_clean(); |
|
| 129 | + |
|
| 130 | + |
|
| 131 | + // on est ici, donc pas de plantage |
|
| 132 | + echo redirige_formulaire($GLOBALS['redirect']); |
|
| 133 | 133 | } |