@@ -11,129 +11,129 @@ |
||
| 11 | 11 | \***************************************************************************/ |
| 12 | 12 | |
| 13 | 13 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 14 | - return; |
|
| 14 | + return; |
|
| 15 | 15 | } |
| 16 | 16 | |
| 17 | 17 | function format_boucle_html($preaff, $avant, $nom, $type, $crit, $corps, $apres, $altern, $postaff, $prof) { |
| 18 | - $preaff = $preaff ? "<BB$nom>$preaff" : ''; |
|
| 19 | - $avant = $avant ? "<B$nom>$avant" : ''; |
|
| 20 | - $apres = $apres ? "$apres</B$nom>" : ''; |
|
| 21 | - $altern = $altern ? "$altern<//B$nom>" : ''; |
|
| 22 | - $postaff = $postaff ? "$postaff</BB$nom>" : ''; |
|
| 23 | - if (!$corps) { |
|
| 24 | - $corps = ' />'; |
|
| 25 | - } else { |
|
| 26 | - $corps = ">$corps</BOUCLE$nom>"; |
|
| 27 | - } |
|
| 28 | - |
|
| 29 | - return "$preaff$avant<BOUCLE$nom($type)$crit$corps$apres$altern$postaff"; |
|
| 18 | + $preaff = $preaff ? "<BB$nom>$preaff" : ''; |
|
| 19 | + $avant = $avant ? "<B$nom>$avant" : ''; |
|
| 20 | + $apres = $apres ? "$apres</B$nom>" : ''; |
|
| 21 | + $altern = $altern ? "$altern<//B$nom>" : ''; |
|
| 22 | + $postaff = $postaff ? "$postaff</BB$nom>" : ''; |
|
| 23 | + if (!$corps) { |
|
| 24 | + $corps = ' />'; |
|
| 25 | + } else { |
|
| 26 | + $corps = ">$corps</BOUCLE$nom>"; |
|
| 27 | + } |
|
| 28 | + |
|
| 29 | + return "$preaff$avant<BOUCLE$nom($type)$crit$corps$apres$altern$postaff"; |
|
| 30 | 30 | } |
| 31 | 31 | |
| 32 | 32 | function format_inclure_html($file, $args, $prof) { |
| 33 | - if (strpos($file, '#') === false) { |
|
| 34 | - $t = $file ? ('(' . $file . ')') : ''; |
|
| 35 | - } else { |
|
| 36 | - $t = '{fond=' . $file . '}'; |
|
| 37 | - } |
|
| 38 | - $args = !$args ? '' : ('{' . join(', ', $args) . '}'); |
|
| 39 | - |
|
| 40 | - return ('<INCLURE' . $t . $args . '>'); |
|
| 33 | + if (strpos($file, '#') === false) { |
|
| 34 | + $t = $file ? ('(' . $file . ')') : ''; |
|
| 35 | + } else { |
|
| 36 | + $t = '{fond=' . $file . '}'; |
|
| 37 | + } |
|
| 38 | + $args = !$args ? '' : ('{' . join(', ', $args) . '}'); |
|
| 39 | + |
|
| 40 | + return ('<INCLURE' . $t . $args . '>'); |
|
| 41 | 41 | } |
| 42 | 42 | |
| 43 | 43 | function format_polyglotte_html($args, $prof) { |
| 44 | - $contenu = []; |
|
| 45 | - foreach ($args as $l => $t) { |
|
| 46 | - $contenu[] = ($l ? "[$l]" : '') . $t; |
|
| 47 | - } |
|
| 44 | + $contenu = []; |
|
| 45 | + foreach ($args as $l => $t) { |
|
| 46 | + $contenu[] = ($l ? "[$l]" : '') . $t; |
|
| 47 | + } |
|
| 48 | 48 | |
| 49 | - return ('<multi>' . join(' ', $contenu) . '</multi>'); |
|
| 49 | + return ('<multi>' . join(' ', $contenu) . '</multi>'); |
|
| 50 | 50 | } |
| 51 | 51 | |
| 52 | 52 | function format_idiome_html($nom, $module, $args, $filtres, $prof) { |
| 53 | - foreach ($args as $k => $v) { |
|
| 54 | - $args[$k] = "$k=$v"; |
|
| 55 | - } |
|
| 56 | - $args = (!$args ? '' : ('{' . join(',', $args) . '}')); |
|
| 53 | + foreach ($args as $k => $v) { |
|
| 54 | + $args[$k] = "$k=$v"; |
|
| 55 | + } |
|
| 56 | + $args = (!$args ? '' : ('{' . join(',', $args) . '}')); |
|
| 57 | 57 | |
| 58 | - return ('<:' . ($module ? "$module:" : '') . $nom . $args . $filtres . ':>'); |
|
| 58 | + return ('<:' . ($module ? "$module:" : '') . $nom . $args . $filtres . ':>'); |
|
| 59 | 59 | } |
| 60 | 60 | |
| 61 | 61 | function format_champ_html($nom, $boucle, $etoile, $avant, $apres, $args, $filtres, $prof) { |
| 62 | - $nom = '#' |
|
| 63 | - . ($boucle ? ($boucle . ':') : '') |
|
| 64 | - . $nom |
|
| 65 | - . $etoile |
|
| 66 | - . $args |
|
| 67 | - . $filtres; |
|
| 62 | + $nom = '#' |
|
| 63 | + . ($boucle ? ($boucle . ':') : '') |
|
| 64 | + . $nom |
|
| 65 | + . $etoile |
|
| 66 | + . $args |
|
| 67 | + . $filtres; |
|
| 68 | 68 | |
| 69 | - // Determiner si c'est un champ etendu, |
|
| 69 | + // Determiner si c'est un champ etendu, |
|
| 70 | 70 | |
| 71 | - $s = ($avant or $apres or $filtres |
|
| 72 | - or (strpos($args, '(#') !== false)); |
|
| 71 | + $s = ($avant or $apres or $filtres |
|
| 72 | + or (strpos($args, '(#') !== false)); |
|
| 73 | 73 | |
| 74 | - return ($s ? "[$avant($nom)$apres]" : $nom); |
|
| 74 | + return ($s ? "[$avant($nom)$apres]" : $nom); |
|
| 75 | 75 | } |
| 76 | 76 | |
| 77 | 77 | function format_critere_html($critere) { |
| 78 | - foreach ($critere as $k => $crit) { |
|
| 79 | - $crit_s = ''; |
|
| 80 | - foreach ($crit as $operande) { |
|
| 81 | - list($type, $valeur) = $operande; |
|
| 82 | - if ($type == 'champ' and $valeur[0] == '[') { |
|
| 83 | - $valeur = substr($valeur, 1, -1); |
|
| 84 | - if (preg_match(',^[(](#[^|]*)[)]$,sS', $valeur)) { |
|
| 85 | - $valeur = substr($valeur, 1, -1); |
|
| 86 | - } |
|
| 87 | - } |
|
| 88 | - $crit_s .= $valeur; |
|
| 89 | - } |
|
| 90 | - $critere[$k] = $crit_s; |
|
| 91 | - } |
|
| 92 | - |
|
| 93 | - return (!$critere ? '' : ('{' . join(',', $critere) . '}')); |
|
| 78 | + foreach ($critere as $k => $crit) { |
|
| 79 | + $crit_s = ''; |
|
| 80 | + foreach ($crit as $operande) { |
|
| 81 | + list($type, $valeur) = $operande; |
|
| 82 | + if ($type == 'champ' and $valeur[0] == '[') { |
|
| 83 | + $valeur = substr($valeur, 1, -1); |
|
| 84 | + if (preg_match(',^[(](#[^|]*)[)]$,sS', $valeur)) { |
|
| 85 | + $valeur = substr($valeur, 1, -1); |
|
| 86 | + } |
|
| 87 | + } |
|
| 88 | + $crit_s .= $valeur; |
|
| 89 | + } |
|
| 90 | + $critere[$k] = $crit_s; |
|
| 91 | + } |
|
| 92 | + |
|
| 93 | + return (!$critere ? '' : ('{' . join(',', $critere) . '}')); |
|
| 94 | 94 | } |
| 95 | 95 | |
| 96 | 96 | function format_liste_html($fonc, $args, $prof) { |
| 97 | - return ((($fonc !== '') ? "|$fonc" : $fonc) |
|
| 98 | - . (!$args ? '' : ('{' . join(',', $args) . '}'))); |
|
| 97 | + return ((($fonc !== '') ? "|$fonc" : $fonc) |
|
| 98 | + . (!$args ? '' : ('{' . join(',', $args) . '}'))); |
|
| 99 | 99 | } |
| 100 | 100 | |
| 101 | 101 | // Concatenation sans separateur: verifier qu'on ne cree pas de faux lexemes |
| 102 | 102 | function format_suite_html($args) { |
| 103 | - for ($i = 0; $i < count($args) - 1; $i++) { |
|
| 104 | - list($texte, $type) = $args[$i]; |
|
| 105 | - list($texte2, $type2) = $args[$i + 1]; |
|
| 106 | - if (!$texte or !$texte2) { |
|
| 107 | - continue; |
|
| 108 | - } |
|
| 109 | - $c1 = substr($texte, -1); |
|
| 110 | - if ($type2 !== 'texte') { |
|
| 111 | - // si un texte se termine par ( et est suivi d'un champ |
|
| 112 | - // ou assimiles, forcer la notation pleine |
|
| 113 | - if ($c1 == '(' and substr($texte2, 0, 1) == '#') { |
|
| 114 | - $args[$i + 1][0] = '[(' . $texte2 . ')]'; |
|
| 115 | - } |
|
| 116 | - } else { |
|
| 117 | - if ($type == 'texte') { |
|
| 118 | - continue; |
|
| 119 | - } |
|
| 120 | - // si un champ ou assimiles est suivi d'un texte |
|
| 121 | - // et si celui-ci commence par un caractere de champ |
|
| 122 | - // forcer la notation pleine |
|
| 123 | - if ( |
|
| 124 | - ($c1 == '}' and substr(ltrim($texte2), 0, 1) == '|') |
|
| 125 | - or (preg_match('/[\w\d_*]/', $c1) and preg_match('/^[\w\d_*{|]/', $texte2)) |
|
| 126 | - ) { |
|
| 127 | - $args[$i][0] = '[(' . $texte . ')]'; |
|
| 128 | - } |
|
| 129 | - } |
|
| 130 | - } |
|
| 131 | - |
|
| 132 | - return join('', array_map(function ($arg) { |
|
| 133 | - return reset($arg); |
|
| 134 | - }, $args)); |
|
| 103 | + for ($i = 0; $i < count($args) - 1; $i++) { |
|
| 104 | + list($texte, $type) = $args[$i]; |
|
| 105 | + list($texte2, $type2) = $args[$i + 1]; |
|
| 106 | + if (!$texte or !$texte2) { |
|
| 107 | + continue; |
|
| 108 | + } |
|
| 109 | + $c1 = substr($texte, -1); |
|
| 110 | + if ($type2 !== 'texte') { |
|
| 111 | + // si un texte se termine par ( et est suivi d'un champ |
|
| 112 | + // ou assimiles, forcer la notation pleine |
|
| 113 | + if ($c1 == '(' and substr($texte2, 0, 1) == '#') { |
|
| 114 | + $args[$i + 1][0] = '[(' . $texte2 . ')]'; |
|
| 115 | + } |
|
| 116 | + } else { |
|
| 117 | + if ($type == 'texte') { |
|
| 118 | + continue; |
|
| 119 | + } |
|
| 120 | + // si un champ ou assimiles est suivi d'un texte |
|
| 121 | + // et si celui-ci commence par un caractere de champ |
|
| 122 | + // forcer la notation pleine |
|
| 123 | + if ( |
|
| 124 | + ($c1 == '}' and substr(ltrim($texte2), 0, 1) == '|') |
|
| 125 | + or (preg_match('/[\w\d_*]/', $c1) and preg_match('/^[\w\d_*{|]/', $texte2)) |
|
| 126 | + ) { |
|
| 127 | + $args[$i][0] = '[(' . $texte . ')]'; |
|
| 128 | + } |
|
| 129 | + } |
|
| 130 | + } |
|
| 131 | + |
|
| 132 | + return join('', array_map(function ($arg) { |
|
| 133 | + return reset($arg); |
|
| 134 | + }, $args)); |
|
| 135 | 135 | } |
| 136 | 136 | |
| 137 | 137 | function format_texte_html($texte) { |
| 138 | - return $texte; |
|
| 138 | + return $texte; |
|
| 139 | 139 | } |
@@ -31,36 +31,36 @@ discard block |
||
| 31 | 31 | |
| 32 | 32 | function format_inclure_html($file, $args, $prof) { |
| 33 | 33 | if (strpos($file, '#') === false) { |
| 34 | - $t = $file ? ('(' . $file . ')') : ''; |
|
| 34 | + $t = $file ? ('('.$file.')') : ''; |
|
| 35 | 35 | } else { |
| 36 | - $t = '{fond=' . $file . '}'; |
|
| 36 | + $t = '{fond='.$file.'}'; |
|
| 37 | 37 | } |
| 38 | - $args = !$args ? '' : ('{' . join(', ', $args) . '}'); |
|
| 38 | + $args = !$args ? '' : ('{'.join(', ', $args).'}'); |
|
| 39 | 39 | |
| 40 | - return ('<INCLURE' . $t . $args . '>'); |
|
| 40 | + return ('<INCLURE'.$t.$args.'>'); |
|
| 41 | 41 | } |
| 42 | 42 | |
| 43 | 43 | function format_polyglotte_html($args, $prof) { |
| 44 | 44 | $contenu = []; |
| 45 | 45 | foreach ($args as $l => $t) { |
| 46 | - $contenu[] = ($l ? "[$l]" : '') . $t; |
|
| 46 | + $contenu[] = ($l ? "[$l]" : '').$t; |
|
| 47 | 47 | } |
| 48 | 48 | |
| 49 | - return ('<multi>' . join(' ', $contenu) . '</multi>'); |
|
| 49 | + return ('<multi>'.join(' ', $contenu).'</multi>'); |
|
| 50 | 50 | } |
| 51 | 51 | |
| 52 | 52 | function format_idiome_html($nom, $module, $args, $filtres, $prof) { |
| 53 | 53 | foreach ($args as $k => $v) { |
| 54 | 54 | $args[$k] = "$k=$v"; |
| 55 | 55 | } |
| 56 | - $args = (!$args ? '' : ('{' . join(',', $args) . '}')); |
|
| 56 | + $args = (!$args ? '' : ('{'.join(',', $args).'}')); |
|
| 57 | 57 | |
| 58 | - return ('<:' . ($module ? "$module:" : '') . $nom . $args . $filtres . ':>'); |
|
| 58 | + return ('<:'.($module ? "$module:" : '').$nom.$args.$filtres.':>'); |
|
| 59 | 59 | } |
| 60 | 60 | |
| 61 | 61 | function format_champ_html($nom, $boucle, $etoile, $avant, $apres, $args, $filtres, $prof) { |
| 62 | 62 | $nom = '#' |
| 63 | - . ($boucle ? ($boucle . ':') : '') |
|
| 63 | + . ($boucle ? ($boucle.':') : '') |
|
| 64 | 64 | . $nom |
| 65 | 65 | . $etoile |
| 66 | 66 | . $args |
@@ -90,12 +90,12 @@ discard block |
||
| 90 | 90 | $critere[$k] = $crit_s; |
| 91 | 91 | } |
| 92 | 92 | |
| 93 | - return (!$critere ? '' : ('{' . join(',', $critere) . '}')); |
|
| 93 | + return (!$critere ? '' : ('{'.join(',', $critere).'}')); |
|
| 94 | 94 | } |
| 95 | 95 | |
| 96 | 96 | function format_liste_html($fonc, $args, $prof) { |
| 97 | 97 | return ((($fonc !== '') ? "|$fonc" : $fonc) |
| 98 | - . (!$args ? '' : ('{' . join(',', $args) . '}'))); |
|
| 98 | + . (!$args ? '' : ('{'.join(',', $args).'}'))); |
|
| 99 | 99 | } |
| 100 | 100 | |
| 101 | 101 | // Concatenation sans separateur: verifier qu'on ne cree pas de faux lexemes |
@@ -111,7 +111,7 @@ discard block |
||
| 111 | 111 | // si un texte se termine par ( et est suivi d'un champ |
| 112 | 112 | // ou assimiles, forcer la notation pleine |
| 113 | 113 | if ($c1 == '(' and substr($texte2, 0, 1) == '#') { |
| 114 | - $args[$i + 1][0] = '[(' . $texte2 . ')]'; |
|
| 114 | + $args[$i + 1][0] = '[('.$texte2.')]'; |
|
| 115 | 115 | } |
| 116 | 116 | } else { |
| 117 | 117 | if ($type == 'texte') { |
@@ -124,12 +124,12 @@ discard block |
||
| 124 | 124 | ($c1 == '}' and substr(ltrim($texte2), 0, 1) == '|') |
| 125 | 125 | or (preg_match('/[\w\d_*]/', $c1) and preg_match('/^[\w\d_*{|]/', $texte2)) |
| 126 | 126 | ) { |
| 127 | - $args[$i][0] = '[(' . $texte . ')]'; |
|
| 127 | + $args[$i][0] = '[('.$texte.')]'; |
|
| 128 | 128 | } |
| 129 | 129 | } |
| 130 | 130 | } |
| 131 | 131 | |
| 132 | - return join('', array_map(function ($arg) { |
|
| 132 | + return join('', array_map(function($arg) { |
|
| 133 | 133 | return reset($arg); |
| 134 | 134 | }, $args)); |
| 135 | 135 | } |
@@ -19,7 +19,7 @@ discard block |
||
| 19 | 19 | * @package SPIP\Core\Public\Styliser |
| 20 | 20 | **/ |
| 21 | 21 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 22 | - return; |
|
| 22 | + return; |
|
| 23 | 23 | } |
| 24 | 24 | |
| 25 | 25 | /** |
@@ -29,193 +29,193 @@ discard block |
||
| 29 | 29 | * @return array Données modifiées du pipeline |
| 30 | 30 | */ |
| 31 | 31 | function public_styliser_par_z_dist($flux) { |
| 32 | - static $prefix_path = null; |
|
| 33 | - static $prefix_length; |
|
| 34 | - static $z_blocs; |
|
| 35 | - static $apl_constant; |
|
| 36 | - static $page; |
|
| 37 | - static $disponible = []; |
|
| 38 | - static $echafauder; |
|
| 39 | - static $prepend = ''; |
|
| 40 | - |
|
| 41 | - if (!isset($prefix_path)) { |
|
| 42 | - $z_blocs = z_blocs(test_espace_prive()); |
|
| 43 | - if (test_espace_prive()) { |
|
| 44 | - $prefix_path = 'prive/squelettes/'; |
|
| 45 | - $prefix_length = strlen($prefix_path); |
|
| 46 | - $apl_constant = '_ECRIRE_AJAX_PARALLEL_LOAD'; |
|
| 47 | - $page = 'exec'; |
|
| 48 | - $echafauder = charger_fonction('echafauder', 'prive', true); |
|
| 49 | - define('_ZCORE_EXCLURE_PATH', ''); |
|
| 50 | - } else { |
|
| 51 | - $prefix_path = ''; |
|
| 52 | - $prefix_length = 0; |
|
| 53 | - $apl_constant = '_Z_AJAX_PARALLEL_LOAD'; |
|
| 54 | - $page = _SPIP_PAGE; |
|
| 55 | - $echafauder = charger_fonction('echafauder', 'public', true); |
|
| 56 | - define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist' . (defined('_DIR_PLUGIN_DIST') ? '|\b' . rtrim( |
|
| 57 | - _DIR_PLUGIN_DIST, |
|
| 58 | - '/' |
|
| 59 | - ) : '')); |
|
| 60 | - } |
|
| 61 | - $prepend = (defined('_Z_PREPEND_PATH') ? _Z_PREPEND_PATH : ''); |
|
| 62 | - } |
|
| 63 | - $z_contenu = reset($z_blocs); // contenu par defaut |
|
| 64 | - |
|
| 65 | - $fond = $flux['args']['fond']; |
|
| 66 | - |
|
| 67 | - if ($prepend or strncmp($fond, $prefix_path, $prefix_length) == 0) { |
|
| 68 | - $fond = substr($fond, $prefix_length); |
|
| 69 | - $squelette = $flux['data']; |
|
| 70 | - $ext = $flux['args']['ext']; |
|
| 71 | - // Ajax Parallel loading : ne pas calculer le bloc, mais renvoyer un js qui le loadera en ajax |
|
| 72 | - if ( |
|
| 73 | - defined('_Z_AJAX_PARALLEL_LOAD_OK') |
|
| 74 | - and $dir = explode('/', $fond) |
|
| 75 | - and count($dir) == 2 // pas un sous repertoire |
|
| 76 | - and $dir = reset($dir) |
|
| 77 | - and in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z |
|
| 78 | - and defined($apl_constant) |
|
| 79 | - and in_array($dir, explode(',', constant($apl_constant))) // et dans un demande en APL |
|
| 80 | - and $pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext) // et qui contient le squelette APL |
|
| 81 | - ) { |
|
| 82 | - $flux['data'] = $pipe; |
|
| 83 | - |
|
| 84 | - return $flux; |
|
| 85 | - } |
|
| 86 | - |
|
| 87 | - // surcharger aussi les squelettes venant de squelettes-dist/ |
|
| 88 | - if ($squelette and !z_fond_valide($squelette)) { |
|
| 89 | - $squelette = ''; |
|
| 90 | - $echafauder = ''; |
|
| 91 | - } |
|
| 92 | - if ($prepend) { |
|
| 93 | - $squelette = substr(find_in_path($prefix_path . $prepend . "$fond.$ext"), 0, -strlen(".$ext")); |
|
| 94 | - if ($squelette) { |
|
| 95 | - $flux['data'] = $squelette; |
|
| 96 | - } |
|
| 97 | - } |
|
| 98 | - |
|
| 99 | - // gerer les squelettes non trouves |
|
| 100 | - // -> router vers les /dist.html |
|
| 101 | - // ou scaffolding ou page automatique les contenus |
|
| 102 | - if (!$squelette) { |
|
| 103 | - // si on est sur un ?page=XX non trouve |
|
| 104 | - if ( |
|
| 105 | - (isset($flux['args']['contexte'][$page]) |
|
| 106 | - and $flux['args']['contexte'][$page] == $fond) |
|
| 107 | - or (isset($flux['args']['contexte']['type-page']) |
|
| 108 | - and $flux['args']['contexte']['type-page'] == $fond) |
|
| 109 | - or ($fond == 'sommaire' |
|
| 110 | - and (!isset($flux['args']['contexte'][$page]) or !$flux['args']['contexte'][$page])) |
|
| 111 | - ) { |
|
| 112 | - // si on est sur un ?page=XX non trouve |
|
| 113 | - // se brancher sur contenu/xx si il existe |
|
| 114 | - // ou si c'est un objet spip, associe a une table, utiliser le fond homonyme |
|
| 115 | - if (!isset($disponible[$fond])) { |
|
| 116 | - $disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, $echafauder); |
|
| 117 | - } |
|
| 118 | - |
|
| 119 | - if ($disponible[$fond]) { |
|
| 120 | - $flux['data'] = substr(find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext")); |
|
| 121 | - } |
|
| 122 | - } |
|
| 123 | - |
|
| 124 | - // echafaudage : |
|
| 125 | - // si c'est un fond de contenu d'un objet en base |
|
| 126 | - // generer un fond automatique a la volee pour les webmestres |
|
| 127 | - elseif (strncmp($fond, "$z_contenu/", strlen($z_contenu) + 1) == 0) { |
|
| 128 | - $type = substr($fond, strlen($z_contenu) + 1); |
|
| 129 | - if (($type == 'page') and isset($flux['args']['contexte'][$page])) { |
|
| 130 | - $type = $flux['args']['contexte'][$page]; |
|
| 131 | - } |
|
| 132 | - if (!isset($disponible[$type])) { |
|
| 133 | - $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder); |
|
| 134 | - } |
|
| 135 | - if (is_string($disponible[$type])) { |
|
| 136 | - $flux['data'] = $disponible[$type]; |
|
| 137 | - } elseif ( |
|
| 138 | - $echafauder |
|
| 139 | - and include_spip('inc/autoriser') |
|
| 140 | - and isset($GLOBALS['visiteur_session']['statut']) // performance |
|
| 141 | - and autoriser('echafauder', $type) |
|
| 142 | - and $is = $disponible[$type] |
|
| 143 | - and is_array($is) |
|
| 144 | - ) { |
|
| 145 | - $flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext); |
|
| 146 | - } else { |
|
| 147 | - $flux['data'] = ($disponible['404'] = z_contenu_disponible( |
|
| 148 | - $prefix_path . $prepend, |
|
| 149 | - $z_contenu, |
|
| 150 | - '404', |
|
| 151 | - $ext, |
|
| 152 | - $echafauder |
|
| 153 | - )); |
|
| 154 | - } |
|
| 155 | - } |
|
| 156 | - |
|
| 157 | - // sinon, si on demande un fond non trouve dans un des autres blocs |
|
| 158 | - // et si il y a bien un contenu correspondant ou echafaudable |
|
| 159 | - // se rabbatre sur le dist.html du bloc concerne |
|
| 160 | - else { |
|
| 161 | - if ( |
|
| 162 | - $dir = explode('/', $fond) |
|
| 163 | - and $dir = reset($dir) |
|
| 164 | - and $dir !== $z_contenu |
|
| 165 | - and in_array($dir, $z_blocs) |
|
| 166 | - ) { |
|
| 167 | - $type = substr($fond, strlen("$dir/")); |
|
| 168 | - if (($type == 'page') and isset($flux['args']['contexte'][$page])) { |
|
| 169 | - $type = $flux['args']['contexte'][$page]; |
|
| 170 | - } |
|
| 171 | - if ($type !== 'page' and !isset($disponible[$type])) { |
|
| 172 | - $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder); |
|
| 173 | - } |
|
| 174 | - if ($type == 'page' or $disponible[$type]) { |
|
| 175 | - $flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext); |
|
| 176 | - } |
|
| 177 | - } |
|
| 178 | - } |
|
| 179 | - $squelette = $flux['data']; |
|
| 180 | - } |
|
| 181 | - // layout specifiques par type et compositions : |
|
| 182 | - // body-article.html |
|
| 183 | - // body-sommaire.html |
|
| 184 | - // pour des raisons de perfo, les declinaisons doivent etre dans le |
|
| 185 | - // meme dossier que body.html |
|
| 186 | - if ($fond == 'body' and substr($squelette, -strlen($fond)) == $fond) { |
|
| 187 | - if ( |
|
| 188 | - isset($flux['args']['contexte']['type-page']) |
|
| 189 | - and ( |
|
| 190 | - (isset($flux['args']['contexte']['composition']) |
|
| 191 | - and file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext")) |
|
| 192 | - or |
|
| 193 | - file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext") |
|
| 194 | - ) |
|
| 195 | - ) { |
|
| 196 | - $flux['data'] = $f; |
|
| 197 | - } |
|
| 198 | - } elseif ( |
|
| 199 | - $fond == 'structure' |
|
| 200 | - and z_sanitize_var_zajax() |
|
| 201 | - and $f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext") |
|
| 202 | - ) { |
|
| 203 | - $flux['data'] = substr($f, 0, -strlen(".$ext")); |
|
| 204 | - } // chercher le fond correspondant a la composition |
|
| 205 | - elseif ( |
|
| 206 | - isset($flux['args']['contexte']['composition']) |
|
| 207 | - and (basename($fond) == 'page' or ($squelette and substr($squelette, -strlen($fond)) == $fond)) |
|
| 208 | - and $dir = substr($fond, $prefix_length) |
|
| 209 | - and $dir = explode('/', $dir) |
|
| 210 | - and $dir = reset($dir) |
|
| 211 | - and in_array($dir, $z_blocs) |
|
| 212 | - and $f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext") |
|
| 213 | - ) { |
|
| 214 | - $flux['data'] = substr($f, 0, -strlen(".$ext")); |
|
| 215 | - } |
|
| 216 | - } |
|
| 217 | - |
|
| 218 | - return $flux; |
|
| 32 | + static $prefix_path = null; |
|
| 33 | + static $prefix_length; |
|
| 34 | + static $z_blocs; |
|
| 35 | + static $apl_constant; |
|
| 36 | + static $page; |
|
| 37 | + static $disponible = []; |
|
| 38 | + static $echafauder; |
|
| 39 | + static $prepend = ''; |
|
| 40 | + |
|
| 41 | + if (!isset($prefix_path)) { |
|
| 42 | + $z_blocs = z_blocs(test_espace_prive()); |
|
| 43 | + if (test_espace_prive()) { |
|
| 44 | + $prefix_path = 'prive/squelettes/'; |
|
| 45 | + $prefix_length = strlen($prefix_path); |
|
| 46 | + $apl_constant = '_ECRIRE_AJAX_PARALLEL_LOAD'; |
|
| 47 | + $page = 'exec'; |
|
| 48 | + $echafauder = charger_fonction('echafauder', 'prive', true); |
|
| 49 | + define('_ZCORE_EXCLURE_PATH', ''); |
|
| 50 | + } else { |
|
| 51 | + $prefix_path = ''; |
|
| 52 | + $prefix_length = 0; |
|
| 53 | + $apl_constant = '_Z_AJAX_PARALLEL_LOAD'; |
|
| 54 | + $page = _SPIP_PAGE; |
|
| 55 | + $echafauder = charger_fonction('echafauder', 'public', true); |
|
| 56 | + define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist' . (defined('_DIR_PLUGIN_DIST') ? '|\b' . rtrim( |
|
| 57 | + _DIR_PLUGIN_DIST, |
|
| 58 | + '/' |
|
| 59 | + ) : '')); |
|
| 60 | + } |
|
| 61 | + $prepend = (defined('_Z_PREPEND_PATH') ? _Z_PREPEND_PATH : ''); |
|
| 62 | + } |
|
| 63 | + $z_contenu = reset($z_blocs); // contenu par defaut |
|
| 64 | + |
|
| 65 | + $fond = $flux['args']['fond']; |
|
| 66 | + |
|
| 67 | + if ($prepend or strncmp($fond, $prefix_path, $prefix_length) == 0) { |
|
| 68 | + $fond = substr($fond, $prefix_length); |
|
| 69 | + $squelette = $flux['data']; |
|
| 70 | + $ext = $flux['args']['ext']; |
|
| 71 | + // Ajax Parallel loading : ne pas calculer le bloc, mais renvoyer un js qui le loadera en ajax |
|
| 72 | + if ( |
|
| 73 | + defined('_Z_AJAX_PARALLEL_LOAD_OK') |
|
| 74 | + and $dir = explode('/', $fond) |
|
| 75 | + and count($dir) == 2 // pas un sous repertoire |
|
| 76 | + and $dir = reset($dir) |
|
| 77 | + and in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z |
|
| 78 | + and defined($apl_constant) |
|
| 79 | + and in_array($dir, explode(',', constant($apl_constant))) // et dans un demande en APL |
|
| 80 | + and $pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext) // et qui contient le squelette APL |
|
| 81 | + ) { |
|
| 82 | + $flux['data'] = $pipe; |
|
| 83 | + |
|
| 84 | + return $flux; |
|
| 85 | + } |
|
| 86 | + |
|
| 87 | + // surcharger aussi les squelettes venant de squelettes-dist/ |
|
| 88 | + if ($squelette and !z_fond_valide($squelette)) { |
|
| 89 | + $squelette = ''; |
|
| 90 | + $echafauder = ''; |
|
| 91 | + } |
|
| 92 | + if ($prepend) { |
|
| 93 | + $squelette = substr(find_in_path($prefix_path . $prepend . "$fond.$ext"), 0, -strlen(".$ext")); |
|
| 94 | + if ($squelette) { |
|
| 95 | + $flux['data'] = $squelette; |
|
| 96 | + } |
|
| 97 | + } |
|
| 98 | + |
|
| 99 | + // gerer les squelettes non trouves |
|
| 100 | + // -> router vers les /dist.html |
|
| 101 | + // ou scaffolding ou page automatique les contenus |
|
| 102 | + if (!$squelette) { |
|
| 103 | + // si on est sur un ?page=XX non trouve |
|
| 104 | + if ( |
|
| 105 | + (isset($flux['args']['contexte'][$page]) |
|
| 106 | + and $flux['args']['contexte'][$page] == $fond) |
|
| 107 | + or (isset($flux['args']['contexte']['type-page']) |
|
| 108 | + and $flux['args']['contexte']['type-page'] == $fond) |
|
| 109 | + or ($fond == 'sommaire' |
|
| 110 | + and (!isset($flux['args']['contexte'][$page]) or !$flux['args']['contexte'][$page])) |
|
| 111 | + ) { |
|
| 112 | + // si on est sur un ?page=XX non trouve |
|
| 113 | + // se brancher sur contenu/xx si il existe |
|
| 114 | + // ou si c'est un objet spip, associe a une table, utiliser le fond homonyme |
|
| 115 | + if (!isset($disponible[$fond])) { |
|
| 116 | + $disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, $echafauder); |
|
| 117 | + } |
|
| 118 | + |
|
| 119 | + if ($disponible[$fond]) { |
|
| 120 | + $flux['data'] = substr(find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext")); |
|
| 121 | + } |
|
| 122 | + } |
|
| 123 | + |
|
| 124 | + // echafaudage : |
|
| 125 | + // si c'est un fond de contenu d'un objet en base |
|
| 126 | + // generer un fond automatique a la volee pour les webmestres |
|
| 127 | + elseif (strncmp($fond, "$z_contenu/", strlen($z_contenu) + 1) == 0) { |
|
| 128 | + $type = substr($fond, strlen($z_contenu) + 1); |
|
| 129 | + if (($type == 'page') and isset($flux['args']['contexte'][$page])) { |
|
| 130 | + $type = $flux['args']['contexte'][$page]; |
|
| 131 | + } |
|
| 132 | + if (!isset($disponible[$type])) { |
|
| 133 | + $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder); |
|
| 134 | + } |
|
| 135 | + if (is_string($disponible[$type])) { |
|
| 136 | + $flux['data'] = $disponible[$type]; |
|
| 137 | + } elseif ( |
|
| 138 | + $echafauder |
|
| 139 | + and include_spip('inc/autoriser') |
|
| 140 | + and isset($GLOBALS['visiteur_session']['statut']) // performance |
|
| 141 | + and autoriser('echafauder', $type) |
|
| 142 | + and $is = $disponible[$type] |
|
| 143 | + and is_array($is) |
|
| 144 | + ) { |
|
| 145 | + $flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext); |
|
| 146 | + } else { |
|
| 147 | + $flux['data'] = ($disponible['404'] = z_contenu_disponible( |
|
| 148 | + $prefix_path . $prepend, |
|
| 149 | + $z_contenu, |
|
| 150 | + '404', |
|
| 151 | + $ext, |
|
| 152 | + $echafauder |
|
| 153 | + )); |
|
| 154 | + } |
|
| 155 | + } |
|
| 156 | + |
|
| 157 | + // sinon, si on demande un fond non trouve dans un des autres blocs |
|
| 158 | + // et si il y a bien un contenu correspondant ou echafaudable |
|
| 159 | + // se rabbatre sur le dist.html du bloc concerne |
|
| 160 | + else { |
|
| 161 | + if ( |
|
| 162 | + $dir = explode('/', $fond) |
|
| 163 | + and $dir = reset($dir) |
|
| 164 | + and $dir !== $z_contenu |
|
| 165 | + and in_array($dir, $z_blocs) |
|
| 166 | + ) { |
|
| 167 | + $type = substr($fond, strlen("$dir/")); |
|
| 168 | + if (($type == 'page') and isset($flux['args']['contexte'][$page])) { |
|
| 169 | + $type = $flux['args']['contexte'][$page]; |
|
| 170 | + } |
|
| 171 | + if ($type !== 'page' and !isset($disponible[$type])) { |
|
| 172 | + $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder); |
|
| 173 | + } |
|
| 174 | + if ($type == 'page' or $disponible[$type]) { |
|
| 175 | + $flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext); |
|
| 176 | + } |
|
| 177 | + } |
|
| 178 | + } |
|
| 179 | + $squelette = $flux['data']; |
|
| 180 | + } |
|
| 181 | + // layout specifiques par type et compositions : |
|
| 182 | + // body-article.html |
|
| 183 | + // body-sommaire.html |
|
| 184 | + // pour des raisons de perfo, les declinaisons doivent etre dans le |
|
| 185 | + // meme dossier que body.html |
|
| 186 | + if ($fond == 'body' and substr($squelette, -strlen($fond)) == $fond) { |
|
| 187 | + if ( |
|
| 188 | + isset($flux['args']['contexte']['type-page']) |
|
| 189 | + and ( |
|
| 190 | + (isset($flux['args']['contexte']['composition']) |
|
| 191 | + and file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext")) |
|
| 192 | + or |
|
| 193 | + file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext") |
|
| 194 | + ) |
|
| 195 | + ) { |
|
| 196 | + $flux['data'] = $f; |
|
| 197 | + } |
|
| 198 | + } elseif ( |
|
| 199 | + $fond == 'structure' |
|
| 200 | + and z_sanitize_var_zajax() |
|
| 201 | + and $f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext") |
|
| 202 | + ) { |
|
| 203 | + $flux['data'] = substr($f, 0, -strlen(".$ext")); |
|
| 204 | + } // chercher le fond correspondant a la composition |
|
| 205 | + elseif ( |
|
| 206 | + isset($flux['args']['contexte']['composition']) |
|
| 207 | + and (basename($fond) == 'page' or ($squelette and substr($squelette, -strlen($fond)) == $fond)) |
|
| 208 | + and $dir = substr($fond, $prefix_length) |
|
| 209 | + and $dir = explode('/', $dir) |
|
| 210 | + and $dir = reset($dir) |
|
| 211 | + and in_array($dir, $z_blocs) |
|
| 212 | + and $f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext") |
|
| 213 | + ) { |
|
| 214 | + $flux['data'] = substr($f, 0, -strlen(".$ext")); |
|
| 215 | + } |
|
| 216 | + } |
|
| 217 | + |
|
| 218 | + return $flux; |
|
| 219 | 219 | } |
| 220 | 220 | |
| 221 | 221 | /** |
@@ -225,18 +225,18 @@ discard block |
||
| 225 | 225 | * @return array |
| 226 | 226 | */ |
| 227 | 227 | function z_blocs($espace_prive = false) { |
| 228 | - if ($espace_prive) { |
|
| 229 | - return (isset($GLOBALS['z_blocs_ecrire']) ? $GLOBALS['z_blocs_ecrire'] : [ |
|
| 230 | - 'contenu', |
|
| 231 | - 'navigation', |
|
| 232 | - 'extra', |
|
| 233 | - 'head', |
|
| 234 | - 'hierarchie', |
|
| 235 | - 'top' |
|
| 236 | - ]); |
|
| 237 | - } |
|
| 238 | - |
|
| 239 | - return (isset($GLOBALS['z_blocs']) ? $GLOBALS['z_blocs'] : ['contenu']); |
|
| 228 | + if ($espace_prive) { |
|
| 229 | + return (isset($GLOBALS['z_blocs_ecrire']) ? $GLOBALS['z_blocs_ecrire'] : [ |
|
| 230 | + 'contenu', |
|
| 231 | + 'navigation', |
|
| 232 | + 'extra', |
|
| 233 | + 'head', |
|
| 234 | + 'hierarchie', |
|
| 235 | + 'top' |
|
| 236 | + ]); |
|
| 237 | + } |
|
| 238 | + |
|
| 239 | + return (isset($GLOBALS['z_blocs']) ? $GLOBALS['z_blocs'] : ['contenu']); |
|
| 240 | 240 | } |
| 241 | 241 | |
| 242 | 242 | /** |
@@ -251,11 +251,11 @@ discard block |
||
| 251 | 251 | * @return mixed |
| 252 | 252 | */ |
| 253 | 253 | function z_contenu_disponible($prefix_path, $z_contenu, $type, $ext, $echafauder = true) { |
| 254 | - if ($d = z_trouver_bloc($prefix_path, $z_contenu, $type, $ext)) { |
|
| 255 | - return $d; |
|
| 256 | - } |
|
| 254 | + if ($d = z_trouver_bloc($prefix_path, $z_contenu, $type, $ext)) { |
|
| 255 | + return $d; |
|
| 256 | + } |
|
| 257 | 257 | |
| 258 | - return $echafauder ? z_echafaudable($type) : false; |
|
| 258 | + return $echafauder ? z_echafaudable($type) : false; |
|
| 259 | 259 | } |
| 260 | 260 | |
| 261 | 261 | /** |
@@ -269,14 +269,14 @@ discard block |
||
| 269 | 269 | * `true` si on peut l'utiliser, `false` sinon. |
| 270 | 270 | **/ |
| 271 | 271 | function z_fond_valide($squelette) { |
| 272 | - if ( |
|
| 273 | - !_ZCORE_EXCLURE_PATH |
|
| 274 | - or !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette) |
|
| 275 | - ) { |
|
| 276 | - return true; |
|
| 277 | - } |
|
| 278 | - |
|
| 279 | - return false; |
|
| 272 | + if ( |
|
| 273 | + !_ZCORE_EXCLURE_PATH |
|
| 274 | + or !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette) |
|
| 275 | + ) { |
|
| 276 | + return true; |
|
| 277 | + } |
|
| 278 | + |
|
| 279 | + return false; |
|
| 280 | 280 | } |
| 281 | 281 | |
| 282 | 282 | /** |
@@ -294,14 +294,14 @@ discard block |
||
| 294 | 294 | * @return string |
| 295 | 295 | */ |
| 296 | 296 | function z_trouver_bloc($prefix_path, $bloc, $fond, $ext) { |
| 297 | - if ( |
|
| 298 | - (defined('_ZCORE_BLOC_PREFIX_SKEL') and $f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext") and z_fond_valide($f)) |
|
| 299 | - or ($f = find_in_path("$prefix_path$bloc/$fond.$ext") and z_fond_valide($f)) |
|
| 300 | - ) { |
|
| 301 | - return substr($f, 0, -strlen(".$ext")); |
|
| 302 | - } |
|
| 303 | - |
|
| 304 | - return ''; |
|
| 297 | + if ( |
|
| 298 | + (defined('_ZCORE_BLOC_PREFIX_SKEL') and $f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext") and z_fond_valide($f)) |
|
| 299 | + or ($f = find_in_path("$prefix_path$bloc/$fond.$ext") and z_fond_valide($f)) |
|
| 300 | + ) { |
|
| 301 | + return substr($f, 0, -strlen(".$ext")); |
|
| 302 | + } |
|
| 303 | + |
|
| 304 | + return ''; |
|
| 305 | 305 | } |
| 306 | 306 | |
| 307 | 307 | /** |
@@ -313,52 +313,52 @@ discard block |
||
| 313 | 313 | * @return bool |
| 314 | 314 | */ |
| 315 | 315 | function z_echafaudable($type) { |
| 316 | - static $pages = null; |
|
| 317 | - static $echafaudable = []; |
|
| 318 | - if (isset($echafaudable[$type])) { |
|
| 319 | - return $echafaudable[$type]; |
|
| 320 | - } |
|
| 321 | - if (preg_match(',[^\w],', $type)) { |
|
| 322 | - return $echafaudable[$type] = false; |
|
| 323 | - } |
|
| 324 | - |
|
| 325 | - if (test_espace_prive()) { |
|
| 326 | - if (!function_exists('trouver_objet_exec')) { |
|
| 327 | - include_spip('inc/pipelines_ecrire'); |
|
| 328 | - } |
|
| 329 | - if ($e = trouver_objet_exec($type)) { |
|
| 330 | - return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $e]; |
|
| 331 | - } else { |
|
| 332 | - // peut etre c'est un exec=types qui liste tous les objets "type" |
|
| 333 | - if ( |
|
| 334 | - ($t = objet_type($type, false)) !== $type |
|
| 335 | - and $e = trouver_objet_exec($t) |
|
| 336 | - ) { |
|
| 337 | - return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $t]; |
|
| 338 | - } |
|
| 339 | - } |
|
| 340 | - } else { |
|
| 341 | - if (is_null($pages)) { |
|
| 342 | - $pages = []; |
|
| 343 | - $liste = lister_tables_objets_sql(); |
|
| 344 | - foreach ($liste as $t => $d) { |
|
| 345 | - if ($d['page']) { |
|
| 346 | - $pages[$d['page']] = [$d['table_objet'], $t]; |
|
| 347 | - } |
|
| 348 | - } |
|
| 349 | - } |
|
| 350 | - if (!isset($pages[$type])) { |
|
| 351 | - return $echafaudable[$type] = false; |
|
| 352 | - } |
|
| 353 | - if (count($pages[$type]) == 2) { |
|
| 354 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 355 | - $pages[$type][] = $trouver_table(reset($pages[$type])); |
|
| 356 | - } |
|
| 357 | - |
|
| 358 | - return $echafaudable[$type] = $pages[$type]; |
|
| 359 | - } |
|
| 360 | - |
|
| 361 | - return $echafaudable[$type] = false; |
|
| 316 | + static $pages = null; |
|
| 317 | + static $echafaudable = []; |
|
| 318 | + if (isset($echafaudable[$type])) { |
|
| 319 | + return $echafaudable[$type]; |
|
| 320 | + } |
|
| 321 | + if (preg_match(',[^\w],', $type)) { |
|
| 322 | + return $echafaudable[$type] = false; |
|
| 323 | + } |
|
| 324 | + |
|
| 325 | + if (test_espace_prive()) { |
|
| 326 | + if (!function_exists('trouver_objet_exec')) { |
|
| 327 | + include_spip('inc/pipelines_ecrire'); |
|
| 328 | + } |
|
| 329 | + if ($e = trouver_objet_exec($type)) { |
|
| 330 | + return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $e]; |
|
| 331 | + } else { |
|
| 332 | + // peut etre c'est un exec=types qui liste tous les objets "type" |
|
| 333 | + if ( |
|
| 334 | + ($t = objet_type($type, false)) !== $type |
|
| 335 | + and $e = trouver_objet_exec($t) |
|
| 336 | + ) { |
|
| 337 | + return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $t]; |
|
| 338 | + } |
|
| 339 | + } |
|
| 340 | + } else { |
|
| 341 | + if (is_null($pages)) { |
|
| 342 | + $pages = []; |
|
| 343 | + $liste = lister_tables_objets_sql(); |
|
| 344 | + foreach ($liste as $t => $d) { |
|
| 345 | + if ($d['page']) { |
|
| 346 | + $pages[$d['page']] = [$d['table_objet'], $t]; |
|
| 347 | + } |
|
| 348 | + } |
|
| 349 | + } |
|
| 350 | + if (!isset($pages[$type])) { |
|
| 351 | + return $echafaudable[$type] = false; |
|
| 352 | + } |
|
| 353 | + if (count($pages[$type]) == 2) { |
|
| 354 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 355 | + $pages[$type][] = $trouver_table(reset($pages[$type])); |
|
| 356 | + } |
|
| 357 | + |
|
| 358 | + return $echafaudable[$type] = $pages[$type]; |
|
| 359 | + } |
|
| 360 | + |
|
| 361 | + return $echafaudable[$type] = false; |
|
| 362 | 362 | } |
| 363 | 363 | |
| 364 | 364 | |
@@ -375,46 +375,46 @@ discard block |
||
| 375 | 375 | * @return string |
| 376 | 376 | */ |
| 377 | 377 | function prive_echafauder_dist($exec, $table, $table_sql, $desc_exec, $ext) { |
| 378 | - $scaffold = ''; |
|
| 379 | - |
|
| 380 | - // page objet ou objet_edit |
|
| 381 | - if (is_array($desc_exec)) { |
|
| 382 | - $type = $desc_exec['type']; |
|
| 383 | - $primary = $desc_exec['id_table_objet']; |
|
| 384 | - |
|
| 385 | - if ($desc_exec['edition'] === false) { |
|
| 386 | - $fond = 'objet'; |
|
| 387 | - } else { |
|
| 388 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 389 | - $desc = $trouver_table($table_sql); |
|
| 390 | - if (isset($desc['field']['id_rubrique'])) { |
|
| 391 | - $fond = 'objet_edit'; |
|
| 392 | - } else { |
|
| 393 | - $fond = 'objet_edit.sans_rubrique'; |
|
| 394 | - } |
|
| 395 | - } |
|
| 396 | - $dir = z_blocs(test_espace_prive()); |
|
| 397 | - $dir = reset($dir); |
|
| 398 | - $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ',objet=' . $type . ',id_objet=#' . strtoupper($primary) . ',env}>'; |
|
| 399 | - } // page objets |
|
| 400 | - elseif ($type = $desc_exec and strpos($type, '/') === false) { |
|
| 401 | - $dir = z_blocs(test_espace_prive()); |
|
| 402 | - $dir = reset($dir); |
|
| 403 | - $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ',env} />'; |
|
| 404 | - } |
|
| 405 | - // morceau d'objet : on fournit le fond de sibstitution dans $desc_exec |
|
| 406 | - // et objet et tire de $table |
|
| 407 | - elseif ($fond = $desc_exec) { |
|
| 408 | - $dir = md5(dirname($fond)); |
|
| 409 | - $scaffold = "<INCLURE{fond=$fond,objet=" . objet_type($table) . ',env} />'; |
|
| 410 | - } |
|
| 411 | - |
|
| 412 | - $base_dir = sous_repertoire(_DIR_CACHE, 'scaffold', false); |
|
| 413 | - $base_dir = sous_repertoire($base_dir, $dir, false); |
|
| 414 | - $f = $base_dir . "$exec"; |
|
| 415 | - ecrire_fichier("$f.$ext", $scaffold); |
|
| 416 | - |
|
| 417 | - return $f; |
|
| 378 | + $scaffold = ''; |
|
| 379 | + |
|
| 380 | + // page objet ou objet_edit |
|
| 381 | + if (is_array($desc_exec)) { |
|
| 382 | + $type = $desc_exec['type']; |
|
| 383 | + $primary = $desc_exec['id_table_objet']; |
|
| 384 | + |
|
| 385 | + if ($desc_exec['edition'] === false) { |
|
| 386 | + $fond = 'objet'; |
|
| 387 | + } else { |
|
| 388 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 389 | + $desc = $trouver_table($table_sql); |
|
| 390 | + if (isset($desc['field']['id_rubrique'])) { |
|
| 391 | + $fond = 'objet_edit'; |
|
| 392 | + } else { |
|
| 393 | + $fond = 'objet_edit.sans_rubrique'; |
|
| 394 | + } |
|
| 395 | + } |
|
| 396 | + $dir = z_blocs(test_espace_prive()); |
|
| 397 | + $dir = reset($dir); |
|
| 398 | + $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ',objet=' . $type . ',id_objet=#' . strtoupper($primary) . ',env}>'; |
|
| 399 | + } // page objets |
|
| 400 | + elseif ($type = $desc_exec and strpos($type, '/') === false) { |
|
| 401 | + $dir = z_blocs(test_espace_prive()); |
|
| 402 | + $dir = reset($dir); |
|
| 403 | + $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ',env} />'; |
|
| 404 | + } |
|
| 405 | + // morceau d'objet : on fournit le fond de sibstitution dans $desc_exec |
|
| 406 | + // et objet et tire de $table |
|
| 407 | + elseif ($fond = $desc_exec) { |
|
| 408 | + $dir = md5(dirname($fond)); |
|
| 409 | + $scaffold = "<INCLURE{fond=$fond,objet=" . objet_type($table) . ',env} />'; |
|
| 410 | + } |
|
| 411 | + |
|
| 412 | + $base_dir = sous_repertoire(_DIR_CACHE, 'scaffold', false); |
|
| 413 | + $base_dir = sous_repertoire($base_dir, $dir, false); |
|
| 414 | + $f = $base_dir . "$exec"; |
|
| 415 | + ecrire_fichier("$f.$ext", $scaffold); |
|
| 416 | + |
|
| 417 | + return $f; |
|
| 418 | 418 | } |
| 419 | 419 | |
| 420 | 420 | /** |
@@ -423,17 +423,17 @@ discard block |
||
| 423 | 423 | * @return bool|string |
| 424 | 424 | */ |
| 425 | 425 | function z_sanitize_var_zajax() { |
| 426 | - $z_ajax = _request('var_zajax'); |
|
| 427 | - if (!$z_ajax) { |
|
| 428 | - return false; |
|
| 429 | - } |
|
| 430 | - if ( |
|
| 431 | - !$z_blocs = z_blocs(test_espace_prive()) |
|
| 432 | - or !in_array($z_ajax, $z_blocs) |
|
| 433 | - ) { |
|
| 434 | - set_request('var_zajax'); // enlever cette demande incongrue |
|
| 435 | - $z_ajax = false; |
|
| 436 | - } |
|
| 437 | - |
|
| 438 | - return $z_ajax; |
|
| 426 | + $z_ajax = _request('var_zajax'); |
|
| 427 | + if (!$z_ajax) { |
|
| 428 | + return false; |
|
| 429 | + } |
|
| 430 | + if ( |
|
| 431 | + !$z_blocs = z_blocs(test_espace_prive()) |
|
| 432 | + or !in_array($z_ajax, $z_blocs) |
|
| 433 | + ) { |
|
| 434 | + set_request('var_zajax'); // enlever cette demande incongrue |
|
| 435 | + $z_ajax = false; |
|
| 436 | + } |
|
| 437 | + |
|
| 438 | + return $z_ajax; |
|
| 439 | 439 | } |
@@ -53,7 +53,7 @@ discard block |
||
| 53 | 53 | $apl_constant = '_Z_AJAX_PARALLEL_LOAD'; |
| 54 | 54 | $page = _SPIP_PAGE; |
| 55 | 55 | $echafauder = charger_fonction('echafauder', 'public', true); |
| 56 | - define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist' . (defined('_DIR_PLUGIN_DIST') ? '|\b' . rtrim( |
|
| 56 | + define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist'.(defined('_DIR_PLUGIN_DIST') ? '|\b'.rtrim( |
|
| 57 | 57 | _DIR_PLUGIN_DIST, |
| 58 | 58 | '/' |
| 59 | 59 | ) : '')); |
@@ -77,7 +77,7 @@ discard block |
||
| 77 | 77 | and in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z |
| 78 | 78 | and defined($apl_constant) |
| 79 | 79 | and in_array($dir, explode(',', constant($apl_constant))) // et dans un demande en APL |
| 80 | - and $pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext) // et qui contient le squelette APL |
|
| 80 | + and $pipe = z_trouver_bloc($prefix_path.$prepend, $dir, 'z_apl', $ext) // et qui contient le squelette APL |
|
| 81 | 81 | ) { |
| 82 | 82 | $flux['data'] = $pipe; |
| 83 | 83 | |
@@ -90,7 +90,7 @@ discard block |
||
| 90 | 90 | $echafauder = ''; |
| 91 | 91 | } |
| 92 | 92 | if ($prepend) { |
| 93 | - $squelette = substr(find_in_path($prefix_path . $prepend . "$fond.$ext"), 0, -strlen(".$ext")); |
|
| 93 | + $squelette = substr(find_in_path($prefix_path.$prepend."$fond.$ext"), 0, -strlen(".$ext")); |
|
| 94 | 94 | if ($squelette) { |
| 95 | 95 | $flux['data'] = $squelette; |
| 96 | 96 | } |
@@ -113,11 +113,11 @@ discard block |
||
| 113 | 113 | // se brancher sur contenu/xx si il existe |
| 114 | 114 | // ou si c'est un objet spip, associe a une table, utiliser le fond homonyme |
| 115 | 115 | if (!isset($disponible[$fond])) { |
| 116 | - $disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, $echafauder); |
|
| 116 | + $disponible[$fond] = z_contenu_disponible($prefix_path.$prepend, $z_contenu, $fond, $ext, $echafauder); |
|
| 117 | 117 | } |
| 118 | 118 | |
| 119 | 119 | if ($disponible[$fond]) { |
| 120 | - $flux['data'] = substr(find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext")); |
|
| 120 | + $flux['data'] = substr(find_in_path($prefix_path."page.$ext"), 0, -strlen(".$ext")); |
|
| 121 | 121 | } |
| 122 | 122 | } |
| 123 | 123 | |
@@ -130,7 +130,7 @@ discard block |
||
| 130 | 130 | $type = $flux['args']['contexte'][$page]; |
| 131 | 131 | } |
| 132 | 132 | if (!isset($disponible[$type])) { |
| 133 | - $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder); |
|
| 133 | + $disponible[$type] = z_contenu_disponible($prefix_path.$prepend, $z_contenu, $type, $ext, $echafauder); |
|
| 134 | 134 | } |
| 135 | 135 | if (is_string($disponible[$type])) { |
| 136 | 136 | $flux['data'] = $disponible[$type]; |
@@ -145,7 +145,7 @@ discard block |
||
| 145 | 145 | $flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext); |
| 146 | 146 | } else { |
| 147 | 147 | $flux['data'] = ($disponible['404'] = z_contenu_disponible( |
| 148 | - $prefix_path . $prepend, |
|
| 148 | + $prefix_path.$prepend, |
|
| 149 | 149 | $z_contenu, |
| 150 | 150 | '404', |
| 151 | 151 | $ext, |
@@ -169,10 +169,10 @@ discard block |
||
| 169 | 169 | $type = $flux['args']['contexte'][$page]; |
| 170 | 170 | } |
| 171 | 171 | if ($type !== 'page' and !isset($disponible[$type])) { |
| 172 | - $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder); |
|
| 172 | + $disponible[$type] = z_contenu_disponible($prefix_path.$prepend, $z_contenu, $type, $ext, $echafauder); |
|
| 173 | 173 | } |
| 174 | 174 | if ($type == 'page' or $disponible[$type]) { |
| 175 | - $flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext); |
|
| 175 | + $flux['data'] = z_trouver_bloc($prefix_path.$prepend, $dir, 'dist', $ext); |
|
| 176 | 176 | } |
| 177 | 177 | } |
| 178 | 178 | } |
@@ -188,9 +188,9 @@ discard block |
||
| 188 | 188 | isset($flux['args']['contexte']['type-page']) |
| 189 | 189 | and ( |
| 190 | 190 | (isset($flux['args']['contexte']['composition']) |
| 191 | - and file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext")) |
|
| 191 | + and file_exists(($f = $squelette.'-'.$flux['args']['contexte']['type-page'].'-'.$flux['args']['contexte']['composition']).".$ext")) |
|
| 192 | 192 | or |
| 193 | - file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext") |
|
| 193 | + file_exists(($f = $squelette.'-'.$flux['args']['contexte']['type-page']).".$ext") |
|
| 194 | 194 | ) |
| 195 | 195 | ) { |
| 196 | 196 | $flux['data'] = $f; |
@@ -198,7 +198,7 @@ discard block |
||
| 198 | 198 | } elseif ( |
| 199 | 199 | $fond == 'structure' |
| 200 | 200 | and z_sanitize_var_zajax() |
| 201 | - and $f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext") |
|
| 201 | + and $f = find_in_path($prefix_path.$prepend.'ajax'.".$ext") |
|
| 202 | 202 | ) { |
| 203 | 203 | $flux['data'] = substr($f, 0, -strlen(".$ext")); |
| 204 | 204 | } // chercher le fond correspondant a la composition |
@@ -209,7 +209,7 @@ discard block |
||
| 209 | 209 | and $dir = explode('/', $dir) |
| 210 | 210 | and $dir = reset($dir) |
| 211 | 211 | and in_array($dir, $z_blocs) |
| 212 | - and $f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext") |
|
| 212 | + and $f = find_in_path($prefix_path.$prepend.$fond.'-'.$flux['args']['contexte']['composition'].".$ext") |
|
| 213 | 213 | ) { |
| 214 | 214 | $flux['data'] = substr($f, 0, -strlen(".$ext")); |
| 215 | 215 | } |
@@ -271,7 +271,7 @@ discard block |
||
| 271 | 271 | function z_fond_valide($squelette) { |
| 272 | 272 | if ( |
| 273 | 273 | !_ZCORE_EXCLURE_PATH |
| 274 | - or !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette) |
|
| 274 | + or !preg_match(',('._ZCORE_EXCLURE_PATH.')/,', $squelette) |
|
| 275 | 275 | ) { |
| 276 | 276 | return true; |
| 277 | 277 | } |
@@ -395,23 +395,23 @@ discard block |
||
| 395 | 395 | } |
| 396 | 396 | $dir = z_blocs(test_espace_prive()); |
| 397 | 397 | $dir = reset($dir); |
| 398 | - $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ',objet=' . $type . ',id_objet=#' . strtoupper($primary) . ',env}>'; |
|
| 398 | + $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/".$fond.',objet='.$type.',id_objet=#'.strtoupper($primary).',env}>'; |
|
| 399 | 399 | } // page objets |
| 400 | 400 | elseif ($type = $desc_exec and strpos($type, '/') === false) { |
| 401 | 401 | $dir = z_blocs(test_espace_prive()); |
| 402 | 402 | $dir = reset($dir); |
| 403 | - $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ',env} />'; |
|
| 403 | + $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=".$type.',env} />'; |
|
| 404 | 404 | } |
| 405 | 405 | // morceau d'objet : on fournit le fond de sibstitution dans $desc_exec |
| 406 | 406 | // et objet et tire de $table |
| 407 | 407 | elseif ($fond = $desc_exec) { |
| 408 | 408 | $dir = md5(dirname($fond)); |
| 409 | - $scaffold = "<INCLURE{fond=$fond,objet=" . objet_type($table) . ',env} />'; |
|
| 409 | + $scaffold = "<INCLURE{fond=$fond,objet=".objet_type($table).',env} />'; |
|
| 410 | 410 | } |
| 411 | 411 | |
| 412 | 412 | $base_dir = sous_repertoire(_DIR_CACHE, 'scaffold', false); |
| 413 | 413 | $base_dir = sous_repertoire($base_dir, $dir, false); |
| 414 | - $f = $base_dir . "$exec"; |
|
| 414 | + $f = $base_dir."$exec"; |
|
| 415 | 415 | ecrire_fichier("$f.$ext", $scaffold); |
| 416 | 416 | |
| 417 | 417 | return $f; |
@@ -11,7 +11,7 @@ discard block |
||
| 11 | 11 | \***************************************************************************/ |
| 12 | 12 | |
| 13 | 13 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 14 | - return; |
|
| 14 | + return; |
|
| 15 | 15 | } |
| 16 | 16 | |
| 17 | 17 | /** |
@@ -32,67 +32,67 @@ discard block |
||
| 32 | 32 | |
| 33 | 33 | // Cas d'une page contenant du PHP : |
| 34 | 34 | if (empty($page['process_ins']) or $page['process_ins'] != 'html') { |
| 35 | - include_spip('inc/lang'); |
|
| 35 | + include_spip('inc/lang'); |
|
| 36 | 36 | |
| 37 | - // restaurer l'etat des notes avant calcul |
|
| 38 | - if ( |
|
| 39 | - isset($page['notes']) |
|
| 40 | - and $page['notes'] |
|
| 41 | - and $notes = charger_fonction('notes', 'inc', true) |
|
| 42 | - ) { |
|
| 43 | - $notes($page['notes'], 'restaurer_etat'); |
|
| 44 | - } |
|
| 45 | - ob_start(); |
|
| 46 | - if (strpos($page['texte'], '?xml') !== false) { |
|
| 47 | - $page['texte'] = str_replace('<' . '?xml', "<\1?xml", $page['texte']); |
|
| 48 | - } |
|
| 37 | + // restaurer l'etat des notes avant calcul |
|
| 38 | + if ( |
|
| 39 | + isset($page['notes']) |
|
| 40 | + and $page['notes'] |
|
| 41 | + and $notes = charger_fonction('notes', 'inc', true) |
|
| 42 | + ) { |
|
| 43 | + $notes($page['notes'], 'restaurer_etat'); |
|
| 44 | + } |
|
| 45 | + ob_start(); |
|
| 46 | + if (strpos($page['texte'], '?xml') !== false) { |
|
| 47 | + $page['texte'] = str_replace('<' . '?xml', "<\1?xml", $page['texte']); |
|
| 48 | + } |
|
| 49 | 49 | |
| 50 | - try { |
|
| 51 | - $res = eval('?' . '>' . $page['texte']); |
|
| 52 | - // error catching 5.2<=PHP<7 |
|
| 53 | - if ( |
|
| 54 | - $res === false |
|
| 55 | - and function_exists('error_get_last') |
|
| 56 | - and ($erreur = error_get_last()) |
|
| 57 | - ) { |
|
| 58 | - $code = $page['texte']; |
|
| 59 | - $GLOBALS['numero_ligne_php'] = 1; |
|
| 60 | - if (!function_exists('numerote_ligne_php')) { |
|
| 61 | - function numerote_ligne_php($match) { |
|
| 62 | - $GLOBALS['numero_ligne_php']++; |
|
| 63 | - return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/'; |
|
| 64 | - } |
|
| 65 | - } |
|
| 66 | - $code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code); |
|
| 67 | - $code = trim(highlight_string($code, true)); |
|
| 68 | - erreur_squelette('L' . $erreur['line'] . ': ' . $erreur['message'] . '<br />' . $code, [$page['source'],'',$erreur['file'],'',$GLOBALS['spip_lang']]); |
|
| 69 | - $page['texte'] = '<!-- Erreur -->'; |
|
| 70 | - } |
|
| 71 | - else { |
|
| 72 | - $page['texte'] = ob_get_contents(); |
|
| 73 | - } |
|
| 74 | - } |
|
| 75 | - catch (Exception $e) { |
|
| 76 | - $code = $page['texte']; |
|
| 77 | - $GLOBALS['numero_ligne_php'] = 1; |
|
| 78 | - if (!function_exists('numerote_ligne_php')) { |
|
| 79 | - function numerote_ligne_php($match) { |
|
| 80 | - $GLOBALS['numero_ligne_php']++; |
|
| 81 | - return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/'; |
|
| 82 | - } |
|
| 83 | - } |
|
| 84 | - $code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code); |
|
| 85 | - $code = trim(highlight_string($code, true)); |
|
| 86 | - erreur_squelette('L' . $e->getLine() . ': ' . $e->getMessage() . '<br />' . $code, [$page['source'],'',$e->getFile(),'',$GLOBALS['spip_lang']]); |
|
| 87 | - $page['texte'] = '<!-- Erreur -->'; |
|
| 88 | - } |
|
| 89 | - ob_end_clean(); |
|
| 50 | + try { |
|
| 51 | + $res = eval('?' . '>' . $page['texte']); |
|
| 52 | + // error catching 5.2<=PHP<7 |
|
| 53 | + if ( |
|
| 54 | + $res === false |
|
| 55 | + and function_exists('error_get_last') |
|
| 56 | + and ($erreur = error_get_last()) |
|
| 57 | + ) { |
|
| 58 | + $code = $page['texte']; |
|
| 59 | + $GLOBALS['numero_ligne_php'] = 1; |
|
| 60 | + if (!function_exists('numerote_ligne_php')) { |
|
| 61 | + function numerote_ligne_php($match) { |
|
| 62 | + $GLOBALS['numero_ligne_php']++; |
|
| 63 | + return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/'; |
|
| 64 | + } |
|
| 65 | + } |
|
| 66 | + $code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code); |
|
| 67 | + $code = trim(highlight_string($code, true)); |
|
| 68 | + erreur_squelette('L' . $erreur['line'] . ': ' . $erreur['message'] . '<br />' . $code, [$page['source'],'',$erreur['file'],'',$GLOBALS['spip_lang']]); |
|
| 69 | + $page['texte'] = '<!-- Erreur -->'; |
|
| 70 | + } |
|
| 71 | + else { |
|
| 72 | + $page['texte'] = ob_get_contents(); |
|
| 73 | + } |
|
| 74 | + } |
|
| 75 | + catch (Exception $e) { |
|
| 76 | + $code = $page['texte']; |
|
| 77 | + $GLOBALS['numero_ligne_php'] = 1; |
|
| 78 | + if (!function_exists('numerote_ligne_php')) { |
|
| 79 | + function numerote_ligne_php($match) { |
|
| 80 | + $GLOBALS['numero_ligne_php']++; |
|
| 81 | + return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/'; |
|
| 82 | + } |
|
| 83 | + } |
|
| 84 | + $code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code); |
|
| 85 | + $code = trim(highlight_string($code, true)); |
|
| 86 | + erreur_squelette('L' . $e->getLine() . ': ' . $e->getMessage() . '<br />' . $code, [$page['source'],'',$e->getFile(),'',$GLOBALS['spip_lang']]); |
|
| 87 | + $page['texte'] = '<!-- Erreur -->'; |
|
| 88 | + } |
|
| 89 | + ob_end_clean(); |
|
| 90 | 90 | |
| 91 | - $page['process_ins'] = 'html'; |
|
| 91 | + $page['process_ins'] = 'html'; |
|
| 92 | 92 | |
| 93 | - if (strpos($page['texte'], '?xml') !== false) { |
|
| 94 | - $page['texte'] = str_replace("<\1?xml", '<' . '?xml', $page['texte']); |
|
| 95 | - } |
|
| 93 | + if (strpos($page['texte'], '?xml') !== false) { |
|
| 94 | + $page['texte'] = str_replace("<\1?xml", '<' . '?xml', $page['texte']); |
|
| 95 | + } |
|
| 96 | 96 | } |
| 97 | 97 | |
| 98 | 98 | page_base_href($page['texte']); |
@@ -44,11 +44,11 @@ discard block |
||
| 44 | 44 | } |
| 45 | 45 | ob_start(); |
| 46 | 46 | if (strpos($page['texte'], '?xml') !== false) { |
| 47 | - $page['texte'] = str_replace('<' . '?xml', "<\1?xml", $page['texte']); |
|
| 47 | + $page['texte'] = str_replace('<'.'?xml', "<\1?xml", $page['texte']); |
|
| 48 | 48 | } |
| 49 | 49 | |
| 50 | 50 | try { |
| 51 | - $res = eval('?' . '>' . $page['texte']); |
|
| 51 | + $res = eval('?'.'>'.$page['texte']); |
|
| 52 | 52 | // error catching 5.2<=PHP<7 |
| 53 | 53 | if ( |
| 54 | 54 | $res === false |
@@ -60,12 +60,12 @@ discard block |
||
| 60 | 60 | if (!function_exists('numerote_ligne_php')) { |
| 61 | 61 | function numerote_ligne_php($match) { |
| 62 | 62 | $GLOBALS['numero_ligne_php']++; |
| 63 | - return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/'; |
|
| 63 | + return "\n/*".str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT).'*/'; |
|
| 64 | 64 | } |
| 65 | 65 | } |
| 66 | - $code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code); |
|
| 66 | + $code = '/*001*/'.preg_replace_callback(",\n,", 'numerote_ligne_php', $code); |
|
| 67 | 67 | $code = trim(highlight_string($code, true)); |
| 68 | - erreur_squelette('L' . $erreur['line'] . ': ' . $erreur['message'] . '<br />' . $code, [$page['source'],'',$erreur['file'],'',$GLOBALS['spip_lang']]); |
|
| 68 | + erreur_squelette('L'.$erreur['line'].': '.$erreur['message'].'<br />'.$code, [$page['source'], '', $erreur['file'], '', $GLOBALS['spip_lang']]); |
|
| 69 | 69 | $page['texte'] = '<!-- Erreur -->'; |
| 70 | 70 | } |
| 71 | 71 | else { |
@@ -78,12 +78,12 @@ discard block |
||
| 78 | 78 | if (!function_exists('numerote_ligne_php')) { |
| 79 | 79 | function numerote_ligne_php($match) { |
| 80 | 80 | $GLOBALS['numero_ligne_php']++; |
| 81 | - return "\n/*" . str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT) . '*/'; |
|
| 81 | + return "\n/*".str_pad($GLOBALS['numero_ligne_php'], 3, '0', STR_PAD_LEFT).'*/'; |
|
| 82 | 82 | } |
| 83 | 83 | } |
| 84 | - $code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', $code); |
|
| 84 | + $code = '/*001*/'.preg_replace_callback(",\n,", 'numerote_ligne_php', $code); |
|
| 85 | 85 | $code = trim(highlight_string($code, true)); |
| 86 | - erreur_squelette('L' . $e->getLine() . ': ' . $e->getMessage() . '<br />' . $code, [$page['source'],'',$e->getFile(),'',$GLOBALS['spip_lang']]); |
|
| 86 | + erreur_squelette('L'.$e->getLine().': '.$e->getMessage().'<br />'.$code, [$page['source'], '', $e->getFile(), '', $GLOBALS['spip_lang']]); |
|
| 87 | 87 | $page['texte'] = '<!-- Erreur -->'; |
| 88 | 88 | } |
| 89 | 89 | ob_end_clean(); |
@@ -91,7 +91,7 @@ discard block |
||
| 91 | 91 | $page['process_ins'] = 'html'; |
| 92 | 92 | |
| 93 | 93 | if (strpos($page['texte'], '?xml') !== false) { |
| 94 | - $page['texte'] = str_replace("<\1?xml", '<' . '?xml', $page['texte']); |
|
| 94 | + $page['texte'] = str_replace("<\1?xml", '<'.'?xml', $page['texte']); |
|
| 95 | 95 | } |
| 96 | 96 | } |
| 97 | 97 | |
@@ -67,12 +67,10 @@ |
||
| 67 | 67 | $code = trim(highlight_string($code, true)); |
| 68 | 68 | erreur_squelette('L' . $erreur['line'] . ': ' . $erreur['message'] . '<br />' . $code, [$page['source'],'',$erreur['file'],'',$GLOBALS['spip_lang']]); |
| 69 | 69 | $page['texte'] = '<!-- Erreur -->'; |
| 70 | - } |
|
| 71 | - else { |
|
| 70 | + } else { |
|
| 72 | 71 | $page['texte'] = ob_get_contents(); |
| 73 | 72 | } |
| 74 | - } |
|
| 75 | - catch (Exception $e) { |
|
| 73 | + } catch (Exception $e) { |
|
| 76 | 74 | $code = $page['texte']; |
| 77 | 75 | $GLOBALS['numero_ligne_php'] = 1; |
| 78 | 76 | if (!function_exists('numerote_ligne_php')) { |
@@ -84,7 +84,7 @@ discard block |
||
| 84 | 84 | $texte = $intro; |
| 85 | 85 | } else { |
| 86 | 86 | if ( |
| 87 | - strpos("\n" . $texte, "\n|") === false |
|
| 87 | + strpos("\n".$texte, "\n|") === false |
|
| 88 | 88 | and strlen($texte) > 2.5 * $longueur |
| 89 | 89 | ) { |
| 90 | 90 | if (strpos($texte, '<multi') !== false) { |
@@ -168,12 +168,12 @@ discard block |
||
| 168 | 168 | if ($pas < 1) { |
| 169 | 169 | return ''; |
| 170 | 170 | } |
| 171 | - $ancre = 'pagination' . $nom; // #pagination_articles |
|
| 172 | - $debut = 'debut' . $nom; // 'debut_articles' |
|
| 171 | + $ancre = 'pagination'.$nom; // #pagination_articles |
|
| 172 | + $debut = 'debut'.$nom; // 'debut_articles' |
|
| 173 | 173 | |
| 174 | 174 | // n'afficher l'ancre qu'une fois |
| 175 | 175 | if (!isset($ancres[$ancre])) { |
| 176 | - $bloc_ancre = $ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>"; |
|
| 176 | + $bloc_ancre = $ancres[$ancre] = "<a id='".$ancre."' class='pagination_ancre'></a>"; |
|
| 177 | 177 | } else { |
| 178 | 178 | $bloc_ancre = ''; |
| 179 | 179 | } |
@@ -205,8 +205,8 @@ discard block |
||
| 205 | 205 | |
| 206 | 206 | if ($modele) { |
| 207 | 207 | $pagination['type_pagination'] = $modele; |
| 208 | - if (trouver_fond('pagination_' . $modele, 'modeles')) { |
|
| 209 | - $modele = '_' . $modele; |
|
| 208 | + if (trouver_fond('pagination_'.$modele, 'modeles')) { |
|
| 209 | + $modele = '_'.$modele; |
|
| 210 | 210 | } |
| 211 | 211 | else { |
| 212 | 212 | $modele = ''; |
@@ -291,7 +291,7 @@ discard block |
||
| 291 | 291 | function lister_objets_avec_logos($type) { |
| 292 | 292 | |
| 293 | 293 | $objet = objet_type($type); |
| 294 | - $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)); |
|
| 294 | + $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)); |
|
| 295 | 295 | if ($ids) { |
| 296 | 296 | $ids = array_column($ids, 'id_objet'); |
| 297 | 297 | return implode(',', $ids); |
@@ -465,7 +465,7 @@ discard block |
||
| 465 | 465 | case 'sinum ': |
| 466 | 466 | return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}"; |
| 467 | 467 | default: |
| 468 | - return $champ . $senstri; |
|
| 468 | + return $champ.$senstri; |
|
| 469 | 469 | } |
| 470 | 470 | } |
| 471 | 471 | |
@@ -207,8 +207,7 @@ discard block |
||
| 207 | 207 | $pagination['type_pagination'] = $modele; |
| 208 | 208 | if (trouver_fond('pagination_' . $modele, 'modeles')) { |
| 209 | 209 | $modele = '_' . $modele; |
| 210 | - } |
|
| 211 | - else { |
|
| 210 | + } else { |
|
| 212 | 211 | $modele = ''; |
| 213 | 212 | } |
| 214 | 213 | } |
@@ -295,8 +294,7 @@ discard block |
||
| 295 | 294 | if ($ids) { |
| 296 | 295 | $ids = array_column($ids, 'id_objet'); |
| 297 | 296 | return implode(',', $ids); |
| 298 | - } |
|
| 299 | - else { |
|
| 297 | + } else { |
|
| 300 | 298 | return '0'; |
| 301 | 299 | } |
| 302 | 300 | } |
@@ -23,7 +23,7 @@ discard block |
||
| 23 | 23 | **/ |
| 24 | 24 | |
| 25 | 25 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 26 | - return; |
|
| 26 | + return; |
|
| 27 | 27 | } |
| 28 | 28 | |
| 29 | 29 | |
@@ -52,75 +52,75 @@ discard block |
||
| 52 | 52 | * Introduction calculée |
| 53 | 53 | **/ |
| 54 | 54 | function filtre_introduction_dist($descriptif, $texte, $longueur, $connect, $suite = null) { |
| 55 | - // Si un descriptif est envoye, on l'utilise directement |
|
| 56 | - if (strlen($descriptif)) { |
|
| 57 | - return appliquer_traitement_champ($descriptif, 'introduction', '', [], $connect); |
|
| 58 | - } |
|
| 59 | - |
|
| 60 | - // De preference ce qui est marque <intro>...</intro> |
|
| 61 | - $intro = ''; |
|
| 62 | - $texte = preg_replace(',(</?)intro>,i', "\\1intro>", $texte); // minuscules |
|
| 63 | - while ($fin = strpos($texte, '</intro>')) { |
|
| 64 | - $zone = substr($texte, 0, $fin); |
|
| 65 | - $texte = substr($texte, $fin + strlen('</intro>')); |
|
| 66 | - if ($deb = strpos($zone, '<intro>') or substr($zone, 0, 7) == '<intro>') { |
|
| 67 | - $zone = substr($zone, $deb + 7); |
|
| 68 | - } |
|
| 69 | - $intro .= $zone; |
|
| 70 | - } |
|
| 71 | - |
|
| 72 | - // [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut, |
|
| 73 | - // qui inclus raccourcis et modeles |
|
| 74 | - // un simple <articlexx> peut etre ensuite transforme en 1000 lignes ... |
|
| 75 | - // par ailleurs le nettoyage des raccourcis ne tient pas compte |
|
| 76 | - // des surcharges et enrichissement de propre |
|
| 77 | - // couper doit se faire apres propre |
|
| 78 | - //$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect); |
|
| 79 | - |
|
| 80 | - // Cependant pour des questions de perfs on coupe quand meme, en prenant |
|
| 81 | - // large et en se mefiant des tableaux #1323 |
|
| 82 | - |
|
| 83 | - if (strlen($intro)) { |
|
| 84 | - $texte = $intro; |
|
| 85 | - } else { |
|
| 86 | - if ( |
|
| 87 | - strpos("\n" . $texte, "\n|") === false |
|
| 88 | - and strlen($texte) > 2.5 * $longueur |
|
| 89 | - ) { |
|
| 90 | - if (strpos($texte, '<multi') !== false) { |
|
| 91 | - $texte = extraire_multi($texte); |
|
| 92 | - } |
|
| 93 | - $texte = couper($texte, 2 * $longueur); |
|
| 94 | - } |
|
| 95 | - } |
|
| 96 | - |
|
| 97 | - // ne pas tenir compte des notes |
|
| 98 | - if ($notes = charger_fonction('notes', 'inc', true)) { |
|
| 99 | - $notes('', 'empiler'); |
|
| 100 | - } |
|
| 101 | - // Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable |
|
| 102 | - // dans l'introduction. |
|
| 103 | - $texte = supprime_img($texte, ''); |
|
| 104 | - $texte = appliquer_traitement_champ($texte, 'introduction', '', [], $connect); |
|
| 105 | - |
|
| 106 | - if ($notes) { |
|
| 107 | - $notes('', 'depiler'); |
|
| 108 | - } |
|
| 109 | - |
|
| 110 | - if (is_null($suite) and defined('_INTRODUCTION_SUITE')) { |
|
| 111 | - $suite = _INTRODUCTION_SUITE; |
|
| 112 | - } |
|
| 113 | - $texte = couper($texte, $longueur, $suite); |
|
| 114 | - // comme on a coupe il faut repasser la typo (on a perdu les insecables) |
|
| 115 | - $texte = typo($texte, true, $connect, []); |
|
| 116 | - |
|
| 117 | - // et reparagrapher si necessaire (coherence avec le cas descriptif) |
|
| 118 | - // une introduction a tojours un <p> |
|
| 119 | - if ($GLOBALS['toujours_paragrapher']) { // Fermer les paragraphes |
|
| 120 | - $texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']); |
|
| 121 | - } |
|
| 122 | - |
|
| 123 | - return $texte; |
|
| 55 | + // Si un descriptif est envoye, on l'utilise directement |
|
| 56 | + if (strlen($descriptif)) { |
|
| 57 | + return appliquer_traitement_champ($descriptif, 'introduction', '', [], $connect); |
|
| 58 | + } |
|
| 59 | + |
|
| 60 | + // De preference ce qui est marque <intro>...</intro> |
|
| 61 | + $intro = ''; |
|
| 62 | + $texte = preg_replace(',(</?)intro>,i', "\\1intro>", $texte); // minuscules |
|
| 63 | + while ($fin = strpos($texte, '</intro>')) { |
|
| 64 | + $zone = substr($texte, 0, $fin); |
|
| 65 | + $texte = substr($texte, $fin + strlen('</intro>')); |
|
| 66 | + if ($deb = strpos($zone, '<intro>') or substr($zone, 0, 7) == '<intro>') { |
|
| 67 | + $zone = substr($zone, $deb + 7); |
|
| 68 | + } |
|
| 69 | + $intro .= $zone; |
|
| 70 | + } |
|
| 71 | + |
|
| 72 | + // [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut, |
|
| 73 | + // qui inclus raccourcis et modeles |
|
| 74 | + // un simple <articlexx> peut etre ensuite transforme en 1000 lignes ... |
|
| 75 | + // par ailleurs le nettoyage des raccourcis ne tient pas compte |
|
| 76 | + // des surcharges et enrichissement de propre |
|
| 77 | + // couper doit se faire apres propre |
|
| 78 | + //$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect); |
|
| 79 | + |
|
| 80 | + // Cependant pour des questions de perfs on coupe quand meme, en prenant |
|
| 81 | + // large et en se mefiant des tableaux #1323 |
|
| 82 | + |
|
| 83 | + if (strlen($intro)) { |
|
| 84 | + $texte = $intro; |
|
| 85 | + } else { |
|
| 86 | + if ( |
|
| 87 | + strpos("\n" . $texte, "\n|") === false |
|
| 88 | + and strlen($texte) > 2.5 * $longueur |
|
| 89 | + ) { |
|
| 90 | + if (strpos($texte, '<multi') !== false) { |
|
| 91 | + $texte = extraire_multi($texte); |
|
| 92 | + } |
|
| 93 | + $texte = couper($texte, 2 * $longueur); |
|
| 94 | + } |
|
| 95 | + } |
|
| 96 | + |
|
| 97 | + // ne pas tenir compte des notes |
|
| 98 | + if ($notes = charger_fonction('notes', 'inc', true)) { |
|
| 99 | + $notes('', 'empiler'); |
|
| 100 | + } |
|
| 101 | + // Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable |
|
| 102 | + // dans l'introduction. |
|
| 103 | + $texte = supprime_img($texte, ''); |
|
| 104 | + $texte = appliquer_traitement_champ($texte, 'introduction', '', [], $connect); |
|
| 105 | + |
|
| 106 | + if ($notes) { |
|
| 107 | + $notes('', 'depiler'); |
|
| 108 | + } |
|
| 109 | + |
|
| 110 | + if (is_null($suite) and defined('_INTRODUCTION_SUITE')) { |
|
| 111 | + $suite = _INTRODUCTION_SUITE; |
|
| 112 | + } |
|
| 113 | + $texte = couper($texte, $longueur, $suite); |
|
| 114 | + // comme on a coupe il faut repasser la typo (on a perdu les insecables) |
|
| 115 | + $texte = typo($texte, true, $connect, []); |
|
| 116 | + |
|
| 117 | + // et reparagrapher si necessaire (coherence avec le cas descriptif) |
|
| 118 | + // une introduction a tojours un <p> |
|
| 119 | + if ($GLOBALS['toujours_paragrapher']) { // Fermer les paragraphes |
|
| 120 | + $texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']); |
|
| 121 | + } |
|
| 122 | + |
|
| 123 | + return $texte; |
|
| 124 | 124 | } |
| 125 | 125 | |
| 126 | 126 | |
@@ -155,73 +155,73 @@ discard block |
||
| 155 | 155 | * Code HTML de la pagination |
| 156 | 156 | **/ |
| 157 | 157 | function filtre_pagination_dist( |
| 158 | - $total, |
|
| 159 | - $nom, |
|
| 160 | - $position, |
|
| 161 | - $pas, |
|
| 162 | - $liste = true, |
|
| 163 | - $modele = '', |
|
| 164 | - $connect = '', |
|
| 165 | - $env = [] |
|
| 158 | + $total, |
|
| 159 | + $nom, |
|
| 160 | + $position, |
|
| 161 | + $pas, |
|
| 162 | + $liste = true, |
|
| 163 | + $modele = '', |
|
| 164 | + $connect = '', |
|
| 165 | + $env = [] |
|
| 166 | 166 | ) { |
| 167 | - static $ancres = []; |
|
| 168 | - if ($pas < 1) { |
|
| 169 | - return ''; |
|
| 170 | - } |
|
| 171 | - $ancre = 'pagination' . $nom; // #pagination_articles |
|
| 172 | - $debut = 'debut' . $nom; // 'debut_articles' |
|
| 173 | - |
|
| 174 | - // n'afficher l'ancre qu'une fois |
|
| 175 | - if (!isset($ancres[$ancre])) { |
|
| 176 | - $bloc_ancre = $ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>"; |
|
| 177 | - } else { |
|
| 178 | - $bloc_ancre = ''; |
|
| 179 | - } |
|
| 180 | - // liste = false : on ne veut que l'ancre |
|
| 181 | - if (!$liste) { |
|
| 182 | - return $ancres[$ancre]; |
|
| 183 | - } |
|
| 184 | - |
|
| 185 | - $self = (empty($env['self']) ? self() : $env['self']); |
|
| 186 | - $pagination = [ |
|
| 187 | - 'debut' => $debut, |
|
| 188 | - 'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel |
|
| 189 | - 'total' => $total, |
|
| 190 | - 'position' => intval($position), |
|
| 191 | - 'pas' => $pas, |
|
| 192 | - 'nombre_pages' => floor(($total - 1) / $pas) + 1, |
|
| 193 | - 'page_courante' => floor(intval($position) / $pas) + 1, |
|
| 194 | - 'ancre' => $ancre, |
|
| 195 | - 'bloc_ancre' => $bloc_ancre |
|
| 196 | - ]; |
|
| 197 | - if (is_array($env)) { |
|
| 198 | - $pagination = array_merge($env, $pagination); |
|
| 199 | - } |
|
| 200 | - |
|
| 201 | - // Pas de pagination |
|
| 202 | - if ($pagination['nombre_pages'] <= 1) { |
|
| 203 | - return ''; |
|
| 204 | - } |
|
| 205 | - |
|
| 206 | - if ($modele) { |
|
| 207 | - $pagination['type_pagination'] = $modele; |
|
| 208 | - if (trouver_fond('pagination_' . $modele, 'modeles')) { |
|
| 209 | - $modele = '_' . $modele; |
|
| 210 | - } |
|
| 211 | - else { |
|
| 212 | - $modele = ''; |
|
| 213 | - } |
|
| 214 | - } |
|
| 215 | - |
|
| 216 | - if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) { |
|
| 217 | - define('_PAGINATION_NOMBRE_LIENS_MAX', 10); |
|
| 218 | - } |
|
| 219 | - if (!defined('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE')) { |
|
| 220 | - define('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE', 5); |
|
| 221 | - } |
|
| 222 | - |
|
| 223 | - |
|
| 224 | - return recuperer_fond("modeles/pagination$modele", $pagination, ['trim' => true], $connect); |
|
| 167 | + static $ancres = []; |
|
| 168 | + if ($pas < 1) { |
|
| 169 | + return ''; |
|
| 170 | + } |
|
| 171 | + $ancre = 'pagination' . $nom; // #pagination_articles |
|
| 172 | + $debut = 'debut' . $nom; // 'debut_articles' |
|
| 173 | + |
|
| 174 | + // n'afficher l'ancre qu'une fois |
|
| 175 | + if (!isset($ancres[$ancre])) { |
|
| 176 | + $bloc_ancre = $ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>"; |
|
| 177 | + } else { |
|
| 178 | + $bloc_ancre = ''; |
|
| 179 | + } |
|
| 180 | + // liste = false : on ne veut que l'ancre |
|
| 181 | + if (!$liste) { |
|
| 182 | + return $ancres[$ancre]; |
|
| 183 | + } |
|
| 184 | + |
|
| 185 | + $self = (empty($env['self']) ? self() : $env['self']); |
|
| 186 | + $pagination = [ |
|
| 187 | + 'debut' => $debut, |
|
| 188 | + 'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel |
|
| 189 | + 'total' => $total, |
|
| 190 | + 'position' => intval($position), |
|
| 191 | + 'pas' => $pas, |
|
| 192 | + 'nombre_pages' => floor(($total - 1) / $pas) + 1, |
|
| 193 | + 'page_courante' => floor(intval($position) / $pas) + 1, |
|
| 194 | + 'ancre' => $ancre, |
|
| 195 | + 'bloc_ancre' => $bloc_ancre |
|
| 196 | + ]; |
|
| 197 | + if (is_array($env)) { |
|
| 198 | + $pagination = array_merge($env, $pagination); |
|
| 199 | + } |
|
| 200 | + |
|
| 201 | + // Pas de pagination |
|
| 202 | + if ($pagination['nombre_pages'] <= 1) { |
|
| 203 | + return ''; |
|
| 204 | + } |
|
| 205 | + |
|
| 206 | + if ($modele) { |
|
| 207 | + $pagination['type_pagination'] = $modele; |
|
| 208 | + if (trouver_fond('pagination_' . $modele, 'modeles')) { |
|
| 209 | + $modele = '_' . $modele; |
|
| 210 | + } |
|
| 211 | + else { |
|
| 212 | + $modele = ''; |
|
| 213 | + } |
|
| 214 | + } |
|
| 215 | + |
|
| 216 | + if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) { |
|
| 217 | + define('_PAGINATION_NOMBRE_LIENS_MAX', 10); |
|
| 218 | + } |
|
| 219 | + if (!defined('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE')) { |
|
| 220 | + define('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE', 5); |
|
| 221 | + } |
|
| 222 | + |
|
| 223 | + |
|
| 224 | + return recuperer_fond("modeles/pagination$modele", $pagination, ['trim' => true], $connect); |
|
| 225 | 225 | } |
| 226 | 226 | |
| 227 | 227 | |
@@ -240,44 +240,44 @@ discard block |
||
| 240 | 240 | * Liste (première page, dernière page). |
| 241 | 241 | **/ |
| 242 | 242 | function filtre_bornes_pagination_dist($courante, $nombre, $max = 10) { |
| 243 | - if ($max <= 0 or $max >= $nombre) { |
|
| 244 | - return [1, $nombre]; |
|
| 245 | - } |
|
| 246 | - if ($max <= 1) { |
|
| 247 | - return [$courante, $courante]; |
|
| 248 | - } |
|
| 249 | - |
|
| 250 | - $premiere = max(1, $courante - floor(($max - 1) / 2)); |
|
| 251 | - $derniere = min($nombre, $premiere + $max - 2); |
|
| 252 | - $premiere = $derniere == $nombre ? $derniere - $max + 1 : $premiere; |
|
| 253 | - |
|
| 254 | - return [$premiere, $derniere]; |
|
| 243 | + if ($max <= 0 or $max >= $nombre) { |
|
| 244 | + return [1, $nombre]; |
|
| 245 | + } |
|
| 246 | + if ($max <= 1) { |
|
| 247 | + return [$courante, $courante]; |
|
| 248 | + } |
|
| 249 | + |
|
| 250 | + $premiere = max(1, $courante - floor(($max - 1) / 2)); |
|
| 251 | + $derniere = min($nombre, $premiere + $max - 2); |
|
| 252 | + $premiere = $derniere == $nombre ? $derniere - $max + 1 : $premiere; |
|
| 253 | + |
|
| 254 | + return [$premiere, $derniere]; |
|
| 255 | 255 | } |
| 256 | 256 | |
| 257 | 257 | function filtre_pagination_affiche_texte_lien_page_dist($type_pagination, $numero_page, $rang_item) { |
| 258 | - if ($numero_page === 'tous') { |
|
| 259 | - return '∞'; |
|
| 260 | - } |
|
| 261 | - if ($numero_page === 'prev') { |
|
| 262 | - return '<'; |
|
| 263 | - } |
|
| 264 | - if ($numero_page === 'next') { |
|
| 265 | - return '>'; |
|
| 266 | - } |
|
| 267 | - |
|
| 268 | - switch ($type_pagination) { |
|
| 269 | - case 'resultats': |
|
| 270 | - return $rang_item + 1; // 1 11 21 31... |
|
| 271 | - case 'naturel': |
|
| 272 | - return $rang_item ? $rang_item : 1; // 1 10 20 30... |
|
| 273 | - case 'rang': |
|
| 274 | - return $rang_item; // 0 10 20 30... |
|
| 275 | - |
|
| 276 | - case 'page': |
|
| 277 | - case 'prive': |
|
| 278 | - default: |
|
| 279 | - return $numero_page; // 1 2 3 4 5... |
|
| 280 | - } |
|
| 258 | + if ($numero_page === 'tous') { |
|
| 259 | + return '∞'; |
|
| 260 | + } |
|
| 261 | + if ($numero_page === 'prev') { |
|
| 262 | + return '<'; |
|
| 263 | + } |
|
| 264 | + if ($numero_page === 'next') { |
|
| 265 | + return '>'; |
|
| 266 | + } |
|
| 267 | + |
|
| 268 | + switch ($type_pagination) { |
|
| 269 | + case 'resultats': |
|
| 270 | + return $rang_item + 1; // 1 11 21 31... |
|
| 271 | + case 'naturel': |
|
| 272 | + return $rang_item ? $rang_item : 1; // 1 10 20 30... |
|
| 273 | + case 'rang': |
|
| 274 | + return $rang_item; // 0 10 20 30... |
|
| 275 | + |
|
| 276 | + case 'page': |
|
| 277 | + case 'prive': |
|
| 278 | + default: |
|
| 279 | + return $numero_page; // 1 2 3 4 5... |
|
| 280 | + } |
|
| 281 | 281 | } |
| 282 | 282 | |
| 283 | 283 | /** |
@@ -290,15 +290,15 @@ discard block |
||
| 290 | 290 | **/ |
| 291 | 291 | function lister_objets_avec_logos($type) { |
| 292 | 292 | |
| 293 | - $objet = objet_type($type); |
|
| 294 | - $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)); |
|
| 295 | - if ($ids) { |
|
| 296 | - $ids = array_column($ids, 'id_objet'); |
|
| 297 | - return implode(',', $ids); |
|
| 298 | - } |
|
| 299 | - else { |
|
| 300 | - return '0'; |
|
| 301 | - } |
|
| 293 | + $objet = objet_type($type); |
|
| 294 | + $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)); |
|
| 295 | + if ($ids) { |
|
| 296 | + $ids = array_column($ids, 'id_objet'); |
|
| 297 | + return implode(',', $ids); |
|
| 298 | + } |
|
| 299 | + else { |
|
| 300 | + return '0'; |
|
| 301 | + } |
|
| 302 | 302 | } |
| 303 | 303 | |
| 304 | 304 | |
@@ -314,14 +314,14 @@ discard block |
||
| 314 | 314 | * Code HTML des notes |
| 315 | 315 | **/ |
| 316 | 316 | function calculer_notes() { |
| 317 | - $r = ''; |
|
| 318 | - if ($notes = charger_fonction('notes', 'inc', true)) { |
|
| 319 | - $r = $notes([]); |
|
| 320 | - $notes('', 'depiler'); |
|
| 321 | - $notes('', 'empiler'); |
|
| 322 | - } |
|
| 323 | - |
|
| 324 | - return $r; |
|
| 317 | + $r = ''; |
|
| 318 | + if ($notes = charger_fonction('notes', 'inc', true)) { |
|
| 319 | + $r = $notes([]); |
|
| 320 | + $notes('', 'depiler'); |
|
| 321 | + $notes('', 'empiler'); |
|
| 322 | + } |
|
| 323 | + |
|
| 324 | + return $r; |
|
| 325 | 325 | } |
| 326 | 326 | |
| 327 | 327 | |
@@ -338,10 +338,10 @@ discard block |
||
| 338 | 338 | * @return string |
| 339 | 339 | */ |
| 340 | 340 | function retrouver_rang_lien($objet_source, $ids, $objet_lie, $idl, $objet_lien) { |
| 341 | - $res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien); |
|
| 342 | - $res = array_column($res, 'rang_lien', $objet_source); |
|
| 341 | + $res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien); |
|
| 342 | + $res = array_column($res, 'rang_lien', $objet_source); |
|
| 343 | 343 | |
| 344 | - return (isset($res[$ids]) ? $res[$ids] : ''); |
|
| 344 | + return (isset($res[$ids]) ? $res[$ids] : ''); |
|
| 345 | 345 | } |
| 346 | 346 | |
| 347 | 347 | |
@@ -358,19 +358,19 @@ discard block |
||
| 358 | 358 | * @private |
| 359 | 359 | */ |
| 360 | 360 | function lister_objets_liens($objet_source, $objet, $id_objet, $objet_lien) { |
| 361 | - static $liens = []; |
|
| 362 | - if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) { |
|
| 363 | - include_spip('action/editer_liens'); |
|
| 364 | - // quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source |
|
| 365 | - if ($objet_lien == $objet and $objet_lien !== $objet_source) { |
|
| 366 | - $res = objet_trouver_liens([$objet => $id_objet], [$objet_source => '*']); |
|
| 367 | - } else { |
|
| 368 | - $res = objet_trouver_liens([$objet_source => '*'], [$objet => $id_objet]); |
|
| 369 | - } |
|
| 370 | - |
|
| 371 | - $liens["$objet_source-$objet-$id_objet-$objet_lien"] = $res; |
|
| 372 | - } |
|
| 373 | - return $liens["$objet_source-$objet-$id_objet-$objet_lien"]; |
|
| 361 | + static $liens = []; |
|
| 362 | + if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) { |
|
| 363 | + include_spip('action/editer_liens'); |
|
| 364 | + // quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source |
|
| 365 | + if ($objet_lien == $objet and $objet_lien !== $objet_source) { |
|
| 366 | + $res = objet_trouver_liens([$objet => $id_objet], [$objet_source => '*']); |
|
| 367 | + } else { |
|
| 368 | + $res = objet_trouver_liens([$objet_source => '*'], [$objet => $id_objet]); |
|
| 369 | + } |
|
| 370 | + |
|
| 371 | + $liens["$objet_source-$objet-$id_objet-$objet_lien"] = $res; |
|
| 372 | + } |
|
| 373 | + return $liens["$objet_source-$objet-$id_objet-$objet_lien"]; |
|
| 374 | 374 | } |
| 375 | 375 | |
| 376 | 376 | /** |
@@ -384,24 +384,24 @@ discard block |
||
| 384 | 384 | * @return int|string |
| 385 | 385 | */ |
| 386 | 386 | function calculer_rang_smart($titre, $objet_source, $id, $env) { |
| 387 | - // Cas du #RANG utilisé dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien |
|
| 388 | - // 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 |
|
| 389 | - if ( |
|
| 390 | - isset($env['form']) and $env['form'] |
|
| 391 | - and isset($env['_objet_lien']) and $env['_objet_lien'] |
|
| 392 | - and (function_exists('lien_triables') or include_spip('action/editer_liens')) |
|
| 393 | - and $r = objet_associable($env['_objet_lien']) |
|
| 394 | - and list($p, $table_lien) = $r |
|
| 395 | - and lien_triables($table_lien) |
|
| 396 | - and isset($env['objet']) and $env['objet'] |
|
| 397 | - and isset($env['id_objet']) and $env['id_objet'] |
|
| 398 | - and $objet_source |
|
| 399 | - and $id = intval($id) |
|
| 400 | - ) { |
|
| 401 | - $rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']); |
|
| 402 | - return ($rang ? $rang : ''); |
|
| 403 | - } |
|
| 404 | - return recuperer_numero($titre); |
|
| 387 | + // Cas du #RANG utilisé dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien |
|
| 388 | + // 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 |
|
| 389 | + if ( |
|
| 390 | + isset($env['form']) and $env['form'] |
|
| 391 | + and isset($env['_objet_lien']) and $env['_objet_lien'] |
|
| 392 | + and (function_exists('lien_triables') or include_spip('action/editer_liens')) |
|
| 393 | + and $r = objet_associable($env['_objet_lien']) |
|
| 394 | + and list($p, $table_lien) = $r |
|
| 395 | + and lien_triables($table_lien) |
|
| 396 | + and isset($env['objet']) and $env['objet'] |
|
| 397 | + and isset($env['id_objet']) and $env['id_objet'] |
|
| 398 | + and $objet_source |
|
| 399 | + and $id = intval($id) |
|
| 400 | + ) { |
|
| 401 | + $rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']); |
|
| 402 | + return ($rang ? $rang : ''); |
|
| 403 | + } |
|
| 404 | + return recuperer_numero($titre); |
|
| 405 | 405 | } |
| 406 | 406 | |
| 407 | 407 | |
@@ -417,7 +417,7 @@ discard block |
||
| 417 | 417 | * @return string |
| 418 | 418 | */ |
| 419 | 419 | function tri_protege_champ($t) { |
| 420 | - return preg_replace(',[^\s\w.+\[\]],', '', $t); |
|
| 420 | + return preg_replace(',[^\s\w.+\[\]],', '', $t); |
|
| 421 | 421 | } |
| 422 | 422 | |
| 423 | 423 | /** |
@@ -430,43 +430,43 @@ discard block |
||
| 430 | 430 | * @return string |
| 431 | 431 | */ |
| 432 | 432 | function tri_champ_order($t, $from = null, $senstri = '') { |
| 433 | - if (strncmp($t, 'multi ', 6) == 0) { |
|
| 434 | - return 'multi'; |
|
| 435 | - } |
|
| 436 | - |
|
| 437 | - $champ = $t; |
|
| 438 | - |
|
| 439 | - $prefixe = ''; |
|
| 440 | - foreach (['num ', 'sinum '] as $p) { |
|
| 441 | - if (strpos($t, $p) === 0) { |
|
| 442 | - $champ = substr($t, strlen($p)); |
|
| 443 | - $prefixe = $p; |
|
| 444 | - } |
|
| 445 | - } |
|
| 446 | - |
|
| 447 | - // enlever les autres espaces non evacues par tri_protege_champ |
|
| 448 | - $champ = preg_replace(',\s,', '', $champ); |
|
| 449 | - |
|
| 450 | - if (is_array($from)) { |
|
| 451 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 452 | - foreach ($from as $idt => $table_sql) { |
|
| 453 | - if ( |
|
| 454 | - $desc = $trouver_table($table_sql) |
|
| 455 | - and isset($desc['field'][$champ]) |
|
| 456 | - ) { |
|
| 457 | - $champ = "$idt.$champ"; |
|
| 458 | - break; |
|
| 459 | - } |
|
| 460 | - } |
|
| 461 | - } |
|
| 462 | - switch ($prefixe) { |
|
| 463 | - case 'num ': |
|
| 464 | - return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}"; |
|
| 465 | - case 'sinum ': |
|
| 466 | - return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}"; |
|
| 467 | - default: |
|
| 468 | - return $champ . $senstri; |
|
| 469 | - } |
|
| 433 | + if (strncmp($t, 'multi ', 6) == 0) { |
|
| 434 | + return 'multi'; |
|
| 435 | + } |
|
| 436 | + |
|
| 437 | + $champ = $t; |
|
| 438 | + |
|
| 439 | + $prefixe = ''; |
|
| 440 | + foreach (['num ', 'sinum '] as $p) { |
|
| 441 | + if (strpos($t, $p) === 0) { |
|
| 442 | + $champ = substr($t, strlen($p)); |
|
| 443 | + $prefixe = $p; |
|
| 444 | + } |
|
| 445 | + } |
|
| 446 | + |
|
| 447 | + // enlever les autres espaces non evacues par tri_protege_champ |
|
| 448 | + $champ = preg_replace(',\s,', '', $champ); |
|
| 449 | + |
|
| 450 | + if (is_array($from)) { |
|
| 451 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 452 | + foreach ($from as $idt => $table_sql) { |
|
| 453 | + if ( |
|
| 454 | + $desc = $trouver_table($table_sql) |
|
| 455 | + and isset($desc['field'][$champ]) |
|
| 456 | + ) { |
|
| 457 | + $champ = "$idt.$champ"; |
|
| 458 | + break; |
|
| 459 | + } |
|
| 460 | + } |
|
| 461 | + } |
|
| 462 | + switch ($prefixe) { |
|
| 463 | + case 'num ': |
|
| 464 | + return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}"; |
|
| 465 | + case 'sinum ': |
|
| 466 | + return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}"; |
|
| 467 | + default: |
|
| 468 | + return $champ . $senstri; |
|
| 469 | + } |
|
| 470 | 470 | } |
| 471 | 471 | |
| 472 | 472 | /** |
@@ -480,18 +480,18 @@ discard block |
||
| 480 | 480 | * @return string |
| 481 | 481 | */ |
| 482 | 482 | function tri_champ_select($t) { |
| 483 | - if (strncmp($t, 'multi ', 6) == 0) { |
|
| 484 | - $t = substr($t, 6); |
|
| 485 | - $t = preg_replace(',\s,', '', $t); |
|
| 486 | - $t = sql_multi($t, $GLOBALS['spip_lang']); |
|
| 487 | - |
|
| 488 | - return $t; |
|
| 489 | - } |
|
| 490 | - if (trim($t) == 'hasard') { |
|
| 491 | - return 'rand() AS hasard'; |
|
| 492 | - } |
|
| 493 | - |
|
| 494 | - return "''"; |
|
| 483 | + if (strncmp($t, 'multi ', 6) == 0) { |
|
| 484 | + $t = substr($t, 6); |
|
| 485 | + $t = preg_replace(',\s,', '', $t); |
|
| 486 | + $t = sql_multi($t, $GLOBALS['spip_lang']); |
|
| 487 | + |
|
| 488 | + return $t; |
|
| 489 | + } |
|
| 490 | + if (trim($t) == 'hasard') { |
|
| 491 | + return 'rand() AS hasard'; |
|
| 492 | + } |
|
| 493 | + |
|
| 494 | + return "''"; |
|
| 495 | 495 | } |
| 496 | 496 | |
| 497 | 497 | /** |
@@ -503,16 +503,16 @@ discard block |
||
| 503 | 503 | * @return string |
| 504 | 504 | */ |
| 505 | 505 | function formate_liste_critere_par_ordre_liste($valeurs, $serveur = '') { |
| 506 | - if (!is_array($valeurs)) { |
|
| 507 | - return ''; |
|
| 508 | - } |
|
| 509 | - $f = sql_serveur('quote', $serveur, true); |
|
| 510 | - if (!is_string($f) or !$f) { |
|
| 511 | - return ''; |
|
| 512 | - } |
|
| 513 | - $valeurs = implode(',', array_map($f, array_unique($valeurs))); |
|
| 514 | - |
|
| 515 | - return $valeurs; |
|
| 506 | + if (!is_array($valeurs)) { |
|
| 507 | + return ''; |
|
| 508 | + } |
|
| 509 | + $f = sql_serveur('quote', $serveur, true); |
|
| 510 | + if (!is_string($f) or !$f) { |
|
| 511 | + return ''; |
|
| 512 | + } |
|
| 513 | + $valeurs = implode(',', array_map($f, array_unique($valeurs))); |
|
| 514 | + |
|
| 515 | + return $valeurs; |
|
| 516 | 516 | } |
| 517 | 517 | |
| 518 | 518 | /** |
@@ -535,21 +535,21 @@ discard block |
||
| 535 | 535 | * Valeur $defaut sinon. |
| 536 | 536 | **/ |
| 537 | 537 | function appliquer_filtre_sinon($arg, $filtre, $args, $defaut = '') { |
| 538 | - // Si c'est un filtre d'image, on utilise image_filtrer() |
|
| 539 | - // Attention : les 2 premiers arguments sont inversés dans ce cas |
|
| 540 | - if (trouver_filtre_matrice($filtre) and substr($filtre, 0, 6) == 'image_') { |
|
| 541 | - include_spip('inc/filtres_images_lib_mini'); |
|
| 542 | - $args[1] = $args[0]; |
|
| 543 | - $args[0] = $filtre; |
|
| 544 | - return image_graver(image_filtrer($args)); |
|
| 545 | - } |
|
| 546 | - |
|
| 547 | - $f = chercher_filtre($filtre); |
|
| 548 | - if (!$f) { |
|
| 549 | - return $defaut; |
|
| 550 | - } |
|
| 551 | - array_shift($args); // enlever $arg |
|
| 552 | - array_shift($args); // enlever $filtre |
|
| 553 | - array_unshift($args, $arg); // remettre $arg |
|
| 554 | - return call_user_func_array($f, $args); |
|
| 538 | + // Si c'est un filtre d'image, on utilise image_filtrer() |
|
| 539 | + // Attention : les 2 premiers arguments sont inversés dans ce cas |
|
| 540 | + if (trouver_filtre_matrice($filtre) and substr($filtre, 0, 6) == 'image_') { |
|
| 541 | + include_spip('inc/filtres_images_lib_mini'); |
|
| 542 | + $args[1] = $args[0]; |
|
| 543 | + $args[0] = $filtre; |
|
| 544 | + return image_graver(image_filtrer($args)); |
|
| 545 | + } |
|
| 546 | + |
|
| 547 | + $f = chercher_filtre($filtre); |
|
| 548 | + if (!$f) { |
|
| 549 | + return $defaut; |
|
| 550 | + } |
|
| 551 | + array_shift($args); // enlever $arg |
|
| 552 | + array_shift($args); // enlever $filtre |
|
| 553 | + array_unshift($args, $arg); // remettre $arg |
|
| 554 | + return call_user_func_array($f, $args); |
|
| 555 | 555 | } |
@@ -37,7 +37,7 @@ discard block |
||
| 37 | 37 | |
| 38 | 38 | $GLOBALS['contexte'] = calculer_contexte(); |
| 39 | 39 | $page = ['contexte_implicite' => calculer_contexte_implicite()]; |
| 40 | - $page['contexte_implicite']['cache'] = $fond . preg_replace( |
|
| 40 | + $page['contexte_implicite']['cache'] = $fond.preg_replace( |
|
| 41 | 41 | ',\.[a-zA-Z0-9]*$,', |
| 42 | 42 | '', |
| 43 | 43 | preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI']) |
@@ -138,7 +138,7 @@ discard block |
||
| 138 | 138 | if ($page === '') { |
| 139 | 139 | $erreur = _T( |
| 140 | 140 | 'info_erreur_squelette2', |
| 141 | - ['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES] |
|
| 141 | + ['fichier' => spip_htmlspecialchars($fond).'.'._EXTENSION_SQUELETTES] |
|
| 142 | 142 | ); |
| 143 | 143 | erreur_squelette($erreur); |
| 144 | 144 | // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4 |
@@ -183,7 +183,7 @@ discard block |
||
| 183 | 183 | and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) |
| 184 | 184 | and !isset($page['entetes']['Last-Modified']) |
| 185 | 185 | ) { |
| 186 | - $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT'; |
|
| 186 | + $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified).' GMT'; |
|
| 187 | 187 | } |
| 188 | 188 | |
| 189 | 189 | // fermer la connexion apres les headers si requete HEAD |
@@ -248,7 +248,7 @@ discard block |
||
| 248 | 248 | 'spip_version_code' => $GLOBALS['spip_version_code'], |
| 249 | 249 | ]; |
| 250 | 250 | if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { |
| 251 | - $contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST']; |
|
| 251 | + $contexte_implicite['host'] .= '|'.$_SERVER['HTTP_X_FORWARDED_HOST']; |
|
| 252 | 252 | } |
| 253 | 253 | |
| 254 | 254 | return $contexte_implicite; |
@@ -579,7 +579,7 @@ discard block |
||
| 579 | 579 | } |
| 580 | 580 | } |
| 581 | 581 | if (is_null($id)) { |
| 582 | - $msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]); |
|
| 582 | + $msg = "modeles/$modele : "._T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]); |
|
| 583 | 583 | erreur_squelette($msg); |
| 584 | 584 | // on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant |
| 585 | 585 | $id = 0; |
@@ -626,7 +626,7 @@ discard block |
||
| 626 | 626 | } |
| 627 | 627 | |
| 628 | 628 | if (preg_match(',^[a-z0-9_]+$,', $soustype)) { |
| 629 | - if (!trouve_modele($fond = ($type . '_' . $soustype))) { |
|
| 629 | + if (!trouve_modele($fond = ($type.'_'.$soustype))) { |
|
| 630 | 630 | $fond = ''; |
| 631 | 631 | $class = $soustype; |
| 632 | 632 | } |
@@ -641,7 +641,7 @@ discard block |
||
| 641 | 641 | |
| 642 | 642 | return false; |
| 643 | 643 | } |
| 644 | - $fond = 'modeles/' . $fond; |
|
| 644 | + $fond = 'modeles/'.$fond; |
|
| 645 | 645 | // Creer le contexte |
| 646 | 646 | $contexte = $env; |
| 647 | 647 | $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 |
@@ -682,7 +682,7 @@ discard block |
||
| 682 | 682 | // sinon, s'il y a un lien, on l'ajoute classiquement |
| 683 | 683 | if ( |
| 684 | 684 | strstr( |
| 685 | - ' ' . ($classes = extraire_attribut($retour, 'class')) . ' ', |
|
| 685 | + ' '.($classes = extraire_attribut($retour, 'class')).' ', |
|
| 686 | 686 | 'spip_lien_ok' |
| 687 | 687 | ) |
| 688 | 688 | ) { |
@@ -693,7 +693,7 @@ discard block |
||
| 693 | 693 | ); |
| 694 | 694 | } else { |
| 695 | 695 | if ($lien) { |
| 696 | - $retour = "<a href='" . $lien['href'] . "' class='" . $lien['class'] . "'>" . $retour . '</a>'; |
|
| 696 | + $retour = "<a href='".$lien['href']."' class='".$lien['class']."'>".$retour.'</a>'; |
|
| 697 | 697 | } |
| 698 | 698 | } |
| 699 | 699 | |
@@ -717,7 +717,7 @@ discard block |
||
| 717 | 717 | return $page; |
| 718 | 718 | } |
| 719 | 719 | // eval $page et affecte $res |
| 720 | - include _ROOT_RESTREINT . 'public/evaluer_page.php'; |
|
| 720 | + include _ROOT_RESTREINT.'public/evaluer_page.php'; |
|
| 721 | 721 | |
| 722 | 722 | // Lever un drapeau (global) si le fond utilise #SESSION |
| 723 | 723 | // a destination de public/parametrer |
@@ -785,16 +785,16 @@ discard block |
||
| 785 | 785 | if (($pos = strpos($head, '<head>')) !== false) { |
| 786 | 786 | $head = substr_replace($head, $base, $pos + 6, 0); |
| 787 | 787 | } elseif (preg_match(',<head[^>]*>,i', $head, $r)) { |
| 788 | - $head = str_replace($r[0], $r[0] . $base, $head); |
|
| 788 | + $head = str_replace($r[0], $r[0].$base, $head); |
|
| 789 | 789 | } |
| 790 | - $texte = $head . substr($texte, $poshead); |
|
| 790 | + $texte = $head.substr($texte, $poshead); |
|
| 791 | 791 | } |
| 792 | 792 | if ($href_base) { |
| 793 | 793 | // gerer les ancres |
| 794 | 794 | $base = $_SERVER['REQUEST_URI']; |
| 795 | 795 | // pas de guillemets ni < dans l'URL qu'on insere dans le HTML |
| 796 | 796 | if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) { |
| 797 | - $base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base); |
|
| 797 | + $base = str_replace(["'", '"', '<'], ['%27', '%22', '%3C'], $base); |
|
| 798 | 798 | } |
| 799 | 799 | if (strpos($texte, "href='#") !== false) { |
| 800 | 800 | $texte = str_replace("href='#", "href='$base#", $texte); |
@@ -20,178 +20,178 @@ discard block |
||
| 20 | 20 | **/ |
| 21 | 21 | |
| 22 | 22 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 23 | - return; |
|
| 23 | + return; |
|
| 24 | 24 | } |
| 25 | 25 | |
| 26 | 26 | // En cas de modification, il faut aussi actualiser la regexp de nettoyer_uri_var() dans inc/utils.php |
| 27 | 27 | if (!defined('_CONTEXTE_IGNORE_VARIABLES')) { |
| 28 | - define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/'); |
|
| 28 | + define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/'); |
|
| 29 | 29 | } |
| 30 | 30 | |
| 31 | 31 | // https://code.spip.net/@assembler |
| 32 | 32 | function assembler($fond, $connect = '') { |
| 33 | 33 | |
| 34 | - // flag_preserver est modifie ici, et utilise en globale |
|
| 35 | - // use_cache sert a informer le bouton d'admin pr savoir s'il met un * |
|
| 36 | - // contexte est utilise en globale dans le formulaire d'admin |
|
| 37 | - |
|
| 38 | - $GLOBALS['contexte'] = calculer_contexte(); |
|
| 39 | - $page = ['contexte_implicite' => calculer_contexte_implicite()]; |
|
| 40 | - $page['contexte_implicite']['cache'] = $fond . preg_replace( |
|
| 41 | - ',\.[a-zA-Z0-9]*$,', |
|
| 42 | - '', |
|
| 43 | - preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI']) |
|
| 44 | - ); |
|
| 45 | - // Cette fonction est utilisee deux fois |
|
| 46 | - $cacher = charger_fonction('cacher', 'public', true); |
|
| 47 | - // Les quatre derniers parametres sont modifies par la fonction: |
|
| 48 | - // emplacement, validite, et, s'il est valide, contenu & age |
|
| 49 | - if ($cacher) { |
|
| 50 | - $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified); |
|
| 51 | - } else { |
|
| 52 | - $GLOBALS['use_cache'] = -1; |
|
| 53 | - } |
|
| 54 | - // Si un resultat est retourne, c'est un message d'impossibilite |
|
| 55 | - if ($res) { |
|
| 56 | - return ['texte' => $res]; |
|
| 57 | - } |
|
| 58 | - |
|
| 59 | - if (!$chemin_cache || !$lastmodified) { |
|
| 60 | - $lastmodified = time(); |
|
| 61 | - } |
|
| 62 | - |
|
| 63 | - $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD'); |
|
| 64 | - $calculer_page = true; |
|
| 65 | - |
|
| 66 | - // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client}) |
|
| 67 | - // une perennite valide a meme reponse qu'une requete HEAD (par defaut les |
|
| 68 | - // pages sont dynamiques) |
|
| 69 | - if ( |
|
| 70 | - isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) |
|
| 71 | - and (!defined('_VAR_MODE') or !_VAR_MODE) |
|
| 72 | - and $chemin_cache |
|
| 73 | - and isset($page['entetes']) |
|
| 74 | - and isset($page['entetes']['Cache-Control']) |
|
| 75 | - and strstr($page['entetes']['Cache-Control'], 'max-age=') |
|
| 76 | - and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/') |
|
| 77 | - ) { |
|
| 78 | - $since = preg_replace( |
|
| 79 | - '/;.*/', |
|
| 80 | - '', |
|
| 81 | - $_SERVER['HTTP_IF_MODIFIED_SINCE'] |
|
| 82 | - ); |
|
| 83 | - $since = str_replace('GMT', '', $since); |
|
| 84 | - if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) { |
|
| 85 | - $page['status'] = 304; |
|
| 86 | - $headers_only = true; |
|
| 87 | - $calculer_page = false; |
|
| 88 | - } |
|
| 89 | - } |
|
| 90 | - |
|
| 91 | - // Si requete HEAD ou Last-modified compatible, ignorer le texte |
|
| 92 | - // et pas de content-type (pour contrer le bouton admin de inc-public) |
|
| 93 | - if (!$calculer_page) { |
|
| 94 | - $page['texte'] = ''; |
|
| 95 | - } else { |
|
| 96 | - // si la page est prise dans le cache |
|
| 97 | - if (!$GLOBALS['use_cache']) { |
|
| 98 | - // Informer les boutons d'admin du contexte |
|
| 99 | - // (fourni par urls_decoder_url ci-dessous lors de la mise en cache) |
|
| 100 | - $GLOBALS['contexte'] = $page['contexte']; |
|
| 101 | - |
|
| 102 | - // vider les globales url propres qui ne doivent plus etre utilisees en cas |
|
| 103 | - // d'inversion url => objet |
|
| 104 | - // plus necessaire si on utilise bien la fonction urls_decoder_url |
|
| 105 | - #unset($_SERVER['REDIRECT_url_propre']); |
|
| 106 | - #unset($_ENV['url_propre']); |
|
| 107 | - } else { |
|
| 108 | - // Compat ascendante : |
|
| 109 | - // 1. $contexte est global |
|
| 110 | - // (a evacuer car urls_decoder_url gere ce probleme ?) |
|
| 111 | - // et calculer la page |
|
| 112 | - if (!test_espace_prive()) { |
|
| 113 | - include_spip('inc/urls'); |
|
| 114 | - list($fond, $GLOBALS['contexte'], $url_redirect) = urls_decoder_url( |
|
| 115 | - nettoyer_uri(), |
|
| 116 | - $fond, |
|
| 117 | - $GLOBALS['contexte'], |
|
| 118 | - true |
|
| 119 | - ); |
|
| 120 | - } |
|
| 121 | - // squelette par defaut |
|
| 122 | - if (!strlen($fond)) { |
|
| 123 | - $fond = 'sommaire'; |
|
| 124 | - } |
|
| 125 | - |
|
| 126 | - // produire la page : peut mettre a jour $lastmodified |
|
| 127 | - $produire_page = charger_fonction('produire_page', 'public'); |
|
| 128 | - $page = $produire_page( |
|
| 129 | - $fond, |
|
| 130 | - $GLOBALS['contexte'], |
|
| 131 | - $GLOBALS['use_cache'], |
|
| 132 | - $chemin_cache, |
|
| 133 | - null, |
|
| 134 | - $page, |
|
| 135 | - $lastmodified, |
|
| 136 | - $connect |
|
| 137 | - ); |
|
| 138 | - if ($page === '') { |
|
| 139 | - $erreur = _T( |
|
| 140 | - 'info_erreur_squelette2', |
|
| 141 | - ['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES] |
|
| 142 | - ); |
|
| 143 | - erreur_squelette($erreur); |
|
| 144 | - // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4 |
|
| 145 | - $page = ['texte' => '', 'erreur' => $erreur]; |
|
| 146 | - } |
|
| 147 | - } |
|
| 148 | - |
|
| 149 | - if ($page and $chemin_cache) { |
|
| 150 | - $page['cache'] = $chemin_cache; |
|
| 151 | - } |
|
| 152 | - |
|
| 153 | - auto_content_type($page); |
|
| 154 | - |
|
| 155 | - $GLOBALS['flag_preserver'] |= headers_sent(); |
|
| 156 | - |
|
| 157 | - // Definir les entetes si ce n'est fait |
|
| 158 | - if (!$GLOBALS['flag_preserver']) { |
|
| 159 | - if ($GLOBALS['flag_ob']) { |
|
| 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 | - |
|
| 178 | - // Entete Last-Modified: |
|
| 179 | - // eviter d'etre incoherent en envoyant un lastmodified identique |
|
| 180 | - // a celui qu'on a refuse d'honorer plus haut (cf. #655) |
|
| 181 | - if ( |
|
| 182 | - $lastmodified |
|
| 183 | - and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) |
|
| 184 | - and !isset($page['entetes']['Last-Modified']) |
|
| 185 | - ) { |
|
| 186 | - $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT'; |
|
| 187 | - } |
|
| 188 | - |
|
| 189 | - // fermer la connexion apres les headers si requete HEAD |
|
| 190 | - if ($headers_only) { |
|
| 191 | - $page['entetes']['Connection'] = 'close'; |
|
| 192 | - } |
|
| 193 | - |
|
| 194 | - return $page; |
|
| 34 | + // flag_preserver est modifie ici, et utilise en globale |
|
| 35 | + // use_cache sert a informer le bouton d'admin pr savoir s'il met un * |
|
| 36 | + // contexte est utilise en globale dans le formulaire d'admin |
|
| 37 | + |
|
| 38 | + $GLOBALS['contexte'] = calculer_contexte(); |
|
| 39 | + $page = ['contexte_implicite' => calculer_contexte_implicite()]; |
|
| 40 | + $page['contexte_implicite']['cache'] = $fond . preg_replace( |
|
| 41 | + ',\.[a-zA-Z0-9]*$,', |
|
| 42 | + '', |
|
| 43 | + preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI']) |
|
| 44 | + ); |
|
| 45 | + // Cette fonction est utilisee deux fois |
|
| 46 | + $cacher = charger_fonction('cacher', 'public', true); |
|
| 47 | + // Les quatre derniers parametres sont modifies par la fonction: |
|
| 48 | + // emplacement, validite, et, s'il est valide, contenu & age |
|
| 49 | + if ($cacher) { |
|
| 50 | + $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified); |
|
| 51 | + } else { |
|
| 52 | + $GLOBALS['use_cache'] = -1; |
|
| 53 | + } |
|
| 54 | + // Si un resultat est retourne, c'est un message d'impossibilite |
|
| 55 | + if ($res) { |
|
| 56 | + return ['texte' => $res]; |
|
| 57 | + } |
|
| 58 | + |
|
| 59 | + if (!$chemin_cache || !$lastmodified) { |
|
| 60 | + $lastmodified = time(); |
|
| 61 | + } |
|
| 62 | + |
|
| 63 | + $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD'); |
|
| 64 | + $calculer_page = true; |
|
| 65 | + |
|
| 66 | + // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client}) |
|
| 67 | + // une perennite valide a meme reponse qu'une requete HEAD (par defaut les |
|
| 68 | + // pages sont dynamiques) |
|
| 69 | + if ( |
|
| 70 | + isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) |
|
| 71 | + and (!defined('_VAR_MODE') or !_VAR_MODE) |
|
| 72 | + and $chemin_cache |
|
| 73 | + and isset($page['entetes']) |
|
| 74 | + and isset($page['entetes']['Cache-Control']) |
|
| 75 | + and strstr($page['entetes']['Cache-Control'], 'max-age=') |
|
| 76 | + and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/') |
|
| 77 | + ) { |
|
| 78 | + $since = preg_replace( |
|
| 79 | + '/;.*/', |
|
| 80 | + '', |
|
| 81 | + $_SERVER['HTTP_IF_MODIFIED_SINCE'] |
|
| 82 | + ); |
|
| 83 | + $since = str_replace('GMT', '', $since); |
|
| 84 | + if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) { |
|
| 85 | + $page['status'] = 304; |
|
| 86 | + $headers_only = true; |
|
| 87 | + $calculer_page = false; |
|
| 88 | + } |
|
| 89 | + } |
|
| 90 | + |
|
| 91 | + // Si requete HEAD ou Last-modified compatible, ignorer le texte |
|
| 92 | + // et pas de content-type (pour contrer le bouton admin de inc-public) |
|
| 93 | + if (!$calculer_page) { |
|
| 94 | + $page['texte'] = ''; |
|
| 95 | + } else { |
|
| 96 | + // si la page est prise dans le cache |
|
| 97 | + if (!$GLOBALS['use_cache']) { |
|
| 98 | + // Informer les boutons d'admin du contexte |
|
| 99 | + // (fourni par urls_decoder_url ci-dessous lors de la mise en cache) |
|
| 100 | + $GLOBALS['contexte'] = $page['contexte']; |
|
| 101 | + |
|
| 102 | + // vider les globales url propres qui ne doivent plus etre utilisees en cas |
|
| 103 | + // d'inversion url => objet |
|
| 104 | + // plus necessaire si on utilise bien la fonction urls_decoder_url |
|
| 105 | + #unset($_SERVER['REDIRECT_url_propre']); |
|
| 106 | + #unset($_ENV['url_propre']); |
|
| 107 | + } else { |
|
| 108 | + // Compat ascendante : |
|
| 109 | + // 1. $contexte est global |
|
| 110 | + // (a evacuer car urls_decoder_url gere ce probleme ?) |
|
| 111 | + // et calculer la page |
|
| 112 | + if (!test_espace_prive()) { |
|
| 113 | + include_spip('inc/urls'); |
|
| 114 | + list($fond, $GLOBALS['contexte'], $url_redirect) = urls_decoder_url( |
|
| 115 | + nettoyer_uri(), |
|
| 116 | + $fond, |
|
| 117 | + $GLOBALS['contexte'], |
|
| 118 | + true |
|
| 119 | + ); |
|
| 120 | + } |
|
| 121 | + // squelette par defaut |
|
| 122 | + if (!strlen($fond)) { |
|
| 123 | + $fond = 'sommaire'; |
|
| 124 | + } |
|
| 125 | + |
|
| 126 | + // produire la page : peut mettre a jour $lastmodified |
|
| 127 | + $produire_page = charger_fonction('produire_page', 'public'); |
|
| 128 | + $page = $produire_page( |
|
| 129 | + $fond, |
|
| 130 | + $GLOBALS['contexte'], |
|
| 131 | + $GLOBALS['use_cache'], |
|
| 132 | + $chemin_cache, |
|
| 133 | + null, |
|
| 134 | + $page, |
|
| 135 | + $lastmodified, |
|
| 136 | + $connect |
|
| 137 | + ); |
|
| 138 | + if ($page === '') { |
|
| 139 | + $erreur = _T( |
|
| 140 | + 'info_erreur_squelette2', |
|
| 141 | + ['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES] |
|
| 142 | + ); |
|
| 143 | + erreur_squelette($erreur); |
|
| 144 | + // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4 |
|
| 145 | + $page = ['texte' => '', 'erreur' => $erreur]; |
|
| 146 | + } |
|
| 147 | + } |
|
| 148 | + |
|
| 149 | + if ($page and $chemin_cache) { |
|
| 150 | + $page['cache'] = $chemin_cache; |
|
| 151 | + } |
|
| 152 | + |
|
| 153 | + auto_content_type($page); |
|
| 154 | + |
|
| 155 | + $GLOBALS['flag_preserver'] |= headers_sent(); |
|
| 156 | + |
|
| 157 | + // Definir les entetes si ce n'est fait |
|
| 158 | + if (!$GLOBALS['flag_preserver']) { |
|
| 159 | + if ($GLOBALS['flag_ob']) { |
|
| 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 | + |
|
| 178 | + // Entete Last-Modified: |
|
| 179 | + // eviter d'etre incoherent en envoyant un lastmodified identique |
|
| 180 | + // a celui qu'on a refuse d'honorer plus haut (cf. #655) |
|
| 181 | + if ( |
|
| 182 | + $lastmodified |
|
| 183 | + and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) |
|
| 184 | + and !isset($page['entetes']['Last-Modified']) |
|
| 185 | + ) { |
|
| 186 | + $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT'; |
|
| 187 | + } |
|
| 188 | + |
|
| 189 | + // fermer la connexion apres les headers si requete HEAD |
|
| 190 | + if ($headers_only) { |
|
| 191 | + $page['entetes']['Connection'] = 'close'; |
|
| 192 | + } |
|
| 193 | + |
|
| 194 | + return $page; |
|
| 195 | 195 | } |
| 196 | 196 | |
| 197 | 197 | /** |
@@ -210,19 +210,19 @@ discard block |
||
| 210 | 210 | */ |
| 211 | 211 | function calculer_contexte() { |
| 212 | 212 | |
| 213 | - $contexte = []; |
|
| 214 | - foreach ($_GET as $var => $val) { |
|
| 215 | - if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) { |
|
| 216 | - $contexte[$var] = $val; |
|
| 217 | - } |
|
| 218 | - } |
|
| 219 | - foreach ($_POST as $var => $val) { |
|
| 220 | - if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) { |
|
| 221 | - $contexte[$var] = $val; |
|
| 222 | - } |
|
| 223 | - } |
|
| 224 | - |
|
| 225 | - return $contexte; |
|
| 213 | + $contexte = []; |
|
| 214 | + foreach ($_GET as $var => $val) { |
|
| 215 | + if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) { |
|
| 216 | + $contexte[$var] = $val; |
|
| 217 | + } |
|
| 218 | + } |
|
| 219 | + foreach ($_POST as $var => $val) { |
|
| 220 | + if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) { |
|
| 221 | + $contexte[$var] = $val; |
|
| 222 | + } |
|
| 223 | + } |
|
| 224 | + |
|
| 225 | + return $contexte; |
|
| 226 | 226 | } |
| 227 | 227 | |
| 228 | 228 | /** |
@@ -233,25 +233,25 @@ discard block |
||
| 233 | 233 | * @return array |
| 234 | 234 | */ |
| 235 | 235 | function calculer_contexte_implicite() { |
| 236 | - static $notes = null; |
|
| 237 | - if (is_null($notes)) { |
|
| 238 | - $notes = charger_fonction('notes', 'inc', true); |
|
| 239 | - } |
|
| 240 | - $contexte_implicite = [ |
|
| 241 | - 'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ? |
|
| 242 | - 'host' => (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : null), |
|
| 243 | - 'https' => (isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : ''), |
|
| 244 | - 'espace' => test_espace_prive(), |
|
| 245 | - 'marqueur' => (isset($GLOBALS['marqueur']) ? $GLOBALS['marqueur'] : ''), |
|
| 246 | - 'marqueur_skel' => (isset($GLOBALS['marqueur_skel']) ? $GLOBALS['marqueur_skel'] : ''), |
|
| 247 | - 'notes' => $notes ? $notes('', 'contexter_cache') : '', |
|
| 248 | - 'spip_version_code' => $GLOBALS['spip_version_code'], |
|
| 249 | - ]; |
|
| 250 | - if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { |
|
| 251 | - $contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST']; |
|
| 252 | - } |
|
| 253 | - |
|
| 254 | - return $contexte_implicite; |
|
| 236 | + static $notes = null; |
|
| 237 | + if (is_null($notes)) { |
|
| 238 | + $notes = charger_fonction('notes', 'inc', true); |
|
| 239 | + } |
|
| 240 | + $contexte_implicite = [ |
|
| 241 | + 'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ? |
|
| 242 | + 'host' => (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : null), |
|
| 243 | + 'https' => (isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : ''), |
|
| 244 | + 'espace' => test_espace_prive(), |
|
| 245 | + 'marqueur' => (isset($GLOBALS['marqueur']) ? $GLOBALS['marqueur'] : ''), |
|
| 246 | + 'marqueur_skel' => (isset($GLOBALS['marqueur_skel']) ? $GLOBALS['marqueur_skel'] : ''), |
|
| 247 | + 'notes' => $notes ? $notes('', 'contexter_cache') : '', |
|
| 248 | + 'spip_version_code' => $GLOBALS['spip_version_code'], |
|
| 249 | + ]; |
|
| 250 | + if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { |
|
| 251 | + $contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST']; |
|
| 252 | + } |
|
| 253 | + |
|
| 254 | + return $contexte_implicite; |
|
| 255 | 255 | } |
| 256 | 256 | |
| 257 | 257 | // |
@@ -261,52 +261,52 @@ discard block |
||
| 261 | 261 | // https://code.spip.net/@auto_content_type |
| 262 | 262 | function auto_content_type($page) { |
| 263 | 263 | |
| 264 | - if (!isset($GLOBALS['flag_preserver'])) { |
|
| 265 | - $GLOBALS['flag_preserver'] = ($page && preg_match( |
|
| 266 | - '/header\s*\(\s*.content\-type:/isx', |
|
| 267 | - $page['texte'] |
|
| 268 | - ) || (isset($page['entetes']['Content-Type']))); |
|
| 269 | - } |
|
| 264 | + if (!isset($GLOBALS['flag_preserver'])) { |
|
| 265 | + $GLOBALS['flag_preserver'] = ($page && preg_match( |
|
| 266 | + '/header\s*\(\s*.content\-type:/isx', |
|
| 267 | + $page['texte'] |
|
| 268 | + ) || (isset($page['entetes']['Content-Type']))); |
|
| 269 | + } |
|
| 270 | 270 | } |
| 271 | 271 | |
| 272 | 272 | // https://code.spip.net/@inclure_page |
| 273 | 273 | function inclure_page($fond, $contexte, $connect = '') { |
| 274 | - static $cacher, $produire_page; |
|
| 275 | - |
|
| 276 | - // enlever le fond de contexte inclus car sinon il prend la main |
|
| 277 | - // dans les sous inclusions -> boucle infinie d'inclusion identique |
|
| 278 | - // (cette precaution n'est probablement plus utile) |
|
| 279 | - unset($contexte['fond']); |
|
| 280 | - $page = ['contexte_implicite' => calculer_contexte_implicite()]; |
|
| 281 | - $page['contexte_implicite']['cache'] = $fond; |
|
| 282 | - if (is_null($cacher)) { |
|
| 283 | - $cacher = charger_fonction('cacher', 'public', true); |
|
| 284 | - } |
|
| 285 | - // Les quatre derniers parametres sont modifies par la fonction: |
|
| 286 | - // emplacement, validite, et, s'il est valide, contenu & age |
|
| 287 | - if ($cacher) { |
|
| 288 | - $res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude); |
|
| 289 | - } else { |
|
| 290 | - $use_cache = -1; |
|
| 291 | - } |
|
| 292 | - // $res = message d'erreur : on sort de la |
|
| 293 | - if ($res) { |
|
| 294 | - return ['texte' => $res]; |
|
| 295 | - } |
|
| 296 | - |
|
| 297 | - // Si use_cache ne vaut pas 0, la page doit etre calculee |
|
| 298 | - // produire la page : peut mettre a jour $lastinclude |
|
| 299 | - // le contexte_cache envoye a cacher() a ete conserve et est passe a produire |
|
| 300 | - if ($use_cache) { |
|
| 301 | - if (is_null($produire_page)) { |
|
| 302 | - $produire_page = charger_fonction('produire_page', 'public'); |
|
| 303 | - } |
|
| 304 | - $page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect); |
|
| 305 | - } |
|
| 306 | - // dans tous les cas, mettre a jour $GLOBALS['lastmodified'] |
|
| 307 | - $GLOBALS['lastmodified'] = max((isset($GLOBALS['lastmodified']) ? $GLOBALS['lastmodified'] : 0), $lastinclude); |
|
| 308 | - |
|
| 309 | - return $page; |
|
| 274 | + static $cacher, $produire_page; |
|
| 275 | + |
|
| 276 | + // enlever le fond de contexte inclus car sinon il prend la main |
|
| 277 | + // dans les sous inclusions -> boucle infinie d'inclusion identique |
|
| 278 | + // (cette precaution n'est probablement plus utile) |
|
| 279 | + unset($contexte['fond']); |
|
| 280 | + $page = ['contexte_implicite' => calculer_contexte_implicite()]; |
|
| 281 | + $page['contexte_implicite']['cache'] = $fond; |
|
| 282 | + if (is_null($cacher)) { |
|
| 283 | + $cacher = charger_fonction('cacher', 'public', true); |
|
| 284 | + } |
|
| 285 | + // Les quatre derniers parametres sont modifies par la fonction: |
|
| 286 | + // emplacement, validite, et, s'il est valide, contenu & age |
|
| 287 | + if ($cacher) { |
|
| 288 | + $res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude); |
|
| 289 | + } else { |
|
| 290 | + $use_cache = -1; |
|
| 291 | + } |
|
| 292 | + // $res = message d'erreur : on sort de la |
|
| 293 | + if ($res) { |
|
| 294 | + return ['texte' => $res]; |
|
| 295 | + } |
|
| 296 | + |
|
| 297 | + // Si use_cache ne vaut pas 0, la page doit etre calculee |
|
| 298 | + // produire la page : peut mettre a jour $lastinclude |
|
| 299 | + // le contexte_cache envoye a cacher() a ete conserve et est passe a produire |
|
| 300 | + if ($use_cache) { |
|
| 301 | + if (is_null($produire_page)) { |
|
| 302 | + $produire_page = charger_fonction('produire_page', 'public'); |
|
| 303 | + } |
|
| 304 | + $page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect); |
|
| 305 | + } |
|
| 306 | + // dans tous les cas, mettre a jour $GLOBALS['lastmodified'] |
|
| 307 | + $GLOBALS['lastmodified'] = max((isset($GLOBALS['lastmodified']) ? $GLOBALS['lastmodified'] : 0), $lastinclude); |
|
| 308 | + |
|
| 309 | + return $page; |
|
| 310 | 310 | } |
| 311 | 311 | |
| 312 | 312 | /** |
@@ -324,41 +324,41 @@ discard block |
||
| 324 | 324 | * @return array |
| 325 | 325 | */ |
| 326 | 326 | function public_produire_page_dist( |
| 327 | - $fond, |
|
| 328 | - $contexte, |
|
| 329 | - $use_cache, |
|
| 330 | - $chemin_cache, |
|
| 331 | - $contexte_cache, |
|
| 332 | - &$page, |
|
| 333 | - &$lastinclude, |
|
| 334 | - $connect = '' |
|
| 327 | + $fond, |
|
| 328 | + $contexte, |
|
| 329 | + $use_cache, |
|
| 330 | + $chemin_cache, |
|
| 331 | + $contexte_cache, |
|
| 332 | + &$page, |
|
| 333 | + &$lastinclude, |
|
| 334 | + $connect = '' |
|
| 335 | 335 | ) { |
| 336 | - static $parametrer, $cacher; |
|
| 337 | - if (!$parametrer) { |
|
| 338 | - $parametrer = charger_fonction('parametrer', 'public'); |
|
| 339 | - } |
|
| 340 | - $page = $parametrer($fond, $contexte, $chemin_cache, $connect); |
|
| 341 | - // et on l'enregistre sur le disque |
|
| 342 | - if ( |
|
| 343 | - $chemin_cache |
|
| 344 | - and $use_cache > -1 |
|
| 345 | - and is_array($page) |
|
| 346 | - and count($page) |
|
| 347 | - and isset($page['entetes']['X-Spip-Cache']) |
|
| 348 | - and $page['entetes']['X-Spip-Cache'] > 0 |
|
| 349 | - ) { |
|
| 350 | - if (is_null($cacher)) { |
|
| 351 | - $cacher = charger_fonction('cacher', 'public', true); |
|
| 352 | - } |
|
| 353 | - $lastinclude = time(); |
|
| 354 | - if ($cacher) { |
|
| 355 | - $cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude); |
|
| 356 | - } else { |
|
| 357 | - $use_cache = -1; |
|
| 358 | - } |
|
| 359 | - } |
|
| 360 | - |
|
| 361 | - return $page; |
|
| 336 | + static $parametrer, $cacher; |
|
| 337 | + if (!$parametrer) { |
|
| 338 | + $parametrer = charger_fonction('parametrer', 'public'); |
|
| 339 | + } |
|
| 340 | + $page = $parametrer($fond, $contexte, $chemin_cache, $connect); |
|
| 341 | + // et on l'enregistre sur le disque |
|
| 342 | + if ( |
|
| 343 | + $chemin_cache |
|
| 344 | + and $use_cache > -1 |
|
| 345 | + and is_array($page) |
|
| 346 | + and count($page) |
|
| 347 | + and isset($page['entetes']['X-Spip-Cache']) |
|
| 348 | + and $page['entetes']['X-Spip-Cache'] > 0 |
|
| 349 | + ) { |
|
| 350 | + if (is_null($cacher)) { |
|
| 351 | + $cacher = charger_fonction('cacher', 'public', true); |
|
| 352 | + } |
|
| 353 | + $lastinclude = time(); |
|
| 354 | + if ($cacher) { |
|
| 355 | + $cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude); |
|
| 356 | + } else { |
|
| 357 | + $use_cache = -1; |
|
| 358 | + } |
|
| 359 | + } |
|
| 360 | + |
|
| 361 | + return $page; |
|
| 362 | 362 | } |
| 363 | 363 | |
| 364 | 364 | // Fonction inseree par le compilateur dans le code compile. |
@@ -372,14 +372,14 @@ discard block |
||
| 372 | 372 | // 4: langue |
| 373 | 373 | |
| 374 | 374 | function inserer_balise_dynamique($contexte_exec, $contexte_compil) { |
| 375 | - arguments_balise_dyn_depuis_modele(null, 'reset'); |
|
| 376 | - |
|
| 377 | - if (!is_array($contexte_exec)) { |
|
| 378 | - echo $contexte_exec; |
|
| 379 | - } // message d'erreur etc |
|
| 380 | - else { |
|
| 381 | - inclure_balise_dynamique($contexte_exec, true, $contexte_compil); |
|
| 382 | - } |
|
| 375 | + arguments_balise_dyn_depuis_modele(null, 'reset'); |
|
| 376 | + |
|
| 377 | + if (!is_array($contexte_exec)) { |
|
| 378 | + echo $contexte_exec; |
|
| 379 | + } // message d'erreur etc |
|
| 380 | + else { |
|
| 381 | + inclure_balise_dynamique($contexte_exec, true, $contexte_compil); |
|
| 382 | + } |
|
| 383 | 383 | } |
| 384 | 384 | |
| 385 | 385 | /** |
@@ -394,100 +394,100 @@ discard block |
||
| 394 | 394 | * @return string |
| 395 | 395 | */ |
| 396 | 396 | function inclure_balise_dynamique($texte, $echo = true, $contexte_compil = []) { |
| 397 | - if (is_array($texte)) { |
|
| 398 | - list($fond, $delainc, $contexte_inclus) = $texte; |
|
| 399 | - |
|
| 400 | - // delais a l'ancienne, c'est pratiquement mort |
|
| 401 | - $d = isset($GLOBALS['delais']) ? $GLOBALS['delais'] : null; |
|
| 402 | - $GLOBALS['delais'] = $delainc; |
|
| 403 | - |
|
| 404 | - $page = recuperer_fond( |
|
| 405 | - $fond, |
|
| 406 | - $contexte_inclus, |
|
| 407 | - ['trim' => false, 'raw' => true, 'compil' => $contexte_compil] |
|
| 408 | - ); |
|
| 409 | - |
|
| 410 | - $texte = $page['texte']; |
|
| 411 | - |
|
| 412 | - $GLOBALS['delais'] = $d; |
|
| 413 | - // Faire remonter les entetes |
|
| 414 | - if (is_array($page['entetes'])) { |
|
| 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 | - false |
|
| 442 | - ); |
|
| 443 | - } |
|
| 444 | - } |
|
| 445 | - } |
|
| 446 | - |
|
| 447 | - if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
|
| 448 | - // compatibilite : avant on donnait le numero de ligne ou rien. |
|
| 449 | - $ligne = intval(isset($contexte_compil[3]) ? $contexte_compil[3] : $contexte_compil); |
|
| 450 | - $GLOBALS['debug_objets']['resultat'][$ligne] = $texte; |
|
| 451 | - } |
|
| 452 | - if ($echo) { |
|
| 453 | - echo $texte; |
|
| 454 | - } else { |
|
| 455 | - return $texte; |
|
| 456 | - } |
|
| 397 | + if (is_array($texte)) { |
|
| 398 | + list($fond, $delainc, $contexte_inclus) = $texte; |
|
| 399 | + |
|
| 400 | + // delais a l'ancienne, c'est pratiquement mort |
|
| 401 | + $d = isset($GLOBALS['delais']) ? $GLOBALS['delais'] : null; |
|
| 402 | + $GLOBALS['delais'] = $delainc; |
|
| 403 | + |
|
| 404 | + $page = recuperer_fond( |
|
| 405 | + $fond, |
|
| 406 | + $contexte_inclus, |
|
| 407 | + ['trim' => false, 'raw' => true, 'compil' => $contexte_compil] |
|
| 408 | + ); |
|
| 409 | + |
|
| 410 | + $texte = $page['texte']; |
|
| 411 | + |
|
| 412 | + $GLOBALS['delais'] = $d; |
|
| 413 | + // Faire remonter les entetes |
|
| 414 | + if (is_array($page['entetes'])) { |
|
| 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 | + false |
|
| 442 | + ); |
|
| 443 | + } |
|
| 444 | + } |
|
| 445 | + } |
|
| 446 | + |
|
| 447 | + if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
|
| 448 | + // compatibilite : avant on donnait le numero de ligne ou rien. |
|
| 449 | + $ligne = intval(isset($contexte_compil[3]) ? $contexte_compil[3] : $contexte_compil); |
|
| 450 | + $GLOBALS['debug_objets']['resultat'][$ligne] = $texte; |
|
| 451 | + } |
|
| 452 | + if ($echo) { |
|
| 453 | + echo $texte; |
|
| 454 | + } else { |
|
| 455 | + return $texte; |
|
| 456 | + } |
|
| 457 | 457 | } |
| 458 | 458 | |
| 459 | 459 | // https://code.spip.net/@message_page_indisponible |
| 460 | 460 | function message_page_indisponible($page, $contexte) { |
| 461 | - static $deja = false; |
|
| 462 | - if ($deja) { |
|
| 463 | - return 'erreur'; |
|
| 464 | - } |
|
| 465 | - $codes = [ |
|
| 466 | - '404' => '404 Not Found', |
|
| 467 | - '503' => '503 Service Unavailable', |
|
| 468 | - ]; |
|
| 469 | - |
|
| 470 | - $contexte['status'] = ($page !== false) ? '404' : '503'; |
|
| 471 | - $contexte['code'] = $codes[$contexte['status']]; |
|
| 472 | - $contexte['fond'] = '404'; // gere les 2 erreurs |
|
| 473 | - if (!isset($contexte['lang'])) { |
|
| 474 | - include_spip('inc/lang'); |
|
| 475 | - $contexte['lang'] = $GLOBALS['spip_lang']; |
|
| 476 | - } |
|
| 477 | - |
|
| 478 | - $deja = true; |
|
| 479 | - // passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent |
|
| 480 | - // ex restriction d'acces => 401 |
|
| 481 | - $contexte = pipeline('page_indisponible', $contexte); |
|
| 482 | - |
|
| 483 | - // produire la page d'erreur |
|
| 484 | - $page = inclure_page($contexte['fond'], $contexte); |
|
| 485 | - if (!$page) { |
|
| 486 | - $page = inclure_page('404', $contexte); |
|
| 487 | - } |
|
| 488 | - $page['status'] = $contexte['status']; |
|
| 489 | - |
|
| 490 | - return $page; |
|
| 461 | + static $deja = false; |
|
| 462 | + if ($deja) { |
|
| 463 | + return 'erreur'; |
|
| 464 | + } |
|
| 465 | + $codes = [ |
|
| 466 | + '404' => '404 Not Found', |
|
| 467 | + '503' => '503 Service Unavailable', |
|
| 468 | + ]; |
|
| 469 | + |
|
| 470 | + $contexte['status'] = ($page !== false) ? '404' : '503'; |
|
| 471 | + $contexte['code'] = $codes[$contexte['status']]; |
|
| 472 | + $contexte['fond'] = '404'; // gere les 2 erreurs |
|
| 473 | + if (!isset($contexte['lang'])) { |
|
| 474 | + include_spip('inc/lang'); |
|
| 475 | + $contexte['lang'] = $GLOBALS['spip_lang']; |
|
| 476 | + } |
|
| 477 | + |
|
| 478 | + $deja = true; |
|
| 479 | + // passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent |
|
| 480 | + // ex restriction d'acces => 401 |
|
| 481 | + $contexte = pipeline('page_indisponible', $contexte); |
|
| 482 | + |
|
| 483 | + // produire la page d'erreur |
|
| 484 | + $page = inclure_page($contexte['fond'], $contexte); |
|
| 485 | + if (!$page) { |
|
| 486 | + $page = inclure_page('404', $contexte); |
|
| 487 | + } |
|
| 488 | + $page['status'] = $contexte['status']; |
|
| 489 | + |
|
| 490 | + return $page; |
|
| 491 | 491 | } |
| 492 | 492 | |
| 493 | 493 | /** |
@@ -499,45 +499,45 @@ discard block |
||
| 499 | 499 | * @return mixed |
| 500 | 500 | */ |
| 501 | 501 | function arguments_balise_dyn_depuis_modele($arg, $operation = 'set') { |
| 502 | - static $balise_dyn_appellee_par_modele = null; |
|
| 503 | - switch ($operation) { |
|
| 504 | - case 'read': |
|
| 505 | - return $balise_dyn_appellee_par_modele; |
|
| 506 | - case 'reset': |
|
| 507 | - $balise_dyn_appellee_par_modele = null; |
|
| 508 | - return null; |
|
| 509 | - case 'set': |
|
| 510 | - default: |
|
| 511 | - $balise_dyn_appellee_par_modele = $arg; |
|
| 512 | - return $arg; |
|
| 513 | - } |
|
| 502 | + static $balise_dyn_appellee_par_modele = null; |
|
| 503 | + switch ($operation) { |
|
| 504 | + case 'read': |
|
| 505 | + return $balise_dyn_appellee_par_modele; |
|
| 506 | + case 'reset': |
|
| 507 | + $balise_dyn_appellee_par_modele = null; |
|
| 508 | + return null; |
|
| 509 | + case 'set': |
|
| 510 | + default: |
|
| 511 | + $balise_dyn_appellee_par_modele = $arg; |
|
| 512 | + return $arg; |
|
| 513 | + } |
|
| 514 | 514 | } |
| 515 | 515 | |
| 516 | 516 | // temporairement ici : a mettre dans le futur inc/modeles |
| 517 | 517 | // creer_contexte_de_modele('left', 'autostart=true', ...) renvoie un array() |
| 518 | 518 | // https://code.spip.net/@creer_contexte_de_modele |
| 519 | 519 | function creer_contexte_de_modele($args) { |
| 520 | - $contexte = []; |
|
| 521 | - foreach ($args as $var => $val) { |
|
| 522 | - if (is_int($var)) { // argument pas formate |
|
| 523 | - if (in_array($val, ['left', 'right', 'center'])) { |
|
| 524 | - $var = 'align'; |
|
| 525 | - $contexte[$var] = $val; |
|
| 526 | - } else { |
|
| 527 | - $args = explode('=', $val); |
|
| 528 | - if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args |
|
| 529 | - $contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1); |
|
| 530 | - } else // notation abregee |
|
| 531 | - { |
|
| 532 | - $contexte[trim($val)] = trim($val); |
|
| 533 | - } |
|
| 534 | - } |
|
| 535 | - } else { |
|
| 536 | - $contexte[$var] = $val; |
|
| 537 | - } |
|
| 538 | - } |
|
| 539 | - |
|
| 540 | - return $contexte; |
|
| 520 | + $contexte = []; |
|
| 521 | + foreach ($args as $var => $val) { |
|
| 522 | + if (is_int($var)) { // argument pas formate |
|
| 523 | + if (in_array($val, ['left', 'right', 'center'])) { |
|
| 524 | + $var = 'align'; |
|
| 525 | + $contexte[$var] = $val; |
|
| 526 | + } else { |
|
| 527 | + $args = explode('=', $val); |
|
| 528 | + if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args |
|
| 529 | + $contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1); |
|
| 530 | + } else // notation abregee |
|
| 531 | + { |
|
| 532 | + $contexte[trim($val)] = trim($val); |
|
| 533 | + } |
|
| 534 | + } |
|
| 535 | + } else { |
|
| 536 | + $contexte[$var] = $val; |
|
| 537 | + } |
|
| 538 | + } |
|
| 539 | + |
|
| 540 | + return $contexte; |
|
| 541 | 541 | } |
| 542 | 542 | |
| 543 | 543 | /** |
@@ -552,43 +552,43 @@ discard block |
||
| 552 | 552 | * @return string |
| 553 | 553 | */ |
| 554 | 554 | function styliser_modele($modele, $id, $contexte = null) { |
| 555 | - static $styliseurs = null; |
|
| 556 | - if (is_null($styliseurs)) { |
|
| 557 | - $tables_objet = lister_tables_objets_sql(); |
|
| 558 | - foreach ($tables_objet as $table => $desc) { |
|
| 559 | - if ( |
|
| 560 | - isset($desc['modeles']) and $desc['modeles'] |
|
| 561 | - and isset($desc['modeles_styliser']) and $desc['modeles_styliser'] |
|
| 562 | - and function_exists($desc['modeles_styliser']) |
|
| 563 | - ) { |
|
| 564 | - $primary = id_table_objet($table); |
|
| 565 | - foreach ($desc['modeles'] as $m) { |
|
| 566 | - $styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']]; |
|
| 567 | - } |
|
| 568 | - } |
|
| 569 | - } |
|
| 570 | - } |
|
| 571 | - |
|
| 572 | - if (isset($styliseurs[$modele])) { |
|
| 573 | - $styliseur = $styliseurs[$modele]['callback']; |
|
| 574 | - $primary = $styliseurs[$modele]['primary']; |
|
| 575 | - if (is_null($id) and $contexte) { |
|
| 576 | - if (isset($contexte['id'])) { |
|
| 577 | - $id = $contexte['id']; |
|
| 578 | - } elseif (isset($contexte[$primary])) { |
|
| 579 | - $id = $contexte[$primary]; |
|
| 580 | - } |
|
| 581 | - } |
|
| 582 | - if (is_null($id)) { |
|
| 583 | - $msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]); |
|
| 584 | - erreur_squelette($msg); |
|
| 585 | - // on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant |
|
| 586 | - $id = 0; |
|
| 587 | - } |
|
| 588 | - $modele = $styliseur($modele, $id); |
|
| 589 | - } |
|
| 590 | - |
|
| 591 | - return $modele; |
|
| 555 | + static $styliseurs = null; |
|
| 556 | + if (is_null($styliseurs)) { |
|
| 557 | + $tables_objet = lister_tables_objets_sql(); |
|
| 558 | + foreach ($tables_objet as $table => $desc) { |
|
| 559 | + if ( |
|
| 560 | + isset($desc['modeles']) and $desc['modeles'] |
|
| 561 | + and isset($desc['modeles_styliser']) and $desc['modeles_styliser'] |
|
| 562 | + and function_exists($desc['modeles_styliser']) |
|
| 563 | + ) { |
|
| 564 | + $primary = id_table_objet($table); |
|
| 565 | + foreach ($desc['modeles'] as $m) { |
|
| 566 | + $styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']]; |
|
| 567 | + } |
|
| 568 | + } |
|
| 569 | + } |
|
| 570 | + } |
|
| 571 | + |
|
| 572 | + if (isset($styliseurs[$modele])) { |
|
| 573 | + $styliseur = $styliseurs[$modele]['callback']; |
|
| 574 | + $primary = $styliseurs[$modele]['primary']; |
|
| 575 | + if (is_null($id) and $contexte) { |
|
| 576 | + if (isset($contexte['id'])) { |
|
| 577 | + $id = $contexte['id']; |
|
| 578 | + } elseif (isset($contexte[$primary])) { |
|
| 579 | + $id = $contexte[$primary]; |
|
| 580 | + } |
|
| 581 | + } |
|
| 582 | + if (is_null($id)) { |
|
| 583 | + $msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]); |
|
| 584 | + erreur_squelette($msg); |
|
| 585 | + // on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant |
|
| 586 | + $id = 0; |
|
| 587 | + } |
|
| 588 | + $modele = $styliseur($modele, $id); |
|
| 589 | + } |
|
| 590 | + |
|
| 591 | + return $modele; |
|
| 592 | 592 | } |
| 593 | 593 | |
| 594 | 594 | /** |
@@ -607,102 +607,102 @@ discard block |
||
| 607 | 607 | */ |
| 608 | 608 | function inclure_modele($type, $id, $params, $lien, $connect = '', $env = []) { |
| 609 | 609 | |
| 610 | - static $compteur; |
|
| 611 | - if (++$compteur > 10) { |
|
| 612 | - return ''; |
|
| 613 | - } # ne pas boucler indefiniment |
|
| 614 | - |
|
| 615 | - $type = strtolower($type); |
|
| 616 | - $type = styliser_modele($type, $id); |
|
| 617 | - |
|
| 618 | - $fond = $class = ''; |
|
| 619 | - |
|
| 620 | - $params = array_filter(explode('|', $params)); |
|
| 621 | - if ($params) { |
|
| 622 | - $soustype = current($params); |
|
| 623 | - $soustype = strtolower(trim($soustype)); |
|
| 624 | - if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) { |
|
| 625 | - $soustype = next($params); |
|
| 626 | - $soustype = strtolower($soustype); |
|
| 627 | - } |
|
| 628 | - |
|
| 629 | - if (preg_match(',^[a-z0-9_]+$,', $soustype)) { |
|
| 630 | - if (!trouve_modele($fond = ($type . '_' . $soustype))) { |
|
| 631 | - $fond = ''; |
|
| 632 | - $class = $soustype; |
|
| 633 | - } |
|
| 634 | - // enlever le sous type des params |
|
| 635 | - $params = array_diff($params, [$soustype]); |
|
| 636 | - } |
|
| 637 | - } |
|
| 638 | - |
|
| 639 | - // Si ca marche pas en precisant le sous-type, prendre le type |
|
| 640 | - if (!$fond and !trouve_modele($fond = $type)) { |
|
| 641 | - spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE); |
|
| 642 | - |
|
| 643 | - return false; |
|
| 644 | - } |
|
| 645 | - $fond = 'modeles/' . $fond; |
|
| 646 | - // Creer le contexte |
|
| 647 | - $contexte = $env; |
|
| 648 | - $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 |
|
| 649 | - |
|
| 650 | - // Le numero du modele est mis dans l'environnement |
|
| 651 | - // d'une part sous l'identifiant "id" |
|
| 652 | - // et d'autre part sous l'identifiant de la cle primaire |
|
| 653 | - // par la fonction id_table_objet, |
|
| 654 | - // (<article1> =>> article =>> id_article =>> id_article=1) |
|
| 655 | - $_id = id_table_objet($type); |
|
| 656 | - $contexte['id'] = $contexte[$_id] = $id; |
|
| 657 | - |
|
| 658 | - if (isset($class)) { |
|
| 659 | - $contexte['class'] = $class; |
|
| 660 | - } |
|
| 661 | - |
|
| 662 | - // Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url] |
|
| 663 | - if ($lien) { |
|
| 664 | - # un eventuel guillemet (") sera reechappe par #ENV |
|
| 665 | - $contexte['lien'] = str_replace('"', '"', $lien['href']); |
|
| 666 | - $contexte['lien_class'] = $lien['class']; |
|
| 667 | - $contexte['lien_mime'] = $lien['mime']; |
|
| 668 | - $contexte['lien_title'] = $lien['title']; |
|
| 669 | - $contexte['lien_hreflang'] = $lien['hreflang']; |
|
| 670 | - } |
|
| 671 | - |
|
| 672 | - // Traiter les parametres |
|
| 673 | - // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en> |
|
| 674 | - $arg_list = creer_contexte_de_modele($params); |
|
| 675 | - $contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args |
|
| 676 | - $contexte = array_merge($contexte, $arg_list); |
|
| 677 | - |
|
| 678 | - // Appliquer le modele avec le contexte |
|
| 679 | - $retour = recuperer_fond($fond, $contexte, [], $connect); |
|
| 680 | - |
|
| 681 | - // Regarder si le modele tient compte des liens (il *doit* alors indiquer |
|
| 682 | - // spip_lien_ok dans les classes de son conteneur de premier niveau ; |
|
| 683 | - // sinon, s'il y a un lien, on l'ajoute classiquement |
|
| 684 | - if ( |
|
| 685 | - strstr( |
|
| 686 | - ' ' . ($classes = extraire_attribut($retour, 'class')) . ' ', |
|
| 687 | - 'spip_lien_ok' |
|
| 688 | - ) |
|
| 689 | - ) { |
|
| 690 | - $retour = inserer_attribut( |
|
| 691 | - $retour, |
|
| 692 | - 'class', |
|
| 693 | - trim(str_replace(' spip_lien_ok ', ' ', " $classes ")) |
|
| 694 | - ); |
|
| 695 | - } else { |
|
| 696 | - if ($lien) { |
|
| 697 | - $retour = "<a href='" . $lien['href'] . "' class='" . $lien['class'] . "'>" . $retour . '</a>'; |
|
| 698 | - } |
|
| 699 | - } |
|
| 700 | - |
|
| 701 | - $compteur--; |
|
| 702 | - |
|
| 703 | - return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax') |
|
| 704 | - ? encoder_contexte_ajax($contexte, '', $retour) |
|
| 705 | - : $retour; |
|
| 610 | + static $compteur; |
|
| 611 | + if (++$compteur > 10) { |
|
| 612 | + return ''; |
|
| 613 | + } # ne pas boucler indefiniment |
|
| 614 | + |
|
| 615 | + $type = strtolower($type); |
|
| 616 | + $type = styliser_modele($type, $id); |
|
| 617 | + |
|
| 618 | + $fond = $class = ''; |
|
| 619 | + |
|
| 620 | + $params = array_filter(explode('|', $params)); |
|
| 621 | + if ($params) { |
|
| 622 | + $soustype = current($params); |
|
| 623 | + $soustype = strtolower(trim($soustype)); |
|
| 624 | + if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) { |
|
| 625 | + $soustype = next($params); |
|
| 626 | + $soustype = strtolower($soustype); |
|
| 627 | + } |
|
| 628 | + |
|
| 629 | + if (preg_match(',^[a-z0-9_]+$,', $soustype)) { |
|
| 630 | + if (!trouve_modele($fond = ($type . '_' . $soustype))) { |
|
| 631 | + $fond = ''; |
|
| 632 | + $class = $soustype; |
|
| 633 | + } |
|
| 634 | + // enlever le sous type des params |
|
| 635 | + $params = array_diff($params, [$soustype]); |
|
| 636 | + } |
|
| 637 | + } |
|
| 638 | + |
|
| 639 | + // Si ca marche pas en precisant le sous-type, prendre le type |
|
| 640 | + if (!$fond and !trouve_modele($fond = $type)) { |
|
| 641 | + spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE); |
|
| 642 | + |
|
| 643 | + return false; |
|
| 644 | + } |
|
| 645 | + $fond = 'modeles/' . $fond; |
|
| 646 | + // Creer le contexte |
|
| 647 | + $contexte = $env; |
|
| 648 | + $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 |
|
| 649 | + |
|
| 650 | + // Le numero du modele est mis dans l'environnement |
|
| 651 | + // d'une part sous l'identifiant "id" |
|
| 652 | + // et d'autre part sous l'identifiant de la cle primaire |
|
| 653 | + // par la fonction id_table_objet, |
|
| 654 | + // (<article1> =>> article =>> id_article =>> id_article=1) |
|
| 655 | + $_id = id_table_objet($type); |
|
| 656 | + $contexte['id'] = $contexte[$_id] = $id; |
|
| 657 | + |
|
| 658 | + if (isset($class)) { |
|
| 659 | + $contexte['class'] = $class; |
|
| 660 | + } |
|
| 661 | + |
|
| 662 | + // Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url] |
|
| 663 | + if ($lien) { |
|
| 664 | + # un eventuel guillemet (") sera reechappe par #ENV |
|
| 665 | + $contexte['lien'] = str_replace('"', '"', $lien['href']); |
|
| 666 | + $contexte['lien_class'] = $lien['class']; |
|
| 667 | + $contexte['lien_mime'] = $lien['mime']; |
|
| 668 | + $contexte['lien_title'] = $lien['title']; |
|
| 669 | + $contexte['lien_hreflang'] = $lien['hreflang']; |
|
| 670 | + } |
|
| 671 | + |
|
| 672 | + // Traiter les parametres |
|
| 673 | + // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en> |
|
| 674 | + $arg_list = creer_contexte_de_modele($params); |
|
| 675 | + $contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args |
|
| 676 | + $contexte = array_merge($contexte, $arg_list); |
|
| 677 | + |
|
| 678 | + // Appliquer le modele avec le contexte |
|
| 679 | + $retour = recuperer_fond($fond, $contexte, [], $connect); |
|
| 680 | + |
|
| 681 | + // Regarder si le modele tient compte des liens (il *doit* alors indiquer |
|
| 682 | + // spip_lien_ok dans les classes de son conteneur de premier niveau ; |
|
| 683 | + // sinon, s'il y a un lien, on l'ajoute classiquement |
|
| 684 | + if ( |
|
| 685 | + strstr( |
|
| 686 | + ' ' . ($classes = extraire_attribut($retour, 'class')) . ' ', |
|
| 687 | + 'spip_lien_ok' |
|
| 688 | + ) |
|
| 689 | + ) { |
|
| 690 | + $retour = inserer_attribut( |
|
| 691 | + $retour, |
|
| 692 | + 'class', |
|
| 693 | + trim(str_replace(' spip_lien_ok ', ' ', " $classes ")) |
|
| 694 | + ); |
|
| 695 | + } else { |
|
| 696 | + if ($lien) { |
|
| 697 | + $retour = "<a href='" . $lien['href'] . "' class='" . $lien['class'] . "'>" . $retour . '</a>'; |
|
| 698 | + } |
|
| 699 | + } |
|
| 700 | + |
|
| 701 | + $compteur--; |
|
| 702 | + |
|
| 703 | + return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax') |
|
| 704 | + ? encoder_contexte_ajax($contexte, '', $retour) |
|
| 705 | + : $retour; |
|
| 706 | 706 | } |
| 707 | 707 | |
| 708 | 708 | // Un inclure_page qui marche aussi pour l'espace prive |
@@ -712,99 +712,99 @@ discard block |
||
| 712 | 712 | // https://code.spip.net/@evaluer_fond |
| 713 | 713 | function evaluer_fond($fond, $contexte = [], $connect = null) { |
| 714 | 714 | |
| 715 | - $page = inclure_page($fond, $contexte, $connect); |
|
| 716 | - |
|
| 717 | - if (!$page) { |
|
| 718 | - return $page; |
|
| 719 | - } |
|
| 720 | - // eval $page et affecte $res |
|
| 721 | - include _ROOT_RESTREINT . 'public/evaluer_page.php'; |
|
| 722 | - |
|
| 723 | - // Lever un drapeau (global) si le fond utilise #SESSION |
|
| 724 | - // a destination de public/parametrer |
|
| 725 | - // pour remonter vers les inclusions appelantes |
|
| 726 | - // il faut bien lever ce drapeau apres avoir evalue le fond |
|
| 727 | - // pour ne pas faire descendre le flag vers les inclusions appelees |
|
| 728 | - if ( |
|
| 729 | - isset($page['invalideurs']) |
|
| 730 | - and isset($page['invalideurs']['session']) |
|
| 731 | - ) { |
|
| 732 | - $GLOBALS['cache_utilise_session'] = $page['invalideurs']['session']; |
|
| 733 | - } |
|
| 734 | - |
|
| 735 | - return $page; |
|
| 715 | + $page = inclure_page($fond, $contexte, $connect); |
|
| 716 | + |
|
| 717 | + if (!$page) { |
|
| 718 | + return $page; |
|
| 719 | + } |
|
| 720 | + // eval $page et affecte $res |
|
| 721 | + include _ROOT_RESTREINT . 'public/evaluer_page.php'; |
|
| 722 | + |
|
| 723 | + // Lever un drapeau (global) si le fond utilise #SESSION |
|
| 724 | + // a destination de public/parametrer |
|
| 725 | + // pour remonter vers les inclusions appelantes |
|
| 726 | + // il faut bien lever ce drapeau apres avoir evalue le fond |
|
| 727 | + // pour ne pas faire descendre le flag vers les inclusions appelees |
|
| 728 | + if ( |
|
| 729 | + isset($page['invalideurs']) |
|
| 730 | + and isset($page['invalideurs']['session']) |
|
| 731 | + ) { |
|
| 732 | + $GLOBALS['cache_utilise_session'] = $page['invalideurs']['session']; |
|
| 733 | + } |
|
| 734 | + |
|
| 735 | + return $page; |
|
| 736 | 736 | } |
| 737 | 737 | |
| 738 | 738 | |
| 739 | 739 | // https://code.spip.net/@page_base_href |
| 740 | 740 | function page_base_href(&$texte) { |
| 741 | - static $set_html_base = null; |
|
| 742 | - if (is_null($set_html_base)) { |
|
| 743 | - if (!defined('_SET_HTML_BASE')) { |
|
| 744 | - // si la profondeur est superieure a 1 |
|
| 745 | - // est que ce n'est pas une url page ni une url action |
|
| 746 | - // activer par defaut |
|
| 747 | - $set_html_base = (( |
|
| 748 | - $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2) |
|
| 749 | - and _request(_SPIP_PAGE) !== 'login' |
|
| 750 | - and !_request('action')) ? true : false); |
|
| 751 | - } else { |
|
| 752 | - $set_html_base = _SET_HTML_BASE; |
|
| 753 | - } |
|
| 754 | - } |
|
| 755 | - |
|
| 756 | - if ( |
|
| 757 | - $set_html_base |
|
| 758 | - and isset($GLOBALS['html']) and $GLOBALS['html'] |
|
| 759 | - and $GLOBALS['profondeur_url'] > 0 |
|
| 760 | - and ($poshead = strpos($texte, '</head>')) !== false |
|
| 761 | - ) { |
|
| 762 | - $head = substr($texte, 0, $poshead); |
|
| 763 | - $insert = false; |
|
| 764 | - $href_base = false; |
|
| 765 | - if (strpos($head, '<base') === false) { |
|
| 766 | - $insert = true; |
|
| 767 | - } else { |
|
| 768 | - // si aucun <base ...> n'a de href il faut en inserer un |
|
| 769 | - // sinon juste re-ecrire les ancres si besoin |
|
| 770 | - $insert = true; |
|
| 771 | - include_spip('inc/filtres'); |
|
| 772 | - $bases = extraire_balises($head, 'base'); |
|
| 773 | - foreach ($bases as $base) { |
|
| 774 | - if ($href_base = extraire_attribut($base, 'href')) { |
|
| 775 | - $insert = false; |
|
| 776 | - break; |
|
| 777 | - } |
|
| 778 | - } |
|
| 779 | - } |
|
| 780 | - |
|
| 781 | - if ($insert) { |
|
| 782 | - include_spip('inc/filtres_mini'); |
|
| 783 | - // ajouter un base qui reglera tous les liens relatifs |
|
| 784 | - $href_base = url_absolue('./'); |
|
| 785 | - $base = "\n<base href=\"$href_base\" />"; |
|
| 786 | - if (($pos = strpos($head, '<head>')) !== false) { |
|
| 787 | - $head = substr_replace($head, $base, $pos + 6, 0); |
|
| 788 | - } elseif (preg_match(',<head[^>]*>,i', $head, $r)) { |
|
| 789 | - $head = str_replace($r[0], $r[0] . $base, $head); |
|
| 790 | - } |
|
| 791 | - $texte = $head . substr($texte, $poshead); |
|
| 792 | - } |
|
| 793 | - if ($href_base) { |
|
| 794 | - // gerer les ancres |
|
| 795 | - $base = $_SERVER['REQUEST_URI']; |
|
| 796 | - // pas de guillemets ni < dans l'URL qu'on insere dans le HTML |
|
| 797 | - if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) { |
|
| 798 | - $base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base); |
|
| 799 | - } |
|
| 800 | - if (strpos($texte, "href='#") !== false) { |
|
| 801 | - $texte = str_replace("href='#", "href='$base#", $texte); |
|
| 802 | - } |
|
| 803 | - if (strpos($texte, 'href="#') !== false) { |
|
| 804 | - $texte = str_replace('href="#', "href=\"$base#", $texte); |
|
| 805 | - } |
|
| 806 | - } |
|
| 807 | - } |
|
| 741 | + static $set_html_base = null; |
|
| 742 | + if (is_null($set_html_base)) { |
|
| 743 | + if (!defined('_SET_HTML_BASE')) { |
|
| 744 | + // si la profondeur est superieure a 1 |
|
| 745 | + // est que ce n'est pas une url page ni une url action |
|
| 746 | + // activer par defaut |
|
| 747 | + $set_html_base = (( |
|
| 748 | + $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2) |
|
| 749 | + and _request(_SPIP_PAGE) !== 'login' |
|
| 750 | + and !_request('action')) ? true : false); |
|
| 751 | + } else { |
|
| 752 | + $set_html_base = _SET_HTML_BASE; |
|
| 753 | + } |
|
| 754 | + } |
|
| 755 | + |
|
| 756 | + if ( |
|
| 757 | + $set_html_base |
|
| 758 | + and isset($GLOBALS['html']) and $GLOBALS['html'] |
|
| 759 | + and $GLOBALS['profondeur_url'] > 0 |
|
| 760 | + and ($poshead = strpos($texte, '</head>')) !== false |
|
| 761 | + ) { |
|
| 762 | + $head = substr($texte, 0, $poshead); |
|
| 763 | + $insert = false; |
|
| 764 | + $href_base = false; |
|
| 765 | + if (strpos($head, '<base') === false) { |
|
| 766 | + $insert = true; |
|
| 767 | + } else { |
|
| 768 | + // si aucun <base ...> n'a de href il faut en inserer un |
|
| 769 | + // sinon juste re-ecrire les ancres si besoin |
|
| 770 | + $insert = true; |
|
| 771 | + include_spip('inc/filtres'); |
|
| 772 | + $bases = extraire_balises($head, 'base'); |
|
| 773 | + foreach ($bases as $base) { |
|
| 774 | + if ($href_base = extraire_attribut($base, 'href')) { |
|
| 775 | + $insert = false; |
|
| 776 | + break; |
|
| 777 | + } |
|
| 778 | + } |
|
| 779 | + } |
|
| 780 | + |
|
| 781 | + if ($insert) { |
|
| 782 | + include_spip('inc/filtres_mini'); |
|
| 783 | + // ajouter un base qui reglera tous les liens relatifs |
|
| 784 | + $href_base = url_absolue('./'); |
|
| 785 | + $base = "\n<base href=\"$href_base\" />"; |
|
| 786 | + if (($pos = strpos($head, '<head>')) !== false) { |
|
| 787 | + $head = substr_replace($head, $base, $pos + 6, 0); |
|
| 788 | + } elseif (preg_match(',<head[^>]*>,i', $head, $r)) { |
|
| 789 | + $head = str_replace($r[0], $r[0] . $base, $head); |
|
| 790 | + } |
|
| 791 | + $texte = $head . substr($texte, $poshead); |
|
| 792 | + } |
|
| 793 | + if ($href_base) { |
|
| 794 | + // gerer les ancres |
|
| 795 | + $base = $_SERVER['REQUEST_URI']; |
|
| 796 | + // pas de guillemets ni < dans l'URL qu'on insere dans le HTML |
|
| 797 | + if (strpos($base, "'") or strpos($base, '"') or strpos($base, '<')) { |
|
| 798 | + $base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base); |
|
| 799 | + } |
|
| 800 | + if (strpos($texte, "href='#") !== false) { |
|
| 801 | + $texte = str_replace("href='#", "href='$base#", $texte); |
|
| 802 | + } |
|
| 803 | + if (strpos($texte, 'href="#') !== false) { |
|
| 804 | + $texte = str_replace('href="#', "href=\"$base#", $texte); |
|
| 805 | + } |
|
| 806 | + } |
|
| 807 | + } |
|
| 808 | 808 | } |
| 809 | 809 | |
| 810 | 810 | |
@@ -812,7 +812,7 @@ discard block |
||
| 812 | 812 | // et demarrent par X-Spip-... |
| 813 | 813 | // https://code.spip.net/@envoyer_entetes |
| 814 | 814 | function envoyer_entetes($entetes) { |
| 815 | - foreach ($entetes as $k => $v) { # if (strncmp($k, 'X-Spip-', 7)) |
|
| 816 | - @header(strlen($v) ? "$k: $v" : $k); |
|
| 817 | - } |
|
| 815 | + foreach ($entetes as $k => $v) { # if (strncmp($k, 'X-Spip-', 7)) |
|
| 816 | + @header(strlen($v) ? "$k: $v" : $k); |
|
| 817 | + } |
|
| 818 | 818 | } |
@@ -11,7 +11,7 @@ discard block |
||
| 11 | 11 | \***************************************************************************/ |
| 12 | 12 | |
| 13 | 13 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 14 | - return; |
|
| 14 | + return; |
|
| 15 | 15 | } |
| 16 | 16 | |
| 17 | 17 | /** |
@@ -27,9 +27,9 @@ discard block |
||
| 27 | 27 | * @return string |
| 28 | 28 | */ |
| 29 | 29 | function generer_nom_fichier_cache($contexte, $page) { |
| 30 | - $u = md5(var_export([$contexte, $page], true)); |
|
| 30 | + $u = md5(var_export([$contexte, $page], true)); |
|
| 31 | 31 | |
| 32 | - return $u . '.cache'; |
|
| 32 | + return $u . '.cache'; |
|
| 33 | 33 | } |
| 34 | 34 | |
| 35 | 35 | /** |
@@ -45,26 +45,26 @@ discard block |
||
| 45 | 45 | * @return string |
| 46 | 46 | */ |
| 47 | 47 | function cache_chemin_fichier($nom_cache, $ecrire = false) { |
| 48 | - static $l1, $l2; |
|
| 49 | - if (is_null($l1)) { |
|
| 50 | - $length = (defined('_CACHE_PROFONDEUR_STOCKAGE') ? min(8, max(_CACHE_PROFONDEUR_STOCKAGE, 2)) : 4); |
|
| 51 | - $l1 = intval(floor($length / 2)); |
|
| 52 | - $l2 = $length - $l1; |
|
| 53 | - } |
|
| 54 | - $d = substr($nom_cache, 0, $l1); |
|
| 55 | - $u = substr($nom_cache, $l1, $l2); |
|
| 56 | - |
|
| 57 | - if ($ecrire) { |
|
| 58 | - $rep = sous_repertoire(_DIR_CACHE, '', false, true); |
|
| 59 | - $rep = sous_repertoire($rep, 'calcul/', false, true); |
|
| 60 | - $rep = sous_repertoire($rep, $d, false, true); |
|
| 61 | - } |
|
| 62 | - else { |
|
| 63 | - // en lecture on essaye pa de creer les repertoires, on va au plus vite |
|
| 64 | - $rep = _DIR_CACHE . "$d/"; |
|
| 65 | - } |
|
| 66 | - |
|
| 67 | - return $rep . $u . '.cache'; |
|
| 48 | + static $l1, $l2; |
|
| 49 | + if (is_null($l1)) { |
|
| 50 | + $length = (defined('_CACHE_PROFONDEUR_STOCKAGE') ? min(8, max(_CACHE_PROFONDEUR_STOCKAGE, 2)) : 4); |
|
| 51 | + $l1 = intval(floor($length / 2)); |
|
| 52 | + $l2 = $length - $l1; |
|
| 53 | + } |
|
| 54 | + $d = substr($nom_cache, 0, $l1); |
|
| 55 | + $u = substr($nom_cache, $l1, $l2); |
|
| 56 | + |
|
| 57 | + if ($ecrire) { |
|
| 58 | + $rep = sous_repertoire(_DIR_CACHE, '', false, true); |
|
| 59 | + $rep = sous_repertoire($rep, 'calcul/', false, true); |
|
| 60 | + $rep = sous_repertoire($rep, $d, false, true); |
|
| 61 | + } |
|
| 62 | + else { |
|
| 63 | + // en lecture on essaye pa de creer les repertoires, on va au plus vite |
|
| 64 | + $rep = _DIR_CACHE . "$d/"; |
|
| 65 | + } |
|
| 66 | + |
|
| 67 | + return $rep . $u . '.cache'; |
|
| 68 | 68 | } |
| 69 | 69 | |
| 70 | 70 | /** |
@@ -75,7 +75,7 @@ discard block |
||
| 75 | 75 | * @return bool |
| 76 | 76 | */ |
| 77 | 77 | function ecrire_cache($nom_cache, $valeur) { |
| 78 | - return ecrire_fichier(cache_chemin_fichier($nom_cache, true), serialize(['nom_cache' => $nom_cache, 'valeur' => $valeur])); |
|
| 78 | + return ecrire_fichier(cache_chemin_fichier($nom_cache, true), serialize(['nom_cache' => $nom_cache, 'valeur' => $valeur])); |
|
| 79 | 79 | } |
| 80 | 80 | |
| 81 | 81 | /** |
@@ -85,37 +85,37 @@ discard block |
||
| 85 | 85 | * @return mixed |
| 86 | 86 | */ |
| 87 | 87 | function lire_cache($nom_cache) { |
| 88 | - if ( |
|
| 89 | - file_exists($f = cache_chemin_fichier($nom_cache)) |
|
| 90 | - and lire_fichier($f, $tmp) |
|
| 91 | - and $tmp = unserialize($tmp) |
|
| 92 | - and $tmp['nom_cache'] == $nom_cache |
|
| 93 | - and isset($tmp['valeur']) |
|
| 94 | - ) { |
|
| 95 | - return $tmp['valeur']; |
|
| 96 | - } |
|
| 97 | - |
|
| 98 | - return false; |
|
| 88 | + if ( |
|
| 89 | + file_exists($f = cache_chemin_fichier($nom_cache)) |
|
| 90 | + and lire_fichier($f, $tmp) |
|
| 91 | + and $tmp = unserialize($tmp) |
|
| 92 | + and $tmp['nom_cache'] == $nom_cache |
|
| 93 | + and isset($tmp['valeur']) |
|
| 94 | + ) { |
|
| 95 | + return $tmp['valeur']; |
|
| 96 | + } |
|
| 97 | + |
|
| 98 | + return false; |
|
| 99 | 99 | } |
| 100 | 100 | |
| 101 | 101 | // Parano : on signe le cache, afin d'interdire un hack d'injection |
| 102 | 102 | // dans notre memcache |
| 103 | 103 | function cache_signature(&$page) { |
| 104 | - if (!isset($GLOBALS['meta']['cache_signature'])) { |
|
| 105 | - include_spip('inc/acces'); |
|
| 106 | - include_spip('auth/sha256.inc'); |
|
| 107 | - ecrire_meta( |
|
| 108 | - 'cache_signature', |
|
| 109 | - spip_sha256( |
|
| 110 | - $_SERVER['DOCUMENT_ROOT'] |
|
| 111 | - . (isset($_SERVER['SERVER_SIGNATURE']) ? $_SERVER['SERVER_SIGNATURE'] : '') |
|
| 112 | - . creer_uniqid() |
|
| 113 | - ), |
|
| 114 | - 'non' |
|
| 115 | - ); |
|
| 116 | - } |
|
| 117 | - |
|
| 118 | - return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']); |
|
| 104 | + if (!isset($GLOBALS['meta']['cache_signature'])) { |
|
| 105 | + include_spip('inc/acces'); |
|
| 106 | + include_spip('auth/sha256.inc'); |
|
| 107 | + ecrire_meta( |
|
| 108 | + 'cache_signature', |
|
| 109 | + spip_sha256( |
|
| 110 | + $_SERVER['DOCUMENT_ROOT'] |
|
| 111 | + . (isset($_SERVER['SERVER_SIGNATURE']) ? $_SERVER['SERVER_SIGNATURE'] : '') |
|
| 112 | + . creer_uniqid() |
|
| 113 | + ), |
|
| 114 | + 'non' |
|
| 115 | + ); |
|
| 116 | + } |
|
| 117 | + |
|
| 118 | + return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']); |
|
| 119 | 119 | } |
| 120 | 120 | |
| 121 | 121 | /** |
@@ -129,14 +129,14 @@ discard block |
||
| 129 | 129 | * @return array |
| 130 | 130 | */ |
| 131 | 131 | function gzip_page($page) { |
| 132 | - if (function_exists('gzcompress') and strlen($page['texte']) > 16 * 1024) { |
|
| 133 | - $page['gz'] = true; |
|
| 134 | - $page['texte'] = gzcompress($page['texte']); |
|
| 135 | - } else { |
|
| 136 | - $page['gz'] = false; |
|
| 137 | - } |
|
| 138 | - |
|
| 139 | - return $page; |
|
| 132 | + if (function_exists('gzcompress') and strlen($page['texte']) > 16 * 1024) { |
|
| 133 | + $page['gz'] = true; |
|
| 134 | + $page['texte'] = gzcompress($page['texte']); |
|
| 135 | + } else { |
|
| 136 | + $page['gz'] = false; |
|
| 137 | + } |
|
| 138 | + |
|
| 139 | + return $page; |
|
| 140 | 140 | } |
| 141 | 141 | |
| 142 | 142 | /** |
@@ -151,10 +151,10 @@ discard block |
||
| 151 | 151 | * @return void |
| 152 | 152 | */ |
| 153 | 153 | function gunzip_page(&$page) { |
| 154 | - if ($page['gz']) { |
|
| 155 | - $page['texte'] = gzuncompress($page['texte']); |
|
| 156 | - $page['gz'] = false; // ne pas gzuncompress deux fois une meme page |
|
| 157 | - } |
|
| 154 | + if ($page['gz']) { |
|
| 155 | + $page['texte'] = gzuncompress($page['texte']); |
|
| 156 | + $page['gz'] = false; // ne pas gzuncompress deux fois une meme page |
|
| 157 | + } |
|
| 158 | 158 | } |
| 159 | 159 | |
| 160 | 160 | /** |
@@ -170,72 +170,72 @@ discard block |
||
| 170 | 170 | */ |
| 171 | 171 | /// https://code.spip.net/@cache_valide |
| 172 | 172 | function cache_valide(&$page, $date) { |
| 173 | - $now = $_SERVER['REQUEST_TIME']; |
|
| 174 | - |
|
| 175 | - // Apparition d'un nouvel article post-date ? |
|
| 176 | - if ( |
|
| 177 | - isset($GLOBALS['meta']['post_dates']) |
|
| 178 | - and $GLOBALS['meta']['post_dates'] == 'non' |
|
| 179 | - and isset($GLOBALS['meta']['date_prochain_postdate']) |
|
| 180 | - and $now > $GLOBALS['meta']['date_prochain_postdate'] |
|
| 181 | - ) { |
|
| 182 | - spip_log('Un article post-date invalide le cache'); |
|
| 183 | - include_spip('inc/rubriques'); |
|
| 184 | - calculer_prochain_postdate(true); |
|
| 185 | - } |
|
| 186 | - |
|
| 187 | - if (defined('_VAR_NOCACHE') and _VAR_NOCACHE) { |
|
| 188 | - return -1; |
|
| 189 | - } |
|
| 190 | - if (isset($GLOBALS['meta']['cache_inhib']) and $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) { |
|
| 191 | - return -1; |
|
| 192 | - } |
|
| 193 | - if (defined('_NO_CACHE')) { |
|
| 194 | - return (_NO_CACHE == 0 and !isset($page['texte'])) ? 1 : _NO_CACHE; |
|
| 195 | - } |
|
| 196 | - |
|
| 197 | - // pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache) |
|
| 198 | - if (!$page or !isset($page['texte']) or !isset($page['entetes']['X-Spip-Cache'])) { |
|
| 199 | - return _IS_BOT ? -1 : 1; |
|
| 200 | - } |
|
| 201 | - |
|
| 202 | - // controle de la signature |
|
| 203 | - if ($page['sig'] !== cache_signature($page)) { |
|
| 204 | - return _IS_BOT ? -1 : 1; |
|
| 205 | - } |
|
| 206 | - |
|
| 207 | - // #CACHE{n,statique} => on n'invalide pas avec derniere_modif |
|
| 208 | - // cf. ecrire/public/balises.php, balise_CACHE_dist() |
|
| 209 | - if (!isset($page['entetes']['X-Spip-Statique']) or $page['entetes']['X-Spip-Statique'] !== 'oui') { |
|
| 210 | - // Cache invalide par la meta 'derniere_modif' |
|
| 211 | - // sauf pour les bots, qui utilisent toujours le cache |
|
| 212 | - if ( |
|
| 213 | - !_IS_BOT |
|
| 214 | - and $GLOBALS['derniere_modif_invalide'] |
|
| 215 | - and isset($GLOBALS['meta']['derniere_modif']) |
|
| 216 | - and $date < $GLOBALS['meta']['derniere_modif'] |
|
| 217 | - ) { |
|
| 218 | - return 1; |
|
| 219 | - } |
|
| 220 | - } |
|
| 221 | - |
|
| 222 | - // Sinon comparer l'age du fichier a sa duree de cache |
|
| 223 | - $duree = intval($page['entetes']['X-Spip-Cache']); |
|
| 224 | - $cache_mark = (isset($GLOBALS['meta']['cache_mark']) ? $GLOBALS['meta']['cache_mark'] : 0); |
|
| 225 | - if ($duree == 0) { #CACHE{0} |
|
| 226 | - return -1; |
|
| 227 | - } // sauf pour les bots, qui utilisent toujours le cache |
|
| 228 | - else { |
|
| 229 | - if ( |
|
| 230 | - (!_IS_BOT and $date + $duree < $now) |
|
| 231 | - # le cache est anterieur a la derniere purge : l'ignorer, meme pour les bots |
|
| 232 | - or $date < $cache_mark |
|
| 233 | - ) { |
|
| 234 | - return _IS_BOT ? -1 : 1; |
|
| 235 | - } else { |
|
| 236 | - return 0; |
|
| 237 | - } |
|
| 238 | - } |
|
| 173 | + $now = $_SERVER['REQUEST_TIME']; |
|
| 174 | + |
|
| 175 | + // Apparition d'un nouvel article post-date ? |
|
| 176 | + if ( |
|
| 177 | + isset($GLOBALS['meta']['post_dates']) |
|
| 178 | + and $GLOBALS['meta']['post_dates'] == 'non' |
|
| 179 | + and isset($GLOBALS['meta']['date_prochain_postdate']) |
|
| 180 | + and $now > $GLOBALS['meta']['date_prochain_postdate'] |
|
| 181 | + ) { |
|
| 182 | + spip_log('Un article post-date invalide le cache'); |
|
| 183 | + include_spip('inc/rubriques'); |
|
| 184 | + calculer_prochain_postdate(true); |
|
| 185 | + } |
|
| 186 | + |
|
| 187 | + if (defined('_VAR_NOCACHE') and _VAR_NOCACHE) { |
|
| 188 | + return -1; |
|
| 189 | + } |
|
| 190 | + if (isset($GLOBALS['meta']['cache_inhib']) and $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) { |
|
| 191 | + return -1; |
|
| 192 | + } |
|
| 193 | + if (defined('_NO_CACHE')) { |
|
| 194 | + return (_NO_CACHE == 0 and !isset($page['texte'])) ? 1 : _NO_CACHE; |
|
| 195 | + } |
|
| 196 | + |
|
| 197 | + // pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache) |
|
| 198 | + if (!$page or !isset($page['texte']) or !isset($page['entetes']['X-Spip-Cache'])) { |
|
| 199 | + return _IS_BOT ? -1 : 1; |
|
| 200 | + } |
|
| 201 | + |
|
| 202 | + // controle de la signature |
|
| 203 | + if ($page['sig'] !== cache_signature($page)) { |
|
| 204 | + return _IS_BOT ? -1 : 1; |
|
| 205 | + } |
|
| 206 | + |
|
| 207 | + // #CACHE{n,statique} => on n'invalide pas avec derniere_modif |
|
| 208 | + // cf. ecrire/public/balises.php, balise_CACHE_dist() |
|
| 209 | + if (!isset($page['entetes']['X-Spip-Statique']) or $page['entetes']['X-Spip-Statique'] !== 'oui') { |
|
| 210 | + // Cache invalide par la meta 'derniere_modif' |
|
| 211 | + // sauf pour les bots, qui utilisent toujours le cache |
|
| 212 | + if ( |
|
| 213 | + !_IS_BOT |
|
| 214 | + and $GLOBALS['derniere_modif_invalide'] |
|
| 215 | + and isset($GLOBALS['meta']['derniere_modif']) |
|
| 216 | + and $date < $GLOBALS['meta']['derniere_modif'] |
|
| 217 | + ) { |
|
| 218 | + return 1; |
|
| 219 | + } |
|
| 220 | + } |
|
| 221 | + |
|
| 222 | + // Sinon comparer l'age du fichier a sa duree de cache |
|
| 223 | + $duree = intval($page['entetes']['X-Spip-Cache']); |
|
| 224 | + $cache_mark = (isset($GLOBALS['meta']['cache_mark']) ? $GLOBALS['meta']['cache_mark'] : 0); |
|
| 225 | + if ($duree == 0) { #CACHE{0} |
|
| 226 | + return -1; |
|
| 227 | + } // sauf pour les bots, qui utilisent toujours le cache |
|
| 228 | + else { |
|
| 229 | + if ( |
|
| 230 | + (!_IS_BOT and $date + $duree < $now) |
|
| 231 | + # le cache est anterieur a la derniere purge : l'ignorer, meme pour les bots |
|
| 232 | + or $date < $cache_mark |
|
| 233 | + ) { |
|
| 234 | + return _IS_BOT ? -1 : 1; |
|
| 235 | + } else { |
|
| 236 | + return 0; |
|
| 237 | + } |
|
| 238 | + } |
|
| 239 | 239 | } |
| 240 | 240 | |
| 241 | 241 | /** |
@@ -250,59 +250,59 @@ discard block |
||
| 250 | 250 | */ |
| 251 | 251 | function creer_cache(&$page, &$chemin_cache) { |
| 252 | 252 | |
| 253 | - // Ne rien faire si on est en preview, debug, ou si une erreur |
|
| 254 | - // grave s'est presentee (compilation du squelette, MySQL, etc) |
|
| 255 | - // le cas var_nocache ne devrait jamais arriver ici (securite) |
|
| 256 | - // le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable |
|
| 257 | - if ( |
|
| 258 | - (defined('_VAR_NOCACHE') and _VAR_NOCACHE) |
|
| 259 | - or defined('spip_interdire_cache') |
|
| 260 | - ) { |
|
| 261 | - return; |
|
| 262 | - } |
|
| 263 | - |
|
| 264 | - // Si la page c1234 a un invalideur de session 'zz', sauver dans |
|
| 265 | - // 'tmp/cache/MD5(chemin_cache)_zz' |
|
| 266 | - if ( |
|
| 267 | - isset($page['invalideurs']) |
|
| 268 | - and isset($page['invalideurs']['session']) |
|
| 269 | - ) { |
|
| 270 | - // on verifie que le contenu du chemin cache indique seulement |
|
| 271 | - // "cache sessionne" ; sa date indique la date de validite |
|
| 272 | - // des caches sessionnes |
|
| 273 | - if (!$tmp = lire_cache($chemin_cache)) { |
|
| 274 | - spip_log('Creation cache sessionne ' . $chemin_cache); |
|
| 275 | - $tmp = [ |
|
| 276 | - 'invalideurs' => ['session' => ''], |
|
| 277 | - 'lastmodified' => $_SERVER['REQUEST_TIME'] |
|
| 278 | - ]; |
|
| 279 | - ecrire_cache($chemin_cache, $tmp); |
|
| 280 | - } |
|
| 281 | - $chemin_cache = generer_nom_fichier_cache( |
|
| 282 | - ['chemin_cache' => $chemin_cache], |
|
| 283 | - ['session' => $page['invalideurs']['session']] |
|
| 284 | - ); |
|
| 285 | - } |
|
| 286 | - |
|
| 287 | - // ajouter la date de production dans le cache lui meme |
|
| 288 | - // (qui contient deja sa duree de validite) |
|
| 289 | - $page['lastmodified'] = $_SERVER['REQUEST_TIME']; |
|
| 290 | - |
|
| 291 | - // compresser le contenu si besoin |
|
| 292 | - $pagez = gzip_page($page); |
|
| 293 | - |
|
| 294 | - // signer le contenu |
|
| 295 | - $pagez['sig'] = cache_signature($pagez); |
|
| 296 | - |
|
| 297 | - // l'enregistrer, compresse ou non... |
|
| 298 | - $ok = ecrire_cache($chemin_cache, $pagez); |
|
| 299 | - |
|
| 300 | - spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour " |
|
| 301 | - . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO); |
|
| 302 | - |
|
| 303 | - // Inserer ses invalideurs |
|
| 304 | - include_spip('inc/invalideur'); |
|
| 305 | - maj_invalideurs($chemin_cache, $page); |
|
| 253 | + // Ne rien faire si on est en preview, debug, ou si une erreur |
|
| 254 | + // grave s'est presentee (compilation du squelette, MySQL, etc) |
|
| 255 | + // le cas var_nocache ne devrait jamais arriver ici (securite) |
|
| 256 | + // le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable |
|
| 257 | + if ( |
|
| 258 | + (defined('_VAR_NOCACHE') and _VAR_NOCACHE) |
|
| 259 | + or defined('spip_interdire_cache') |
|
| 260 | + ) { |
|
| 261 | + return; |
|
| 262 | + } |
|
| 263 | + |
|
| 264 | + // Si la page c1234 a un invalideur de session 'zz', sauver dans |
|
| 265 | + // 'tmp/cache/MD5(chemin_cache)_zz' |
|
| 266 | + if ( |
|
| 267 | + isset($page['invalideurs']) |
|
| 268 | + and isset($page['invalideurs']['session']) |
|
| 269 | + ) { |
|
| 270 | + // on verifie que le contenu du chemin cache indique seulement |
|
| 271 | + // "cache sessionne" ; sa date indique la date de validite |
|
| 272 | + // des caches sessionnes |
|
| 273 | + if (!$tmp = lire_cache($chemin_cache)) { |
|
| 274 | + spip_log('Creation cache sessionne ' . $chemin_cache); |
|
| 275 | + $tmp = [ |
|
| 276 | + 'invalideurs' => ['session' => ''], |
|
| 277 | + 'lastmodified' => $_SERVER['REQUEST_TIME'] |
|
| 278 | + ]; |
|
| 279 | + ecrire_cache($chemin_cache, $tmp); |
|
| 280 | + } |
|
| 281 | + $chemin_cache = generer_nom_fichier_cache( |
|
| 282 | + ['chemin_cache' => $chemin_cache], |
|
| 283 | + ['session' => $page['invalideurs']['session']] |
|
| 284 | + ); |
|
| 285 | + } |
|
| 286 | + |
|
| 287 | + // ajouter la date de production dans le cache lui meme |
|
| 288 | + // (qui contient deja sa duree de validite) |
|
| 289 | + $page['lastmodified'] = $_SERVER['REQUEST_TIME']; |
|
| 290 | + |
|
| 291 | + // compresser le contenu si besoin |
|
| 292 | + $pagez = gzip_page($page); |
|
| 293 | + |
|
| 294 | + // signer le contenu |
|
| 295 | + $pagez['sig'] = cache_signature($pagez); |
|
| 296 | + |
|
| 297 | + // l'enregistrer, compresse ou non... |
|
| 298 | + $ok = ecrire_cache($chemin_cache, $pagez); |
|
| 299 | + |
|
| 300 | + spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour " |
|
| 301 | + . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO); |
|
| 302 | + |
|
| 303 | + // Inserer ses invalideurs |
|
| 304 | + include_spip('inc/invalideur'); |
|
| 305 | + maj_invalideurs($chemin_cache, $page); |
|
| 306 | 306 | } |
| 307 | 307 | |
| 308 | 308 | |
@@ -317,15 +317,15 @@ discard block |
||
| 317 | 317 | * @return void |
| 318 | 318 | */ |
| 319 | 319 | function nettoyer_petit_cache($prefix, $duree = 300) { |
| 320 | - // determiner le repertoire a purger : 'tmp/CACHE/rech/' |
|
| 321 | - $dircache = sous_repertoire(_DIR_CACHE, $prefix); |
|
| 322 | - if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) { |
|
| 323 | - foreach (preg_files($dircache, '[.]txt$') as $f) { |
|
| 324 | - if ($_SERVER['REQUEST_TIME'] - (@file_exists($f) ? @filemtime($f) : 0) > $duree) { |
|
| 325 | - spip_unlink($f); |
|
| 326 | - } |
|
| 327 | - } |
|
| 328 | - } |
|
| 320 | + // determiner le repertoire a purger : 'tmp/CACHE/rech/' |
|
| 321 | + $dircache = sous_repertoire(_DIR_CACHE, $prefix); |
|
| 322 | + if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) { |
|
| 323 | + foreach (preg_files($dircache, '[.]txt$') as $f) { |
|
| 324 | + if ($_SERVER['REQUEST_TIME'] - (@file_exists($f) ? @filemtime($f) : 0) > $duree) { |
|
| 325 | + spip_unlink($f); |
|
| 326 | + } |
|
| 327 | + } |
|
| 328 | + } |
|
| 329 | 329 | } |
| 330 | 330 | |
| 331 | 331 | |
@@ -355,133 +355,133 @@ discard block |
||
| 355 | 355 | */ |
| 356 | 356 | function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) { |
| 357 | 357 | |
| 358 | - # fonction de cache minimale : dire "non on ne met rien en cache" |
|
| 359 | - # $use_cache = -1; return; |
|
| 360 | - |
|
| 361 | - // Second appel, destine a l'enregistrement du cache sur le disque |
|
| 362 | - if (isset($chemin_cache)) { |
|
| 363 | - return creer_cache($page, $chemin_cache); |
|
| 364 | - } |
|
| 365 | - |
|
| 366 | - // Toute la suite correspond au premier appel |
|
| 367 | - $contexte_implicite = $page['contexte_implicite']; |
|
| 368 | - |
|
| 369 | - // Cas ignorant le cache car completement dynamique |
|
| 370 | - if ( |
|
| 371 | - (!empty($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] === 'POST') |
|
| 372 | - or _request('connect') |
|
| 373 | - ) { |
|
| 374 | - $use_cache = -1; |
|
| 375 | - $lastmodified = 0; |
|
| 376 | - $chemin_cache = ''; |
|
| 377 | - $page = []; |
|
| 378 | - |
|
| 379 | - return; |
|
| 380 | - } |
|
| 381 | - |
|
| 382 | - // Controler l'existence d'un cache nous correspondant |
|
| 383 | - $chemin_cache = generer_nom_fichier_cache($contexte, $page); |
|
| 384 | - $lastmodified = 0; |
|
| 385 | - |
|
| 386 | - // charger le cache s'il existe (et si il a bien le bon hash = anticollision) |
|
| 387 | - if (!$page = lire_cache($chemin_cache)) { |
|
| 388 | - $page = []; |
|
| 389 | - } |
|
| 390 | - |
|
| 391 | - // s'il est sessionne, charger celui correspondant a notre session |
|
| 392 | - if ( |
|
| 393 | - isset($page['invalideurs']) |
|
| 394 | - and isset($page['invalideurs']['session']) |
|
| 395 | - ) { |
|
| 396 | - $chemin_cache_session = generer_nom_fichier_cache( |
|
| 397 | - ['chemin_cache' => $chemin_cache], |
|
| 398 | - ['session' => spip_session()] |
|
| 399 | - ); |
|
| 400 | - if ( |
|
| 401 | - $page_session = lire_cache($chemin_cache_session) |
|
| 402 | - and $page_session['lastmodified'] >= $page['lastmodified'] |
|
| 403 | - ) { |
|
| 404 | - $page = $page_session; |
|
| 405 | - } else { |
|
| 406 | - $page = []; |
|
| 407 | - } |
|
| 408 | - } |
|
| 409 | - |
|
| 410 | - |
|
| 411 | - // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ? |
|
| 412 | - if (isset($GLOBALS['meta']['invalider'])) { |
|
| 413 | - // ne le faire que si la base est disponible |
|
| 414 | - if (spip_connect()) { |
|
| 415 | - include_spip('inc/invalideur'); |
|
| 416 | - retire_caches($chemin_cache); # API invalideur inutile |
|
| 417 | - supprimer_fichier(_DIR_CACHE . $chemin_cache); |
|
| 418 | - if (isset($chemin_cache_session) and $chemin_cache_session) { |
|
| 419 | - supprimer_fichier(_DIR_CACHE . $chemin_cache_session); |
|
| 420 | - } |
|
| 421 | - } |
|
| 422 | - } |
|
| 423 | - |
|
| 424 | - // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande, |
|
| 425 | - // on supprime le cache |
|
| 426 | - if ( |
|
| 427 | - defined('_VAR_MODE') && |
|
| 428 | - _VAR_MODE && |
|
| 429 | - (isset($_COOKIE['spip_session']) || |
|
| 430 | - isset($_COOKIE['spip_admin']) || |
|
| 431 | - @file_exists(_ACCESS_FILE_NAME)) |
|
| 432 | - ) { |
|
| 433 | - $page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu |
|
| 434 | - include_spip('inc/invalideur'); |
|
| 435 | - retire_caches($chemin_cache); # API invalideur inutile |
|
| 436 | - supprimer_fichier(_DIR_CACHE . $chemin_cache); |
|
| 437 | - if (isset($chemin_cache_session) and $chemin_cache_session) { |
|
| 438 | - supprimer_fichier(_DIR_CACHE . $chemin_cache_session); |
|
| 439 | - } |
|
| 440 | - } |
|
| 441 | - |
|
| 442 | - // $delais par defaut |
|
| 443 | - // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé |
|
| 444 | - // qui sont a cache nul par defaut |
|
| 445 | - if (!isset($GLOBALS['delais'])) { |
|
| 446 | - if (!defined('_DUREE_CACHE_DEFAUT')) { |
|
| 447 | - define('_DUREE_CACHE_DEFAUT', 24 * 3600); |
|
| 448 | - } |
|
| 449 | - $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT; |
|
| 450 | - } |
|
| 451 | - |
|
| 452 | - // determiner la validite de la page |
|
| 453 | - if ($page) { |
|
| 454 | - $use_cache = cache_valide($page, isset($page['lastmodified']) ? $page['lastmodified'] : 0); |
|
| 455 | - // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence |
|
| 456 | - // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul |
|
| 457 | - $page['contexte_implicite'] = $contexte_implicite; |
|
| 458 | - if (!$use_cache) { |
|
| 459 | - // $page est un cache utilisable |
|
| 460 | - gunzip_page($page); |
|
| 461 | - |
|
| 462 | - return; |
|
| 463 | - } |
|
| 464 | - } else { |
|
| 465 | - $page = ['contexte_implicite' => $contexte_implicite]; |
|
| 466 | - $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul |
|
| 467 | - } |
|
| 468 | - |
|
| 469 | - // Si pas valide mais pas de connexion a la base, le garder quand meme |
|
| 470 | - if (!spip_connect()) { |
|
| 471 | - if (isset($page['texte'])) { |
|
| 472 | - gunzip_page($page); |
|
| 473 | - $use_cache = 0; |
|
| 474 | - } else { |
|
| 475 | - spip_log("Erreur base de donnees, impossible utiliser $chemin_cache"); |
|
| 476 | - include_spip('inc/minipres'); |
|
| 477 | - |
|
| 478 | - return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]); |
|
| 479 | - } |
|
| 480 | - } |
|
| 481 | - |
|
| 482 | - if ($use_cache < 0) { |
|
| 483 | - $chemin_cache = ''; |
|
| 484 | - } |
|
| 485 | - |
|
| 486 | - return; |
|
| 358 | + # fonction de cache minimale : dire "non on ne met rien en cache" |
|
| 359 | + # $use_cache = -1; return; |
|
| 360 | + |
|
| 361 | + // Second appel, destine a l'enregistrement du cache sur le disque |
|
| 362 | + if (isset($chemin_cache)) { |
|
| 363 | + return creer_cache($page, $chemin_cache); |
|
| 364 | + } |
|
| 365 | + |
|
| 366 | + // Toute la suite correspond au premier appel |
|
| 367 | + $contexte_implicite = $page['contexte_implicite']; |
|
| 368 | + |
|
| 369 | + // Cas ignorant le cache car completement dynamique |
|
| 370 | + if ( |
|
| 371 | + (!empty($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] === 'POST') |
|
| 372 | + or _request('connect') |
|
| 373 | + ) { |
|
| 374 | + $use_cache = -1; |
|
| 375 | + $lastmodified = 0; |
|
| 376 | + $chemin_cache = ''; |
|
| 377 | + $page = []; |
|
| 378 | + |
|
| 379 | + return; |
|
| 380 | + } |
|
| 381 | + |
|
| 382 | + // Controler l'existence d'un cache nous correspondant |
|
| 383 | + $chemin_cache = generer_nom_fichier_cache($contexte, $page); |
|
| 384 | + $lastmodified = 0; |
|
| 385 | + |
|
| 386 | + // charger le cache s'il existe (et si il a bien le bon hash = anticollision) |
|
| 387 | + if (!$page = lire_cache($chemin_cache)) { |
|
| 388 | + $page = []; |
|
| 389 | + } |
|
| 390 | + |
|
| 391 | + // s'il est sessionne, charger celui correspondant a notre session |
|
| 392 | + if ( |
|
| 393 | + isset($page['invalideurs']) |
|
| 394 | + and isset($page['invalideurs']['session']) |
|
| 395 | + ) { |
|
| 396 | + $chemin_cache_session = generer_nom_fichier_cache( |
|
| 397 | + ['chemin_cache' => $chemin_cache], |
|
| 398 | + ['session' => spip_session()] |
|
| 399 | + ); |
|
| 400 | + if ( |
|
| 401 | + $page_session = lire_cache($chemin_cache_session) |
|
| 402 | + and $page_session['lastmodified'] >= $page['lastmodified'] |
|
| 403 | + ) { |
|
| 404 | + $page = $page_session; |
|
| 405 | + } else { |
|
| 406 | + $page = []; |
|
| 407 | + } |
|
| 408 | + } |
|
| 409 | + |
|
| 410 | + |
|
| 411 | + // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ? |
|
| 412 | + if (isset($GLOBALS['meta']['invalider'])) { |
|
| 413 | + // ne le faire que si la base est disponible |
|
| 414 | + if (spip_connect()) { |
|
| 415 | + include_spip('inc/invalideur'); |
|
| 416 | + retire_caches($chemin_cache); # API invalideur inutile |
|
| 417 | + supprimer_fichier(_DIR_CACHE . $chemin_cache); |
|
| 418 | + if (isset($chemin_cache_session) and $chemin_cache_session) { |
|
| 419 | + supprimer_fichier(_DIR_CACHE . $chemin_cache_session); |
|
| 420 | + } |
|
| 421 | + } |
|
| 422 | + } |
|
| 423 | + |
|
| 424 | + // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande, |
|
| 425 | + // on supprime le cache |
|
| 426 | + if ( |
|
| 427 | + defined('_VAR_MODE') && |
|
| 428 | + _VAR_MODE && |
|
| 429 | + (isset($_COOKIE['spip_session']) || |
|
| 430 | + isset($_COOKIE['spip_admin']) || |
|
| 431 | + @file_exists(_ACCESS_FILE_NAME)) |
|
| 432 | + ) { |
|
| 433 | + $page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu |
|
| 434 | + include_spip('inc/invalideur'); |
|
| 435 | + retire_caches($chemin_cache); # API invalideur inutile |
|
| 436 | + supprimer_fichier(_DIR_CACHE . $chemin_cache); |
|
| 437 | + if (isset($chemin_cache_session) and $chemin_cache_session) { |
|
| 438 | + supprimer_fichier(_DIR_CACHE . $chemin_cache_session); |
|
| 439 | + } |
|
| 440 | + } |
|
| 441 | + |
|
| 442 | + // $delais par defaut |
|
| 443 | + // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé |
|
| 444 | + // qui sont a cache nul par defaut |
|
| 445 | + if (!isset($GLOBALS['delais'])) { |
|
| 446 | + if (!defined('_DUREE_CACHE_DEFAUT')) { |
|
| 447 | + define('_DUREE_CACHE_DEFAUT', 24 * 3600); |
|
| 448 | + } |
|
| 449 | + $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT; |
|
| 450 | + } |
|
| 451 | + |
|
| 452 | + // determiner la validite de la page |
|
| 453 | + if ($page) { |
|
| 454 | + $use_cache = cache_valide($page, isset($page['lastmodified']) ? $page['lastmodified'] : 0); |
|
| 455 | + // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence |
|
| 456 | + // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul |
|
| 457 | + $page['contexte_implicite'] = $contexte_implicite; |
|
| 458 | + if (!$use_cache) { |
|
| 459 | + // $page est un cache utilisable |
|
| 460 | + gunzip_page($page); |
|
| 461 | + |
|
| 462 | + return; |
|
| 463 | + } |
|
| 464 | + } else { |
|
| 465 | + $page = ['contexte_implicite' => $contexte_implicite]; |
|
| 466 | + $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul |
|
| 467 | + } |
|
| 468 | + |
|
| 469 | + // Si pas valide mais pas de connexion a la base, le garder quand meme |
|
| 470 | + if (!spip_connect()) { |
|
| 471 | + if (isset($page['texte'])) { |
|
| 472 | + gunzip_page($page); |
|
| 473 | + $use_cache = 0; |
|
| 474 | + } else { |
|
| 475 | + spip_log("Erreur base de donnees, impossible utiliser $chemin_cache"); |
|
| 476 | + include_spip('inc/minipres'); |
|
| 477 | + |
|
| 478 | + return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]); |
|
| 479 | + } |
|
| 480 | + } |
|
| 481 | + |
|
| 482 | + if ($use_cache < 0) { |
|
| 483 | + $chemin_cache = ''; |
|
| 484 | + } |
|
| 485 | + |
|
| 486 | + return; |
|
| 487 | 487 | } |
@@ -29,7 +29,7 @@ discard block |
||
| 29 | 29 | function generer_nom_fichier_cache($contexte, $page) { |
| 30 | 30 | $u = md5(var_export([$contexte, $page], true)); |
| 31 | 31 | |
| 32 | - return $u . '.cache'; |
|
| 32 | + return $u.'.cache'; |
|
| 33 | 33 | } |
| 34 | 34 | |
| 35 | 35 | /** |
@@ -61,10 +61,10 @@ discard block |
||
| 61 | 61 | } |
| 62 | 62 | else { |
| 63 | 63 | // en lecture on essaye pa de creer les repertoires, on va au plus vite |
| 64 | - $rep = _DIR_CACHE . "$d/"; |
|
| 64 | + $rep = _DIR_CACHE."$d/"; |
|
| 65 | 65 | } |
| 66 | 66 | |
| 67 | - return $rep . $u . '.cache'; |
|
| 67 | + return $rep.$u.'.cache'; |
|
| 68 | 68 | } |
| 69 | 69 | |
| 70 | 70 | /** |
@@ -115,7 +115,7 @@ discard block |
||
| 115 | 115 | ); |
| 116 | 116 | } |
| 117 | 117 | |
| 118 | - return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']); |
|
| 118 | + return crc32($GLOBALS['meta']['cache_signature'].$page['texte']); |
|
| 119 | 119 | } |
| 120 | 120 | |
| 121 | 121 | /** |
@@ -271,7 +271,7 @@ discard block |
||
| 271 | 271 | // "cache sessionne" ; sa date indique la date de validite |
| 272 | 272 | // des caches sessionnes |
| 273 | 273 | if (!$tmp = lire_cache($chemin_cache)) { |
| 274 | - spip_log('Creation cache sessionne ' . $chemin_cache); |
|
| 274 | + spip_log('Creation cache sessionne '.$chemin_cache); |
|
| 275 | 275 | $tmp = [ |
| 276 | 276 | 'invalideurs' => ['session' => ''], |
| 277 | 277 | 'lastmodified' => $_SERVER['REQUEST_TIME'] |
@@ -297,8 +297,8 @@ discard block |
||
| 297 | 297 | // l'enregistrer, compresse ou non... |
| 298 | 298 | $ok = ecrire_cache($chemin_cache, $pagez); |
| 299 | 299 | |
| 300 | - spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour " |
|
| 301 | - . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO); |
|
| 300 | + spip_log((_IS_BOT ? 'Bot:' : '')."Creation du cache $chemin_cache pour " |
|
| 301 | + . $page['entetes']['X-Spip-Cache'].' secondes'.($ok ? '' : ' (erreur!)'), _LOG_INFO); |
|
| 302 | 302 | |
| 303 | 303 | // Inserer ses invalideurs |
| 304 | 304 | include_spip('inc/invalideur'); |
@@ -319,7 +319,7 @@ discard block |
||
| 319 | 319 | function nettoyer_petit_cache($prefix, $duree = 300) { |
| 320 | 320 | // determiner le repertoire a purger : 'tmp/CACHE/rech/' |
| 321 | 321 | $dircache = sous_repertoire(_DIR_CACHE, $prefix); |
| 322 | - if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) { |
|
| 322 | + if (spip_touch($dircache.'purger_'.$prefix, $duree, true)) { |
|
| 323 | 323 | foreach (preg_files($dircache, '[.]txt$') as $f) { |
| 324 | 324 | if ($_SERVER['REQUEST_TIME'] - (@file_exists($f) ? @filemtime($f) : 0) > $duree) { |
| 325 | 325 | spip_unlink($f); |
@@ -414,9 +414,9 @@ discard block |
||
| 414 | 414 | if (spip_connect()) { |
| 415 | 415 | include_spip('inc/invalideur'); |
| 416 | 416 | retire_caches($chemin_cache); # API invalideur inutile |
| 417 | - supprimer_fichier(_DIR_CACHE . $chemin_cache); |
|
| 417 | + supprimer_fichier(_DIR_CACHE.$chemin_cache); |
|
| 418 | 418 | if (isset($chemin_cache_session) and $chemin_cache_session) { |
| 419 | - supprimer_fichier(_DIR_CACHE . $chemin_cache_session); |
|
| 419 | + supprimer_fichier(_DIR_CACHE.$chemin_cache_session); |
|
| 420 | 420 | } |
| 421 | 421 | } |
| 422 | 422 | } |
@@ -433,9 +433,9 @@ discard block |
||
| 433 | 433 | $page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu |
| 434 | 434 | include_spip('inc/invalideur'); |
| 435 | 435 | retire_caches($chemin_cache); # API invalideur inutile |
| 436 | - supprimer_fichier(_DIR_CACHE . $chemin_cache); |
|
| 436 | + supprimer_fichier(_DIR_CACHE.$chemin_cache); |
|
| 437 | 437 | if (isset($chemin_cache_session) and $chemin_cache_session) { |
| 438 | - supprimer_fichier(_DIR_CACHE . $chemin_cache_session); |
|
| 438 | + supprimer_fichier(_DIR_CACHE.$chemin_cache_session); |
|
| 439 | 439 | } |
| 440 | 440 | } |
| 441 | 441 | |
@@ -58,8 +58,7 @@ |
||
| 58 | 58 | $rep = sous_repertoire(_DIR_CACHE, '', false, true); |
| 59 | 59 | $rep = sous_repertoire($rep, 'calcul/', false, true); |
| 60 | 60 | $rep = sous_repertoire($rep, $d, false, true); |
| 61 | - } |
|
| 62 | - else { |
|
| 61 | + } else { |
|
| 63 | 62 | // en lecture on essaye pa de creer les repertoires, on va au plus vite |
| 64 | 63 | $rep = _DIR_CACHE . "$d/"; |
| 65 | 64 | } |
@@ -18,7 +18,7 @@ discard block |
||
| 18 | 18 | **/ |
| 19 | 19 | |
| 20 | 20 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 21 | - return; |
|
| 21 | + return; |
|
| 22 | 22 | } |
| 23 | 23 | |
| 24 | 24 | include_spip('inc/texte'); |
@@ -43,233 +43,233 @@ discard block |
||
| 43 | 43 | // https://code.spip.net/@public_composer_dist |
| 44 | 44 | function public_composer_dist($squelette, $mime_type, $gram, $source, $connect = '') { |
| 45 | 45 | |
| 46 | - $nom = calculer_nom_fonction_squel($squelette, $mime_type, $connect); |
|
| 47 | - |
|
| 48 | - // si deja en memoire (INCLURE a repetition) c'est bon. |
|
| 49 | - if (function_exists($nom)) { |
|
| 50 | - return $nom; |
|
| 51 | - } |
|
| 52 | - |
|
| 53 | - if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
|
| 54 | - $GLOBALS['debug_objets']['courant'] = $nom; |
|
| 55 | - } |
|
| 56 | - |
|
| 57 | - $phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php'; |
|
| 58 | - |
|
| 59 | - // si squelette est deja compile et perenne, le charger |
|
| 60 | - if (!squelette_obsolete($phpfile, $source)) { |
|
| 61 | - include_once $phpfile; |
|
| 62 | - #if (!squelette_obsolete($phpfile, $source) |
|
| 63 | - # AND lire_fichier ($phpfile, $skel_code, |
|
| 64 | - # array('critique' => 'oui', 'phpcheck' => 'oui'))){ |
|
| 65 | - ## eval('?'.'>'.$skel_code); |
|
| 66 | - # spip_log($skel_code, 'comp') |
|
| 67 | - #} |
|
| 68 | - } |
|
| 69 | - |
|
| 70 | - if (file_exists($lib = $squelette . '_fonctions' . '.php')) { |
|
| 71 | - include_once $lib; |
|
| 72 | - } |
|
| 73 | - |
|
| 74 | - // tester si le eval ci-dessus a mis le squelette en memoire |
|
| 75 | - |
|
| 76 | - if (function_exists($nom)) { |
|
| 77 | - return $nom; |
|
| 78 | - } |
|
| 79 | - |
|
| 80 | - // charger le source, si possible, et compiler |
|
| 81 | - $skel_code = ''; |
|
| 82 | - if (lire_fichier($source, $skel)) { |
|
| 83 | - $compiler = charger_fonction('compiler', 'public'); |
|
| 84 | - $skel_code = $compiler($skel, $nom, $gram, $source, $connect); |
|
| 85 | - } |
|
| 86 | - |
|
| 87 | - // Ne plus rien faire si le compilateur n'a pas pu operer. |
|
| 88 | - if (!$skel_code) { |
|
| 89 | - return false; |
|
| 90 | - } |
|
| 91 | - |
|
| 92 | - foreach ($skel_code as $id => $boucle) { |
|
| 93 | - $f = $boucle->return; |
|
| 94 | - try { |
|
| 95 | - eval("return true; $f ;"); |
|
| 96 | - } catch (\ParseError $e) { |
|
| 97 | - // Code syntaxiquement faux (critere etc mal programme') |
|
| 98 | - $msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage(); |
|
| 99 | - erreur_squelette($msg, $boucle); |
|
| 100 | - // continuer pour trouver d'autres fautes eventuelles |
|
| 101 | - // mais prevenir que c'est mort |
|
| 102 | - $nom = ''; |
|
| 103 | - } |
|
| 104 | - |
|
| 105 | - // Contexte de compil inutile a present |
|
| 106 | - // (mais la derniere valeur de $boucle est utilisee ci-dessous) |
|
| 107 | - $skel_code[$id] = $f; |
|
| 108 | - } |
|
| 109 | - |
|
| 110 | - $code = ''; |
|
| 111 | - if ($nom) { |
|
| 112 | - // Si le code est bon, concatener et mettre en cache |
|
| 113 | - if (function_exists($nom)) { |
|
| 114 | - $code = squelette_traduit($skel, $source, $phpfile, $skel_code); |
|
| 115 | - } else { |
|
| 116 | - // code semantiquement faux: bug du compilateur |
|
| 117 | - // $boucle est en fait ici la fct principale du squelette |
|
| 118 | - $msg = _T('zbug_erreur_compilation'); |
|
| 119 | - erreur_squelette($msg, $boucle); |
|
| 120 | - $nom = ''; |
|
| 121 | - } |
|
| 122 | - } |
|
| 123 | - |
|
| 124 | - if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
|
| 125 | - // Tracer ce qui vient d'etre compile |
|
| 126 | - $GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code; |
|
| 127 | - |
|
| 128 | - // si c'est ce que demande le debusqueur, lui passer la main |
|
| 129 | - if ( |
|
| 130 | - $GLOBALS['debug_objets']['sourcefile'] |
|
| 131 | - and (_request('var_mode_objet') == $nom) |
|
| 132 | - and (_request('var_mode_affiche') == 'code') |
|
| 133 | - ) { |
|
| 134 | - erreur_squelette(); |
|
| 135 | - } |
|
| 136 | - } |
|
| 137 | - |
|
| 138 | - return $nom ? $nom : false; |
|
| 46 | + $nom = calculer_nom_fonction_squel($squelette, $mime_type, $connect); |
|
| 47 | + |
|
| 48 | + // si deja en memoire (INCLURE a repetition) c'est bon. |
|
| 49 | + if (function_exists($nom)) { |
|
| 50 | + return $nom; |
|
| 51 | + } |
|
| 52 | + |
|
| 53 | + if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
|
| 54 | + $GLOBALS['debug_objets']['courant'] = $nom; |
|
| 55 | + } |
|
| 56 | + |
|
| 57 | + $phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php'; |
|
| 58 | + |
|
| 59 | + // si squelette est deja compile et perenne, le charger |
|
| 60 | + if (!squelette_obsolete($phpfile, $source)) { |
|
| 61 | + include_once $phpfile; |
|
| 62 | + #if (!squelette_obsolete($phpfile, $source) |
|
| 63 | + # AND lire_fichier ($phpfile, $skel_code, |
|
| 64 | + # array('critique' => 'oui', 'phpcheck' => 'oui'))){ |
|
| 65 | + ## eval('?'.'>'.$skel_code); |
|
| 66 | + # spip_log($skel_code, 'comp') |
|
| 67 | + #} |
|
| 68 | + } |
|
| 69 | + |
|
| 70 | + if (file_exists($lib = $squelette . '_fonctions' . '.php')) { |
|
| 71 | + include_once $lib; |
|
| 72 | + } |
|
| 73 | + |
|
| 74 | + // tester si le eval ci-dessus a mis le squelette en memoire |
|
| 75 | + |
|
| 76 | + if (function_exists($nom)) { |
|
| 77 | + return $nom; |
|
| 78 | + } |
|
| 79 | + |
|
| 80 | + // charger le source, si possible, et compiler |
|
| 81 | + $skel_code = ''; |
|
| 82 | + if (lire_fichier($source, $skel)) { |
|
| 83 | + $compiler = charger_fonction('compiler', 'public'); |
|
| 84 | + $skel_code = $compiler($skel, $nom, $gram, $source, $connect); |
|
| 85 | + } |
|
| 86 | + |
|
| 87 | + // Ne plus rien faire si le compilateur n'a pas pu operer. |
|
| 88 | + if (!$skel_code) { |
|
| 89 | + return false; |
|
| 90 | + } |
|
| 91 | + |
|
| 92 | + foreach ($skel_code as $id => $boucle) { |
|
| 93 | + $f = $boucle->return; |
|
| 94 | + try { |
|
| 95 | + eval("return true; $f ;"); |
|
| 96 | + } catch (\ParseError $e) { |
|
| 97 | + // Code syntaxiquement faux (critere etc mal programme') |
|
| 98 | + $msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage(); |
|
| 99 | + erreur_squelette($msg, $boucle); |
|
| 100 | + // continuer pour trouver d'autres fautes eventuelles |
|
| 101 | + // mais prevenir que c'est mort |
|
| 102 | + $nom = ''; |
|
| 103 | + } |
|
| 104 | + |
|
| 105 | + // Contexte de compil inutile a present |
|
| 106 | + // (mais la derniere valeur de $boucle est utilisee ci-dessous) |
|
| 107 | + $skel_code[$id] = $f; |
|
| 108 | + } |
|
| 109 | + |
|
| 110 | + $code = ''; |
|
| 111 | + if ($nom) { |
|
| 112 | + // Si le code est bon, concatener et mettre en cache |
|
| 113 | + if (function_exists($nom)) { |
|
| 114 | + $code = squelette_traduit($skel, $source, $phpfile, $skel_code); |
|
| 115 | + } else { |
|
| 116 | + // code semantiquement faux: bug du compilateur |
|
| 117 | + // $boucle est en fait ici la fct principale du squelette |
|
| 118 | + $msg = _T('zbug_erreur_compilation'); |
|
| 119 | + erreur_squelette($msg, $boucle); |
|
| 120 | + $nom = ''; |
|
| 121 | + } |
|
| 122 | + } |
|
| 123 | + |
|
| 124 | + if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
|
| 125 | + // Tracer ce qui vient d'etre compile |
|
| 126 | + $GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code; |
|
| 127 | + |
|
| 128 | + // si c'est ce que demande le debusqueur, lui passer la main |
|
| 129 | + if ( |
|
| 130 | + $GLOBALS['debug_objets']['sourcefile'] |
|
| 131 | + and (_request('var_mode_objet') == $nom) |
|
| 132 | + and (_request('var_mode_affiche') == 'code') |
|
| 133 | + ) { |
|
| 134 | + erreur_squelette(); |
|
| 135 | + } |
|
| 136 | + } |
|
| 137 | + |
|
| 138 | + return $nom ? $nom : false; |
|
| 139 | 139 | } |
| 140 | 140 | |
| 141 | 141 | function squelette_traduit($squelette, $sourcefile, $phpfile, $boucles) { |
| 142 | 142 | |
| 143 | - // Le dernier index est '' (fonction principale) |
|
| 144 | - $noms = substr(join(', ', array_keys($boucles)), 0, -2); |
|
| 145 | - if (CODE_COMMENTE) { |
|
| 146 | - $code = " |
|
| 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 | // https://code.spip.net/@squelette_obsolete |
| 165 | 165 | function squelette_obsolete($skel, $squelette) { |
| 166 | - static $date_change = null; |
|
| 167 | - // ne verifier la date de mes_fonctions et mes_options qu'une seule fois |
|
| 168 | - // par hit |
|
| 169 | - if (is_null($date_change)) { |
|
| 170 | - if (@file_exists($fonc = 'mes_fonctions.php')) { |
|
| 171 | - $date_change = @filemtime($fonc); |
|
| 172 | - } # compatibilite |
|
| 173 | - if (defined('_FILE_OPTIONS')) { |
|
| 174 | - $date_change = max($date_change, @filemtime(_FILE_OPTIONS)); |
|
| 175 | - } |
|
| 176 | - } |
|
| 177 | - |
|
| 178 | - return ( |
|
| 179 | - (defined('_VAR_MODE') and in_array(_VAR_MODE, ['recalcul', 'preview', 'debug'])) |
|
| 180 | - or !@file_exists($skel) |
|
| 181 | - or ((@file_exists($squelette) ? @filemtime($squelette) : 0) |
|
| 182 | - > ($date = @filemtime($skel))) |
|
| 183 | - or ($date_change > $date) |
|
| 184 | - ); |
|
| 166 | + static $date_change = null; |
|
| 167 | + // ne verifier la date de mes_fonctions et mes_options qu'une seule fois |
|
| 168 | + // par hit |
|
| 169 | + if (is_null($date_change)) { |
|
| 170 | + if (@file_exists($fonc = 'mes_fonctions.php')) { |
|
| 171 | + $date_change = @filemtime($fonc); |
|
| 172 | + } # compatibilite |
|
| 173 | + if (defined('_FILE_OPTIONS')) { |
|
| 174 | + $date_change = max($date_change, @filemtime(_FILE_OPTIONS)); |
|
| 175 | + } |
|
| 176 | + } |
|
| 177 | + |
|
| 178 | + return ( |
|
| 179 | + (defined('_VAR_MODE') and in_array(_VAR_MODE, ['recalcul', 'preview', 'debug'])) |
|
| 180 | + or !@file_exists($skel) |
|
| 181 | + or ((@file_exists($squelette) ? @filemtime($squelette) : 0) |
|
| 182 | + > ($date = @filemtime($skel))) |
|
| 183 | + or ($date_change > $date) |
|
| 184 | + ); |
|
| 185 | 185 | } |
| 186 | 186 | |
| 187 | 187 | // Activer l'invalideur de session |
| 188 | 188 | // https://code.spip.net/@invalideur_session |
| 189 | 189 | function invalideur_session(&$Cache, $code = null) { |
| 190 | - $Cache['session'] = spip_session(); |
|
| 190 | + $Cache['session'] = spip_session(); |
|
| 191 | 191 | |
| 192 | - return $code; |
|
| 192 | + return $code; |
|
| 193 | 193 | } |
| 194 | 194 | |
| 195 | 195 | |
| 196 | 196 | // https://code.spip.net/@analyse_resultat_skel |
| 197 | 197 | function analyse_resultat_skel($nom, $cache, $corps, $source = '') { |
| 198 | - static $filtres = []; |
|
| 199 | - $headers = []; |
|
| 200 | - |
|
| 201 | - // Recupere les < ?php header('Xx: y'); ? > pour $page['headers'] |
|
| 202 | - // note: on essaie d'attrapper aussi certains de ces entetes codes |
|
| 203 | - // "a la main" dans les squelettes, mais evidemment sans exhaustivite |
|
| 204 | - if ( |
|
| 205 | - stripos($corps, 'header') !== false |
|
| 206 | - and preg_match_all( |
|
| 207 | - '/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims', |
|
| 208 | - $corps, |
|
| 209 | - $regs, |
|
| 210 | - PREG_SET_ORDER |
|
| 211 | - ) |
|
| 212 | - ) { |
|
| 213 | - foreach ($regs as $r) { |
|
| 214 | - $corps = str_replace($r[0], '', $corps); |
|
| 215 | - # $j = Content-Type, et pas content-TYPE. |
|
| 216 | - $j = join('-', array_map('ucwords', explode('-', strtolower($r[2])))); |
|
| 217 | - |
|
| 218 | - if ($j == 'X-Spip-Filtre' and isset($headers[$j])) { |
|
| 219 | - $headers[$j] .= '|' . $r[3]; |
|
| 220 | - } else { |
|
| 221 | - $headers[$j] = $r[3]; |
|
| 222 | - } |
|
| 223 | - } |
|
| 224 | - } |
|
| 225 | - // S'agit-il d'un resultat constant ou contenant du code php |
|
| 226 | - $process_ins = ( |
|
| 227 | - strpos($corps, '<' . '?') === false |
|
| 228 | - or |
|
| 229 | - (strpos($corps, '<' . '?xml') !== false and |
|
| 230 | - strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) |
|
| 231 | - ) |
|
| 232 | - ? 'html' |
|
| 233 | - : 'php'; |
|
| 234 | - |
|
| 235 | - $skel = [ |
|
| 236 | - 'squelette' => $nom, |
|
| 237 | - 'source' => $source, |
|
| 238 | - 'process_ins' => $process_ins, |
|
| 239 | - 'invalideurs' => $cache, |
|
| 240 | - 'entetes' => $headers, |
|
| 241 | - 'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0 |
|
| 242 | - ]; |
|
| 243 | - |
|
| 244 | - // traiter #FILTRE{} et filtres |
|
| 245 | - if (!isset($filtres[$nom])) { |
|
| 246 | - $filtres[$nom] = pipeline('declarer_filtres_squelettes', ['args' => $skel, 'data' => []]); |
|
| 247 | - } |
|
| 248 | - $filtres_headers = []; |
|
| 249 | - if (isset($headers['X-Spip-Filtre']) and strlen($headers['X-Spip-Filtre'])) { |
|
| 250 | - $filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre'])); |
|
| 251 | - unset($headers['X-Spip-Filtre']); |
|
| 252 | - } |
|
| 253 | - if (count($filtres[$nom]) or count($filtres_headers)) { |
|
| 254 | - include_spip('public/sandbox'); |
|
| 255 | - $corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]); |
|
| 256 | - |
|
| 257 | - if ($process_ins == 'html') { |
|
| 258 | - $skel['process_ins'] = ( |
|
| 259 | - strpos($corps, '<' . '?') === false |
|
| 260 | - or |
|
| 261 | - (strpos($corps, '<' . '?xml') !== false and |
|
| 262 | - strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) |
|
| 263 | - ) |
|
| 264 | - ? 'html' |
|
| 265 | - : 'php'; |
|
| 266 | - } |
|
| 267 | - } |
|
| 268 | - |
|
| 269 | - $skel['entetes'] = $headers; |
|
| 270 | - $skel['texte'] = $corps; |
|
| 271 | - |
|
| 272 | - return $skel; |
|
| 198 | + static $filtres = []; |
|
| 199 | + $headers = []; |
|
| 200 | + |
|
| 201 | + // Recupere les < ?php header('Xx: y'); ? > pour $page['headers'] |
|
| 202 | + // note: on essaie d'attrapper aussi certains de ces entetes codes |
|
| 203 | + // "a la main" dans les squelettes, mais evidemment sans exhaustivite |
|
| 204 | + if ( |
|
| 205 | + stripos($corps, 'header') !== false |
|
| 206 | + and preg_match_all( |
|
| 207 | + '/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims', |
|
| 208 | + $corps, |
|
| 209 | + $regs, |
|
| 210 | + PREG_SET_ORDER |
|
| 211 | + ) |
|
| 212 | + ) { |
|
| 213 | + foreach ($regs as $r) { |
|
| 214 | + $corps = str_replace($r[0], '', $corps); |
|
| 215 | + # $j = Content-Type, et pas content-TYPE. |
|
| 216 | + $j = join('-', array_map('ucwords', explode('-', strtolower($r[2])))); |
|
| 217 | + |
|
| 218 | + if ($j == 'X-Spip-Filtre' and isset($headers[$j])) { |
|
| 219 | + $headers[$j] .= '|' . $r[3]; |
|
| 220 | + } else { |
|
| 221 | + $headers[$j] = $r[3]; |
|
| 222 | + } |
|
| 223 | + } |
|
| 224 | + } |
|
| 225 | + // S'agit-il d'un resultat constant ou contenant du code php |
|
| 226 | + $process_ins = ( |
|
| 227 | + strpos($corps, '<' . '?') === false |
|
| 228 | + or |
|
| 229 | + (strpos($corps, '<' . '?xml') !== false and |
|
| 230 | + strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) |
|
| 231 | + ) |
|
| 232 | + ? 'html' |
|
| 233 | + : 'php'; |
|
| 234 | + |
|
| 235 | + $skel = [ |
|
| 236 | + 'squelette' => $nom, |
|
| 237 | + 'source' => $source, |
|
| 238 | + 'process_ins' => $process_ins, |
|
| 239 | + 'invalideurs' => $cache, |
|
| 240 | + 'entetes' => $headers, |
|
| 241 | + 'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0 |
|
| 242 | + ]; |
|
| 243 | + |
|
| 244 | + // traiter #FILTRE{} et filtres |
|
| 245 | + if (!isset($filtres[$nom])) { |
|
| 246 | + $filtres[$nom] = pipeline('declarer_filtres_squelettes', ['args' => $skel, 'data' => []]); |
|
| 247 | + } |
|
| 248 | + $filtres_headers = []; |
|
| 249 | + if (isset($headers['X-Spip-Filtre']) and strlen($headers['X-Spip-Filtre'])) { |
|
| 250 | + $filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre'])); |
|
| 251 | + unset($headers['X-Spip-Filtre']); |
|
| 252 | + } |
|
| 253 | + if (count($filtres[$nom]) or count($filtres_headers)) { |
|
| 254 | + include_spip('public/sandbox'); |
|
| 255 | + $corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]); |
|
| 256 | + |
|
| 257 | + if ($process_ins == 'html') { |
|
| 258 | + $skel['process_ins'] = ( |
|
| 259 | + strpos($corps, '<' . '?') === false |
|
| 260 | + or |
|
| 261 | + (strpos($corps, '<' . '?xml') !== false and |
|
| 262 | + strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) |
|
| 263 | + ) |
|
| 264 | + ? 'html' |
|
| 265 | + : 'php'; |
|
| 266 | + } |
|
| 267 | + } |
|
| 268 | + |
|
| 269 | + $skel['entetes'] = $headers; |
|
| 270 | + $skel['texte'] = $corps; |
|
| 271 | + |
|
| 272 | + return $skel; |
|
| 273 | 273 | } |
| 274 | 274 | |
| 275 | 275 | // |
@@ -283,7 +283,7 @@ discard block |
||
| 283 | 283 | inserer_balise_dynamique(balise_%s_dyn(%s), array(%s)); |
| 284 | 284 | if ($lang_select) lang_select(); |
| 285 | 285 | ?' |
| 286 | - . '>'); |
|
| 286 | + . '>'); |
|
| 287 | 287 | |
| 288 | 288 | /** |
| 289 | 289 | * Synthétise une balise dynamique : crée l'appel à l'inclusion |
@@ -303,35 +303,35 @@ discard block |
||
| 303 | 303 | * Code PHP pour inclure le squelette de la balise dynamique |
| 304 | 304 | **/ |
| 305 | 305 | function synthetiser_balise_dynamique($nom, $args, $file, $context_compil) { |
| 306 | - if ( |
|
| 307 | - strncmp($file, '/', 1) !== 0 |
|
| 308 | - // pas de lien symbolique sous Windows |
|
| 309 | - and !(stristr(PHP_OS, 'WIN') and strpos($file, ':') !== false) |
|
| 310 | - ) { |
|
| 311 | - $file = './" . _DIR_RACINE . "' . $file; |
|
| 312 | - } |
|
| 313 | - |
|
| 314 | - $lang = $context_compil[4]; |
|
| 315 | - if (preg_match(',\W,', $lang)) { |
|
| 316 | - $lang = ''; |
|
| 317 | - } |
|
| 318 | - |
|
| 319 | - $args = array_map('argumenter_squelette', $args); |
|
| 320 | - if (!empty($context_compil['appel_php_depuis_modele'])) { |
|
| 321 | - $args[0] = 'arguments_balise_dyn_depuis_modele(' . $args[0] . ')'; |
|
| 322 | - } |
|
| 323 | - $args = join(', ', $args); |
|
| 324 | - |
|
| 325 | - $r = sprintf( |
|
| 326 | - CODE_INCLURE_BALISE, |
|
| 327 | - $file, |
|
| 328 | - $lang, |
|
| 329 | - $nom, |
|
| 330 | - $args, |
|
| 331 | - join(', ', array_map('_q', $context_compil)) |
|
| 332 | - ); |
|
| 333 | - |
|
| 334 | - return $r; |
|
| 306 | + if ( |
|
| 307 | + strncmp($file, '/', 1) !== 0 |
|
| 308 | + // pas de lien symbolique sous Windows |
|
| 309 | + and !(stristr(PHP_OS, 'WIN') and strpos($file, ':') !== false) |
|
| 310 | + ) { |
|
| 311 | + $file = './" . _DIR_RACINE . "' . $file; |
|
| 312 | + } |
|
| 313 | + |
|
| 314 | + $lang = $context_compil[4]; |
|
| 315 | + if (preg_match(',\W,', $lang)) { |
|
| 316 | + $lang = ''; |
|
| 317 | + } |
|
| 318 | + |
|
| 319 | + $args = array_map('argumenter_squelette', $args); |
|
| 320 | + if (!empty($context_compil['appel_php_depuis_modele'])) { |
|
| 321 | + $args[0] = 'arguments_balise_dyn_depuis_modele(' . $args[0] . ')'; |
|
| 322 | + } |
|
| 323 | + $args = join(', ', $args); |
|
| 324 | + |
|
| 325 | + $r = sprintf( |
|
| 326 | + CODE_INCLURE_BALISE, |
|
| 327 | + $file, |
|
| 328 | + $lang, |
|
| 329 | + $nom, |
|
| 330 | + $args, |
|
| 331 | + join(', ', array_map('_q', $context_compil)) |
|
| 332 | + ); |
|
| 333 | + |
|
| 334 | + return $r; |
|
| 335 | 335 | } |
| 336 | 336 | |
| 337 | 337 | /** |
@@ -349,18 +349,18 @@ discard block |
||
| 349 | 349 | **/ |
| 350 | 350 | function argumenter_squelette($v) { |
| 351 | 351 | |
| 352 | - if (is_object($v)) { |
|
| 353 | - return var_export($v, true); |
|
| 354 | - } elseif (!is_array($v)) { |
|
| 355 | - return "'" . texte_script($v) . "'"; |
|
| 356 | - } else { |
|
| 357 | - $out = []; |
|
| 358 | - foreach ($v as $k => $val) { |
|
| 359 | - $out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val); |
|
| 360 | - } |
|
| 361 | - |
|
| 362 | - return 'array(' . join(', ', $out) . ')'; |
|
| 363 | - } |
|
| 352 | + if (is_object($v)) { |
|
| 353 | + return var_export($v, true); |
|
| 354 | + } elseif (!is_array($v)) { |
|
| 355 | + return "'" . texte_script($v) . "'"; |
|
| 356 | + } else { |
|
| 357 | + $out = []; |
|
| 358 | + foreach ($v as $k => $val) { |
|
| 359 | + $out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val); |
|
| 360 | + } |
|
| 361 | + |
|
| 362 | + return 'array(' . join(', ', $out) . ')'; |
|
| 363 | + } |
|
| 364 | 364 | } |
| 365 | 365 | |
| 366 | 366 | |
@@ -391,87 +391,87 @@ discard block |
||
| 391 | 391 | * Code PHP d'exécutant l'inclusion du squelette (ou texte) de la balise dynamique |
| 392 | 392 | **/ |
| 393 | 393 | function executer_balise_dynamique($nom, $args, $context_compil) { |
| 394 | - /** @var string Nom de la balise à charger (balise demandée ou balise générique) */ |
|
| 395 | - $nom_balise = $nom; |
|
| 396 | - /** @var string Nom de la balise générique (si utilisée) */ |
|
| 397 | - $nom_balise_generique = ''; |
|
| 398 | - |
|
| 399 | - $appel_php_depuis_modele = false; |
|
| 400 | - if ( |
|
| 401 | - is_array($context_compil) |
|
| 402 | - and !is_numeric($context_compil[3]) |
|
| 403 | - and empty($context_compil[0]) |
|
| 404 | - and empty($context_compil[1]) |
|
| 405 | - and empty($context_compil[2]) |
|
| 406 | - and empty($context_compil[3]) |
|
| 407 | - ) { |
|
| 408 | - $appel_php_depuis_modele = true; |
|
| 409 | - } |
|
| 410 | - |
|
| 411 | - if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) { |
|
| 412 | - // Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article') |
|
| 413 | - if ($balise_generique = chercher_balise_generique($nom)) { |
|
| 414 | - // injecter en premier arg le nom de la balise |
|
| 415 | - array_unshift($args, $nom); |
|
| 416 | - $nom_balise_generique = $balise_generique['nom_generique']; |
|
| 417 | - $fonction_balise = $balise_generique['fonction_generique']; |
|
| 418 | - $nom_balise = $nom_balise_generique; |
|
| 419 | - } |
|
| 420 | - unset($balise_generique); |
|
| 421 | - } |
|
| 422 | - |
|
| 423 | - if (!$fonction_balise) { |
|
| 424 | - $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]]; |
|
| 425 | - erreur_squelette($msg, $context_compil); |
|
| 426 | - |
|
| 427 | - return ''; |
|
| 428 | - } |
|
| 429 | - |
|
| 430 | - // retrouver le fichier qui a déclaré la fonction |
|
| 431 | - // même si la fonction dynamique est déclarée dans un fichier de fonctions. |
|
| 432 | - // Attention sous windows, getFileName() retourne un antislash. |
|
| 433 | - $reflector = new ReflectionFunction($fonction_balise); |
|
| 434 | - $file = str_replace('\\', '/', $reflector->getFileName()); |
|
| 435 | - if (strncmp($file, str_replace('\\', '/', _ROOT_RACINE), strlen(_ROOT_RACINE)) === 0) { |
|
| 436 | - $file = substr($file, strlen(_ROOT_RACINE)); |
|
| 437 | - } |
|
| 438 | - |
|
| 439 | - // Y a-t-il une fonction de traitement des arguments ? |
|
| 440 | - $f = 'balise_' . $nom_balise . '_stat'; |
|
| 441 | - |
|
| 442 | - $r = !function_exists($f) ? $args : $f($args, $context_compil); |
|
| 443 | - |
|
| 444 | - if (!is_array($r)) { |
|
| 445 | - return $r; |
|
| 446 | - } |
|
| 447 | - |
|
| 448 | - // verifier que la fonction dyn est la, |
|
| 449 | - // sinon se replier sur la generique si elle existe |
|
| 450 | - if (!function_exists('balise_' . $nom_balise . '_dyn')) { |
|
| 451 | - if ( |
|
| 452 | - $balise_generique = chercher_balise_generique($nom) |
|
| 453 | - and $nom_balise_generique = $balise_generique['nom_generique'] |
|
| 454 | - and $file = include_spip('balise/' . strtolower($nom_balise_generique)) |
|
| 455 | - and function_exists('balise_' . $nom_balise_generique . '_dyn') |
|
| 456 | - ) { |
|
| 457 | - // et lui injecter en premier arg le nom de la balise |
|
| 458 | - array_unshift($r, $nom); |
|
| 459 | - $nom_balise = $nom_balise_generique; |
|
| 460 | - if (!_DIR_RESTREINT) { |
|
| 461 | - $file = _DIR_RESTREINT_ABS . $file; |
|
| 462 | - } |
|
| 463 | - } else { |
|
| 464 | - $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]]; |
|
| 465 | - erreur_squelette($msg, $context_compil); |
|
| 466 | - |
|
| 467 | - return ''; |
|
| 468 | - } |
|
| 469 | - } |
|
| 470 | - |
|
| 471 | - if ($appel_php_depuis_modele) { |
|
| 472 | - $context_compil['appel_php_depuis_modele'] = true; |
|
| 473 | - } |
|
| 474 | - return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil); |
|
| 394 | + /** @var string Nom de la balise à charger (balise demandée ou balise générique) */ |
|
| 395 | + $nom_balise = $nom; |
|
| 396 | + /** @var string Nom de la balise générique (si utilisée) */ |
|
| 397 | + $nom_balise_generique = ''; |
|
| 398 | + |
|
| 399 | + $appel_php_depuis_modele = false; |
|
| 400 | + if ( |
|
| 401 | + is_array($context_compil) |
|
| 402 | + and !is_numeric($context_compil[3]) |
|
| 403 | + and empty($context_compil[0]) |
|
| 404 | + and empty($context_compil[1]) |
|
| 405 | + and empty($context_compil[2]) |
|
| 406 | + and empty($context_compil[3]) |
|
| 407 | + ) { |
|
| 408 | + $appel_php_depuis_modele = true; |
|
| 409 | + } |
|
| 410 | + |
|
| 411 | + if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) { |
|
| 412 | + // Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article') |
|
| 413 | + if ($balise_generique = chercher_balise_generique($nom)) { |
|
| 414 | + // injecter en premier arg le nom de la balise |
|
| 415 | + array_unshift($args, $nom); |
|
| 416 | + $nom_balise_generique = $balise_generique['nom_generique']; |
|
| 417 | + $fonction_balise = $balise_generique['fonction_generique']; |
|
| 418 | + $nom_balise = $nom_balise_generique; |
|
| 419 | + } |
|
| 420 | + unset($balise_generique); |
|
| 421 | + } |
|
| 422 | + |
|
| 423 | + if (!$fonction_balise) { |
|
| 424 | + $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]]; |
|
| 425 | + erreur_squelette($msg, $context_compil); |
|
| 426 | + |
|
| 427 | + return ''; |
|
| 428 | + } |
|
| 429 | + |
|
| 430 | + // retrouver le fichier qui a déclaré la fonction |
|
| 431 | + // même si la fonction dynamique est déclarée dans un fichier de fonctions. |
|
| 432 | + // Attention sous windows, getFileName() retourne un antislash. |
|
| 433 | + $reflector = new ReflectionFunction($fonction_balise); |
|
| 434 | + $file = str_replace('\\', '/', $reflector->getFileName()); |
|
| 435 | + if (strncmp($file, str_replace('\\', '/', _ROOT_RACINE), strlen(_ROOT_RACINE)) === 0) { |
|
| 436 | + $file = substr($file, strlen(_ROOT_RACINE)); |
|
| 437 | + } |
|
| 438 | + |
|
| 439 | + // Y a-t-il une fonction de traitement des arguments ? |
|
| 440 | + $f = 'balise_' . $nom_balise . '_stat'; |
|
| 441 | + |
|
| 442 | + $r = !function_exists($f) ? $args : $f($args, $context_compil); |
|
| 443 | + |
|
| 444 | + if (!is_array($r)) { |
|
| 445 | + return $r; |
|
| 446 | + } |
|
| 447 | + |
|
| 448 | + // verifier que la fonction dyn est la, |
|
| 449 | + // sinon se replier sur la generique si elle existe |
|
| 450 | + if (!function_exists('balise_' . $nom_balise . '_dyn')) { |
|
| 451 | + if ( |
|
| 452 | + $balise_generique = chercher_balise_generique($nom) |
|
| 453 | + and $nom_balise_generique = $balise_generique['nom_generique'] |
|
| 454 | + and $file = include_spip('balise/' . strtolower($nom_balise_generique)) |
|
| 455 | + and function_exists('balise_' . $nom_balise_generique . '_dyn') |
|
| 456 | + ) { |
|
| 457 | + // et lui injecter en premier arg le nom de la balise |
|
| 458 | + array_unshift($r, $nom); |
|
| 459 | + $nom_balise = $nom_balise_generique; |
|
| 460 | + if (!_DIR_RESTREINT) { |
|
| 461 | + $file = _DIR_RESTREINT_ABS . $file; |
|
| 462 | + } |
|
| 463 | + } else { |
|
| 464 | + $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]]; |
|
| 465 | + erreur_squelette($msg, $context_compil); |
|
| 466 | + |
|
| 467 | + return ''; |
|
| 468 | + } |
|
| 469 | + } |
|
| 470 | + |
|
| 471 | + if ($appel_php_depuis_modele) { |
|
| 472 | + $context_compil['appel_php_depuis_modele'] = true; |
|
| 473 | + } |
|
| 474 | + return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil); |
|
| 475 | 475 | } |
| 476 | 476 | |
| 477 | 477 | /** |
@@ -486,23 +486,23 @@ discard block |
||
| 486 | 486 | * @return array|null |
| 487 | 487 | */ |
| 488 | 488 | function chercher_balise_generique($nom) { |
| 489 | - if (false === strpos($nom, '_')) { |
|
| 490 | - return null; |
|
| 491 | - } |
|
| 492 | - $nom_generique = $nom; |
|
| 493 | - while (false !== ($p = strrpos($nom_generique, '_'))) { |
|
| 494 | - $nom_generique = substr($nom_generique, 0, $p + 1); |
|
| 495 | - $fonction_generique = charger_fonction($nom_generique, 'balise', true); |
|
| 496 | - if ($fonction_generique) { |
|
| 497 | - return [ |
|
| 498 | - 'nom' => $nom, |
|
| 499 | - 'nom_generique' => $nom_generique, |
|
| 500 | - 'fonction_generique' => $fonction_generique, |
|
| 501 | - ]; |
|
| 502 | - } |
|
| 503 | - $nom_generique = substr($nom_generique, 0, -1); |
|
| 504 | - } |
|
| 505 | - return null; |
|
| 489 | + if (false === strpos($nom, '_')) { |
|
| 490 | + return null; |
|
| 491 | + } |
|
| 492 | + $nom_generique = $nom; |
|
| 493 | + while (false !== ($p = strrpos($nom_generique, '_'))) { |
|
| 494 | + $nom_generique = substr($nom_generique, 0, $p + 1); |
|
| 495 | + $fonction_generique = charger_fonction($nom_generique, 'balise', true); |
|
| 496 | + if ($fonction_generique) { |
|
| 497 | + return [ |
|
| 498 | + 'nom' => $nom, |
|
| 499 | + 'nom_generique' => $nom_generique, |
|
| 500 | + 'fonction_generique' => $fonction_generique, |
|
| 501 | + ]; |
|
| 502 | + } |
|
| 503 | + $nom_generique = substr($nom_generique, 0, -1); |
|
| 504 | + } |
|
| 505 | + return null; |
|
| 506 | 506 | } |
| 507 | 507 | |
| 508 | 508 | |
@@ -526,29 +526,29 @@ discard block |
||
| 526 | 526 | * @return null; |
| 527 | 527 | **/ |
| 528 | 528 | function lang_select_public($lang, $lang_select, $titre = null) { |
| 529 | - // Cas 1. forcer_lang = true et pas de critere {lang_select} |
|
| 530 | - if ( |
|
| 531 | - isset($GLOBALS['forcer_lang']) and $GLOBALS['forcer_lang'] |
|
| 532 | - and $lang_select !== 'oui' |
|
| 533 | - ) { |
|
| 534 | - $lang = $GLOBALS['spip_lang']; |
|
| 535 | - } // Cas 2. l'objet n'a pas de langue definie (ou definie a '') |
|
| 536 | - elseif (!strlen($lang)) { |
|
| 537 | - $lang = $GLOBALS['spip_lang']; |
|
| 538 | - } // Cas 3. l'objet est multilingue ! |
|
| 539 | - elseif ( |
|
| 540 | - $lang_select !== 'oui' |
|
| 541 | - and strlen($titre) > 10 |
|
| 542 | - and strpos($titre, '<multi>') !== false |
|
| 543 | - and strpos(echappe_html($titre), '<multi>') !== false |
|
| 544 | - ) { |
|
| 545 | - $lang = $GLOBALS['spip_lang']; |
|
| 546 | - } |
|
| 547 | - |
|
| 548 | - // faire un lang_select() eventuellement sur la langue inchangee |
|
| 549 | - lang_select($lang); |
|
| 550 | - |
|
| 551 | - return; |
|
| 529 | + // Cas 1. forcer_lang = true et pas de critere {lang_select} |
|
| 530 | + if ( |
|
| 531 | + isset($GLOBALS['forcer_lang']) and $GLOBALS['forcer_lang'] |
|
| 532 | + and $lang_select !== 'oui' |
|
| 533 | + ) { |
|
| 534 | + $lang = $GLOBALS['spip_lang']; |
|
| 535 | + } // Cas 2. l'objet n'a pas de langue definie (ou definie a '') |
|
| 536 | + elseif (!strlen($lang)) { |
|
| 537 | + $lang = $GLOBALS['spip_lang']; |
|
| 538 | + } // Cas 3. l'objet est multilingue ! |
|
| 539 | + elseif ( |
|
| 540 | + $lang_select !== 'oui' |
|
| 541 | + and strlen($titre) > 10 |
|
| 542 | + and strpos($titre, '<multi>') !== false |
|
| 543 | + and strpos(echappe_html($titre), '<multi>') !== false |
|
| 544 | + ) { |
|
| 545 | + $lang = $GLOBALS['spip_lang']; |
|
| 546 | + } |
|
| 547 | + |
|
| 548 | + // faire un lang_select() eventuellement sur la langue inchangee |
|
| 549 | + lang_select($lang); |
|
| 550 | + |
|
| 551 | + return; |
|
| 552 | 552 | } |
| 553 | 553 | |
| 554 | 554 | |
@@ -556,21 +556,21 @@ discard block |
||
| 556 | 556 | // il faut le nettoyer car il pourrait etre injecte en SQL |
| 557 | 557 | // https://code.spip.net/@nettoyer_env_doublons |
| 558 | 558 | function nettoyer_env_doublons($envd) { |
| 559 | - foreach ($envd as $table => $liste) { |
|
| 560 | - $n = ''; |
|
| 561 | - foreach (explode(',', $liste) as $val) { |
|
| 562 | - if ($a = intval($val) and $val === strval($a)) { |
|
| 563 | - $n .= ',' . $val; |
|
| 564 | - } |
|
| 565 | - } |
|
| 566 | - if (strlen($n)) { |
|
| 567 | - $envd[$table] = $n; |
|
| 568 | - } else { |
|
| 569 | - unset($envd[$table]); |
|
| 570 | - } |
|
| 571 | - } |
|
| 572 | - |
|
| 573 | - return $envd; |
|
| 559 | + foreach ($envd as $table => $liste) { |
|
| 560 | + $n = ''; |
|
| 561 | + foreach (explode(',', $liste) as $val) { |
|
| 562 | + if ($a = intval($val) and $val === strval($a)) { |
|
| 563 | + $n .= ',' . $val; |
|
| 564 | + } |
|
| 565 | + } |
|
| 566 | + if (strlen($n)) { |
|
| 567 | + $envd[$table] = $n; |
|
| 568 | + } else { |
|
| 569 | + unset($envd[$table]); |
|
| 570 | + } |
|
| 571 | + } |
|
| 572 | + |
|
| 573 | + return $envd; |
|
| 574 | 574 | } |
| 575 | 575 | |
| 576 | 576 | /** |
@@ -589,21 +589,21 @@ discard block |
||
| 589 | 589 | * Opérateur trouvé (SELF ou SUBSELECT) sinon false. |
| 590 | 590 | **/ |
| 591 | 591 | function match_self($w) { |
| 592 | - if (is_string($w)) { |
|
| 593 | - return false; |
|
| 594 | - } |
|
| 595 | - if (is_array($w)) { |
|
| 596 | - if (in_array(reset($w), ['SELF', 'SUBSELECT'])) { |
|
| 597 | - return $w; |
|
| 598 | - } |
|
| 599 | - foreach (array_filter($w, 'is_array') as $sw) { |
|
| 600 | - if ($m = match_self($sw)) { |
|
| 601 | - return $m; |
|
| 602 | - } |
|
| 603 | - } |
|
| 604 | - } |
|
| 605 | - |
|
| 606 | - return false; |
|
| 592 | + if (is_string($w)) { |
|
| 593 | + return false; |
|
| 594 | + } |
|
| 595 | + if (is_array($w)) { |
|
| 596 | + if (in_array(reset($w), ['SELF', 'SUBSELECT'])) { |
|
| 597 | + return $w; |
|
| 598 | + } |
|
| 599 | + foreach (array_filter($w, 'is_array') as $sw) { |
|
| 600 | + if ($m = match_self($sw)) { |
|
| 601 | + return $m; |
|
| 602 | + } |
|
| 603 | + } |
|
| 604 | + } |
|
| 605 | + |
|
| 606 | + return false; |
|
| 607 | 607 | } |
| 608 | 608 | |
| 609 | 609 | /** |
@@ -619,16 +619,16 @@ discard block |
||
| 619 | 619 | * est remplacée par son code. |
| 620 | 620 | **/ |
| 621 | 621 | function remplace_sous_requete($w, $sousrequete) { |
| 622 | - if (is_array($w)) { |
|
| 623 | - if (in_array(reset($w), ['SELF', 'SUBSELECT'])) { |
|
| 624 | - return $sousrequete; |
|
| 625 | - } |
|
| 626 | - foreach ($w as $k => $sw) { |
|
| 627 | - $w[$k] = remplace_sous_requete($sw, $sousrequete); |
|
| 628 | - } |
|
| 629 | - } |
|
| 630 | - |
|
| 631 | - return $w; |
|
| 622 | + if (is_array($w)) { |
|
| 623 | + if (in_array(reset($w), ['SELF', 'SUBSELECT'])) { |
|
| 624 | + return $sousrequete; |
|
| 625 | + } |
|
| 626 | + foreach ($w as $k => $sw) { |
|
| 627 | + $w[$k] = remplace_sous_requete($sw, $sousrequete); |
|
| 628 | + } |
|
| 629 | + } |
|
| 630 | + |
|
| 631 | + return $w; |
|
| 632 | 632 | } |
| 633 | 633 | |
| 634 | 634 | /** |
@@ -642,17 +642,17 @@ discard block |
||
| 642 | 642 | * - Conditions avec des sous requêtes |
| 643 | 643 | **/ |
| 644 | 644 | function trouver_sous_requetes($where) { |
| 645 | - $where_simples = []; |
|
| 646 | - $where_sous = []; |
|
| 647 | - foreach ($where as $k => $w) { |
|
| 648 | - if (match_self($w)) { |
|
| 649 | - $where_sous[$k] = $w; |
|
| 650 | - } else { |
|
| 651 | - $where_simples[$k] = $w; |
|
| 652 | - } |
|
| 653 | - } |
|
| 654 | - |
|
| 655 | - return [$where_simples, $where_sous]; |
|
| 645 | + $where_simples = []; |
|
| 646 | + $where_sous = []; |
|
| 647 | + foreach ($where as $k => $w) { |
|
| 648 | + if (match_self($w)) { |
|
| 649 | + $where_sous[$k] = $w; |
|
| 650 | + } else { |
|
| 651 | + $where_simples[$k] = $w; |
|
| 652 | + } |
|
| 653 | + } |
|
| 654 | + |
|
| 655 | + return [$where_simples, $where_sous]; |
|
| 656 | 656 | } |
| 657 | 657 | |
| 658 | 658 | |
@@ -678,292 +678,292 @@ discard block |
||
| 678 | 678 | * @return resource |
| 679 | 679 | */ |
| 680 | 680 | function calculer_select( |
| 681 | - $select = [], |
|
| 682 | - $from = [], |
|
| 683 | - $from_type = [], |
|
| 684 | - $where = [], |
|
| 685 | - $join = [], |
|
| 686 | - $groupby = [], |
|
| 687 | - $orderby = [], |
|
| 688 | - $limit = '', |
|
| 689 | - $having = [], |
|
| 690 | - $table = '', |
|
| 691 | - $id = '', |
|
| 692 | - $serveur = '', |
|
| 693 | - $requeter = true |
|
| 681 | + $select = [], |
|
| 682 | + $from = [], |
|
| 683 | + $from_type = [], |
|
| 684 | + $where = [], |
|
| 685 | + $join = [], |
|
| 686 | + $groupby = [], |
|
| 687 | + $orderby = [], |
|
| 688 | + $limit = '', |
|
| 689 | + $having = [], |
|
| 690 | + $table = '', |
|
| 691 | + $id = '', |
|
| 692 | + $serveur = '', |
|
| 693 | + $requeter = true |
|
| 694 | 694 | ) { |
| 695 | 695 | |
| 696 | - // retirer les criteres vides: |
|
| 697 | - // {X ?} avec X absent de l'URL |
|
| 698 | - // {par #ENV{X}} avec X absent de l'URL |
|
| 699 | - // IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil) |
|
| 700 | - $menage = false; |
|
| 701 | - foreach ($where as $k => $v) { |
|
| 702 | - if (is_array($v)) { |
|
| 703 | - if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) { |
|
| 704 | - $op = false; |
|
| 705 | - } elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) { |
|
| 706 | - $op = false; |
|
| 707 | - } else { |
|
| 708 | - $op = $v[0] ? $v[0] : $v; |
|
| 709 | - } |
|
| 710 | - } else { |
|
| 711 | - $op = $v; |
|
| 712 | - } |
|
| 713 | - if ((!$op) or ($op == 1) or ($op == '0=0')) { |
|
| 714 | - unset($where[$k]); |
|
| 715 | - $menage = true; |
|
| 716 | - } |
|
| 717 | - } |
|
| 718 | - |
|
| 719 | - // evacuer les eventuels groupby vide issus d'un calcul dynamique |
|
| 720 | - $groupby = array_diff($groupby, ['']); |
|
| 721 | - |
|
| 722 | - // remplacer les sous requetes recursives au calcul |
|
| 723 | - list($where_simples, $where_sous) = trouver_sous_requetes($where); |
|
| 724 | - foreach ($where_sous as $k => $w) { |
|
| 725 | - $menage = true; |
|
| 726 | - // on recupere la sous requete |
|
| 727 | - $sous = match_self($w); |
|
| 728 | - if ($sous[0] == 'SELF') { |
|
| 729 | - // c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where) |
|
| 730 | - array_push($where_simples, $sous[2]); |
|
| 731 | - $wheresub = [ |
|
| 732 | - $sous[2], |
|
| 733 | - '0=0' |
|
| 734 | - ]; // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where |
|
| 735 | - $jsub = $join; |
|
| 736 | - // trouver les jointures utiles a |
|
| 737 | - // reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees |
|
| 738 | - // ie L1.objet='article' |
|
| 739 | - // on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction |
|
| 740 | - $i = 0; |
|
| 741 | - do { |
|
| 742 | - $where[$k] = remplace_sous_requete($w, '(' . calculer_select( |
|
| 743 | - [$sous[1] . ' AS id'], |
|
| 744 | - $from, |
|
| 745 | - $from_type, |
|
| 746 | - $wheresub, |
|
| 747 | - $jsub, |
|
| 748 | - [], |
|
| 749 | - [], |
|
| 750 | - '', |
|
| 751 | - $having, |
|
| 752 | - $table, |
|
| 753 | - $id, |
|
| 754 | - $serveur, |
|
| 755 | - false |
|
| 756 | - ) . ')'); |
|
| 757 | - if (!$i) { |
|
| 758 | - $i = 1; |
|
| 759 | - $wherestring = calculer_where_to_string($where[$k]); |
|
| 760 | - foreach ($join as $cle => $wj) { |
|
| 761 | - if ( |
|
| 762 | - count($wj) == 4 |
|
| 763 | - and strpos($wherestring, "{$cle}.") !== false |
|
| 764 | - ) { |
|
| 765 | - $i = 0; |
|
| 766 | - $wheresub[] = $wj[3]; |
|
| 767 | - unset($jsub[$cle][3]); |
|
| 768 | - } |
|
| 769 | - } |
|
| 770 | - } |
|
| 771 | - } while ($i++ < 1); |
|
| 772 | - } |
|
| 773 | - if ($sous[0] == 'SUBSELECT') { |
|
| 774 | - // c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having) |
|
| 775 | - array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ? |
|
| 776 | - $where[$k] = remplace_sous_requete($w, '(' . calculer_select( |
|
| 777 | - $sous[1], # select |
|
| 778 | - $sous[2], #from |
|
| 779 | - [], #from_type |
|
| 780 | - $sous[3] ? (is_array($sous[3]) ? $sous[3] : [$sous[3]]) : [], |
|
| 781 | - #where, qui peut etre de la forme string comme dans sql_select |
|
| 782 | - [], #join |
|
| 783 | - $sous[4] ? $sous[4] : [], #groupby |
|
| 784 | - $sous[5] ? $sous[5] : [], #orderby |
|
| 785 | - $sous[6], #limit |
|
| 786 | - $sous[7] ? $sous[7] : [], #having |
|
| 787 | - $table, |
|
| 788 | - $id, |
|
| 789 | - $serveur, |
|
| 790 | - false |
|
| 791 | - ) . ')'); |
|
| 792 | - } |
|
| 793 | - array_pop($where_simples); |
|
| 794 | - } |
|
| 795 | - |
|
| 796 | - foreach ($having as $k => $v) { |
|
| 797 | - if ((!$v) or ($v == 1) or ($v == '0=0')) { |
|
| 798 | - unset($having[$k]); |
|
| 799 | - } |
|
| 800 | - } |
|
| 801 | - |
|
| 802 | - // Installer les jointures. |
|
| 803 | - // Retirer celles seulement utiles aux criteres finalement absents mais |
|
| 804 | - // parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln |
|
| 805 | - // si elle est seulement utile a Ln+1 elle meme inutile |
|
| 806 | - |
|
| 807 | - $afrom = []; |
|
| 808 | - $equiv = []; |
|
| 809 | - $k = count($join); |
|
| 810 | - foreach (array_reverse($join, true) as $cledef => $j) { |
|
| 811 | - $cle = $cledef; |
|
| 812 | - // le format de join est : |
|
| 813 | - // array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]]) |
|
| 814 | - $join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber |
|
| 815 | - if (count($join[$cle]) == 2) { |
|
| 816 | - $join[$cle][] = $join[$cle][1]; |
|
| 817 | - } |
|
| 818 | - if (count($join[$cle]) == 3) { |
|
| 819 | - $join[$cle][] = ''; |
|
| 820 | - } |
|
| 821 | - list($t, $c, $carr, $and) = $join[$cle]; |
|
| 822 | - // si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste |
|
| 823 | - // pour compat avec ancienne convention |
|
| 824 | - if (is_numeric($cle)) { |
|
| 825 | - $cle = "L$k"; |
|
| 826 | - } |
|
| 827 | - $cle_where_lie = "JOIN-$cle"; |
|
| 828 | - if ( |
|
| 829 | - !$menage |
|
| 830 | - or isset($afrom[$cle]) |
|
| 831 | - or calculer_jointnul($cle, $select) |
|
| 832 | - or calculer_jointnul($cle, array_diff_key($join, [$cle => $join[$cle]])) |
|
| 833 | - or calculer_jointnul($cle, $having) |
|
| 834 | - or calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => ''])) |
|
| 835 | - ) { |
|
| 836 | - // corriger les references non explicites dans select |
|
| 837 | - // ou groupby |
|
| 838 | - foreach ($select as $i => $s) { |
|
| 839 | - if ($s == $c) { |
|
| 840 | - $select[$i] = "$cle.$c AS $c"; |
|
| 841 | - break; |
|
| 842 | - } |
|
| 843 | - } |
|
| 844 | - foreach ($groupby as $i => $g) { |
|
| 845 | - if ($g == $c) { |
|
| 846 | - $groupby[$i] = "$cle.$c"; |
|
| 847 | - break; |
|
| 848 | - } |
|
| 849 | - } |
|
| 850 | - // on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin |
|
| 851 | - // sans recours a preg_match |
|
| 852 | - // un implode(' ',..) est fait dans reinjecte_joint un peu plus bas |
|
| 853 | - $afrom[$t][$cle] = [ |
|
| 854 | - "\n" . |
|
| 855 | - (isset($from_type[$cle]) ? $from_type[$cle] : 'INNER') . ' JOIN', |
|
| 856 | - $from[$cle], |
|
| 857 | - "AS $cle", |
|
| 858 | - 'ON (', |
|
| 859 | - "$cle.$c", |
|
| 860 | - '=', |
|
| 861 | - "$t.$carr", |
|
| 862 | - ($and ? 'AND ' . $and : '') . |
|
| 863 | - ')' |
|
| 864 | - ]; |
|
| 865 | - if (isset($afrom[$cle])) { |
|
| 866 | - $afrom[$t] = $afrom[$t] + $afrom[$cle]; |
|
| 867 | - unset($afrom[$cle]); |
|
| 868 | - } |
|
| 869 | - $equiv[] = $carr; |
|
| 870 | - } else { |
|
| 871 | - unset($join[$cledef]); |
|
| 872 | - if (isset($where_simples[$cle_where_lie])) { |
|
| 873 | - unset($where_simples[$cle_where_lie]); |
|
| 874 | - unset($where[$cle_where_lie]); |
|
| 875 | - } |
|
| 876 | - } |
|
| 877 | - unset($from[$cle]); |
|
| 878 | - $k--; |
|
| 879 | - } |
|
| 880 | - |
|
| 881 | - if (count($afrom)) { |
|
| 882 | - // Regarder si la table principale ne sert finalement a rien comme dans |
|
| 883 | - //<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3> |
|
| 884 | - //<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2> |
|
| 885 | - //<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5> |
|
| 886 | - // ou dans |
|
| 887 | - //<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8> |
|
| 888 | - // qui comporte plusieurs jointures |
|
| 889 | - // ou dans |
|
| 890 | - // <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6> |
|
| 891 | - // <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7> |
|
| 892 | - // penser a regarder aussi la clause orderby pour ne pas simplifier abusivement |
|
| 893 | - // <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9> |
|
| 894 | - // penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement |
|
| 895 | - // <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10> |
|
| 896 | - |
|
| 897 | - $t = key($from); |
|
| 898 | - $c = current($from); |
|
| 899 | - reset($from); |
|
| 900 | - $e = '/\b(' . "$t\\." . join('|' . $t . '\.', $equiv) . ')\b/'; |
|
| 901 | - if ( |
|
| 902 | - !(strpos($t, ' ') or // jointure des le depart cf boucle_doc |
|
| 903 | - calculer_jointnul($t, $select, $e) or |
|
| 904 | - calculer_jointnul($t, $join, $e) or |
|
| 905 | - calculer_jointnul($t, $where, $e) or |
|
| 906 | - calculer_jointnul($t, $orderby, $e) or |
|
| 907 | - calculer_jointnul($t, $groupby, $e) or |
|
| 908 | - calculer_jointnul($t, $having, $e)) |
|
| 909 | - && count($afrom[$t]) |
|
| 910 | - ) { |
|
| 911 | - $nfrom = reset($afrom[$t]); |
|
| 912 | - $nt = key($afrom[$t]); |
|
| 913 | - unset($from[$t]); |
|
| 914 | - $from[$nt] = $nfrom[1]; |
|
| 915 | - unset($afrom[$t][$nt]); |
|
| 916 | - $afrom[$nt] = $afrom[$t]; |
|
| 917 | - unset($afrom[$t]); |
|
| 918 | - $e = '/\b' . preg_quote($nfrom[6]) . '\b/'; |
|
| 919 | - $t = $nfrom[4]; |
|
| 920 | - $alias = ''; |
|
| 921 | - // verifier que les deux cles sont homonymes, sinon installer un alias dans le select |
|
| 922 | - $oldcle = explode('.', $nfrom[6]); |
|
| 923 | - $oldcle = end($oldcle); |
|
| 924 | - $newcle = explode('.', $nfrom[4]); |
|
| 925 | - $newcle = end($newcle); |
|
| 926 | - if ($newcle != $oldcle) { |
|
| 927 | - // si l'ancienne cle etait deja dans le select avec un AS |
|
| 928 | - // reprendre simplement ce AS |
|
| 929 | - $as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/'; |
|
| 930 | - if (preg_match($as, implode(',', $select), $m)) { |
|
| 931 | - $alias = ''; |
|
| 932 | - } else { |
|
| 933 | - $alias = ', ' . $nfrom[4] . " AS $oldcle"; |
|
| 934 | - } |
|
| 935 | - } |
|
| 936 | - $select = remplacer_jointnul($t . $alias, $select, $e); |
|
| 937 | - $join = remplacer_jointnul($t, $join, $e); |
|
| 938 | - $where = remplacer_jointnul($t, $where, $e); |
|
| 939 | - $having = remplacer_jointnul($t, $having, $e); |
|
| 940 | - $groupby = remplacer_jointnul($t, $groupby, $e); |
|
| 941 | - $orderby = remplacer_jointnul($t, $orderby, $e); |
|
| 942 | - } |
|
| 943 | - $from = reinjecte_joint($afrom, $from); |
|
| 944 | - } |
|
| 945 | - if (empty($GLOBALS['debug']) or !is_array($GLOBALS['debug'])) { |
|
| 946 | - $wasdebug = empty($GLOBALS['debug']) ? false : $GLOBALS['debug']; |
|
| 947 | - $GLOBALS['debug'] = []; |
|
| 948 | - if ($wasdebug) { |
|
| 949 | - $GLOBALS['debug']['debug'] = true; |
|
| 950 | - } |
|
| 951 | - } |
|
| 952 | - $GLOBALS['debug']['aucasou'] = [$table, $id, $serveur, $requeter]; |
|
| 953 | - $r = sql_select( |
|
| 954 | - $select, |
|
| 955 | - $from, |
|
| 956 | - $where, |
|
| 957 | - $groupby, |
|
| 958 | - array_filter($orderby), |
|
| 959 | - $limit, |
|
| 960 | - $having, |
|
| 961 | - $serveur, |
|
| 962 | - $requeter |
|
| 963 | - ); |
|
| 964 | - unset($GLOBALS['debug']['aucasou']); |
|
| 965 | - |
|
| 966 | - return $r; |
|
| 696 | + // retirer les criteres vides: |
|
| 697 | + // {X ?} avec X absent de l'URL |
|
| 698 | + // {par #ENV{X}} avec X absent de l'URL |
|
| 699 | + // IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil) |
|
| 700 | + $menage = false; |
|
| 701 | + foreach ($where as $k => $v) { |
|
| 702 | + if (is_array($v)) { |
|
| 703 | + if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) { |
|
| 704 | + $op = false; |
|
| 705 | + } elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) { |
|
| 706 | + $op = false; |
|
| 707 | + } else { |
|
| 708 | + $op = $v[0] ? $v[0] : $v; |
|
| 709 | + } |
|
| 710 | + } else { |
|
| 711 | + $op = $v; |
|
| 712 | + } |
|
| 713 | + if ((!$op) or ($op == 1) or ($op == '0=0')) { |
|
| 714 | + unset($where[$k]); |
|
| 715 | + $menage = true; |
|
| 716 | + } |
|
| 717 | + } |
|
| 718 | + |
|
| 719 | + // evacuer les eventuels groupby vide issus d'un calcul dynamique |
|
| 720 | + $groupby = array_diff($groupby, ['']); |
|
| 721 | + |
|
| 722 | + // remplacer les sous requetes recursives au calcul |
|
| 723 | + list($where_simples, $where_sous) = trouver_sous_requetes($where); |
|
| 724 | + foreach ($where_sous as $k => $w) { |
|
| 725 | + $menage = true; |
|
| 726 | + // on recupere la sous requete |
|
| 727 | + $sous = match_self($w); |
|
| 728 | + if ($sous[0] == 'SELF') { |
|
| 729 | + // c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where) |
|
| 730 | + array_push($where_simples, $sous[2]); |
|
| 731 | + $wheresub = [ |
|
| 732 | + $sous[2], |
|
| 733 | + '0=0' |
|
| 734 | + ]; // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where |
|
| 735 | + $jsub = $join; |
|
| 736 | + // trouver les jointures utiles a |
|
| 737 | + // reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees |
|
| 738 | + // ie L1.objet='article' |
|
| 739 | + // on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction |
|
| 740 | + $i = 0; |
|
| 741 | + do { |
|
| 742 | + $where[$k] = remplace_sous_requete($w, '(' . calculer_select( |
|
| 743 | + [$sous[1] . ' AS id'], |
|
| 744 | + $from, |
|
| 745 | + $from_type, |
|
| 746 | + $wheresub, |
|
| 747 | + $jsub, |
|
| 748 | + [], |
|
| 749 | + [], |
|
| 750 | + '', |
|
| 751 | + $having, |
|
| 752 | + $table, |
|
| 753 | + $id, |
|
| 754 | + $serveur, |
|
| 755 | + false |
|
| 756 | + ) . ')'); |
|
| 757 | + if (!$i) { |
|
| 758 | + $i = 1; |
|
| 759 | + $wherestring = calculer_where_to_string($where[$k]); |
|
| 760 | + foreach ($join as $cle => $wj) { |
|
| 761 | + if ( |
|
| 762 | + count($wj) == 4 |
|
| 763 | + and strpos($wherestring, "{$cle}.") !== false |
|
| 764 | + ) { |
|
| 765 | + $i = 0; |
|
| 766 | + $wheresub[] = $wj[3]; |
|
| 767 | + unset($jsub[$cle][3]); |
|
| 768 | + } |
|
| 769 | + } |
|
| 770 | + } |
|
| 771 | + } while ($i++ < 1); |
|
| 772 | + } |
|
| 773 | + if ($sous[0] == 'SUBSELECT') { |
|
| 774 | + // c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having) |
|
| 775 | + array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ? |
|
| 776 | + $where[$k] = remplace_sous_requete($w, '(' . calculer_select( |
|
| 777 | + $sous[1], # select |
|
| 778 | + $sous[2], #from |
|
| 779 | + [], #from_type |
|
| 780 | + $sous[3] ? (is_array($sous[3]) ? $sous[3] : [$sous[3]]) : [], |
|
| 781 | + #where, qui peut etre de la forme string comme dans sql_select |
|
| 782 | + [], #join |
|
| 783 | + $sous[4] ? $sous[4] : [], #groupby |
|
| 784 | + $sous[5] ? $sous[5] : [], #orderby |
|
| 785 | + $sous[6], #limit |
|
| 786 | + $sous[7] ? $sous[7] : [], #having |
|
| 787 | + $table, |
|
| 788 | + $id, |
|
| 789 | + $serveur, |
|
| 790 | + false |
|
| 791 | + ) . ')'); |
|
| 792 | + } |
|
| 793 | + array_pop($where_simples); |
|
| 794 | + } |
|
| 795 | + |
|
| 796 | + foreach ($having as $k => $v) { |
|
| 797 | + if ((!$v) or ($v == 1) or ($v == '0=0')) { |
|
| 798 | + unset($having[$k]); |
|
| 799 | + } |
|
| 800 | + } |
|
| 801 | + |
|
| 802 | + // Installer les jointures. |
|
| 803 | + // Retirer celles seulement utiles aux criteres finalement absents mais |
|
| 804 | + // parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln |
|
| 805 | + // si elle est seulement utile a Ln+1 elle meme inutile |
|
| 806 | + |
|
| 807 | + $afrom = []; |
|
| 808 | + $equiv = []; |
|
| 809 | + $k = count($join); |
|
| 810 | + foreach (array_reverse($join, true) as $cledef => $j) { |
|
| 811 | + $cle = $cledef; |
|
| 812 | + // le format de join est : |
|
| 813 | + // array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]]) |
|
| 814 | + $join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber |
|
| 815 | + if (count($join[$cle]) == 2) { |
|
| 816 | + $join[$cle][] = $join[$cle][1]; |
|
| 817 | + } |
|
| 818 | + if (count($join[$cle]) == 3) { |
|
| 819 | + $join[$cle][] = ''; |
|
| 820 | + } |
|
| 821 | + list($t, $c, $carr, $and) = $join[$cle]; |
|
| 822 | + // si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste |
|
| 823 | + // pour compat avec ancienne convention |
|
| 824 | + if (is_numeric($cle)) { |
|
| 825 | + $cle = "L$k"; |
|
| 826 | + } |
|
| 827 | + $cle_where_lie = "JOIN-$cle"; |
|
| 828 | + if ( |
|
| 829 | + !$menage |
|
| 830 | + or isset($afrom[$cle]) |
|
| 831 | + or calculer_jointnul($cle, $select) |
|
| 832 | + or calculer_jointnul($cle, array_diff_key($join, [$cle => $join[$cle]])) |
|
| 833 | + or calculer_jointnul($cle, $having) |
|
| 834 | + or calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => ''])) |
|
| 835 | + ) { |
|
| 836 | + // corriger les references non explicites dans select |
|
| 837 | + // ou groupby |
|
| 838 | + foreach ($select as $i => $s) { |
|
| 839 | + if ($s == $c) { |
|
| 840 | + $select[$i] = "$cle.$c AS $c"; |
|
| 841 | + break; |
|
| 842 | + } |
|
| 843 | + } |
|
| 844 | + foreach ($groupby as $i => $g) { |
|
| 845 | + if ($g == $c) { |
|
| 846 | + $groupby[$i] = "$cle.$c"; |
|
| 847 | + break; |
|
| 848 | + } |
|
| 849 | + } |
|
| 850 | + // on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin |
|
| 851 | + // sans recours a preg_match |
|
| 852 | + // un implode(' ',..) est fait dans reinjecte_joint un peu plus bas |
|
| 853 | + $afrom[$t][$cle] = [ |
|
| 854 | + "\n" . |
|
| 855 | + (isset($from_type[$cle]) ? $from_type[$cle] : 'INNER') . ' JOIN', |
|
| 856 | + $from[$cle], |
|
| 857 | + "AS $cle", |
|
| 858 | + 'ON (', |
|
| 859 | + "$cle.$c", |
|
| 860 | + '=', |
|
| 861 | + "$t.$carr", |
|
| 862 | + ($and ? 'AND ' . $and : '') . |
|
| 863 | + ')' |
|
| 864 | + ]; |
|
| 865 | + if (isset($afrom[$cle])) { |
|
| 866 | + $afrom[$t] = $afrom[$t] + $afrom[$cle]; |
|
| 867 | + unset($afrom[$cle]); |
|
| 868 | + } |
|
| 869 | + $equiv[] = $carr; |
|
| 870 | + } else { |
|
| 871 | + unset($join[$cledef]); |
|
| 872 | + if (isset($where_simples[$cle_where_lie])) { |
|
| 873 | + unset($where_simples[$cle_where_lie]); |
|
| 874 | + unset($where[$cle_where_lie]); |
|
| 875 | + } |
|
| 876 | + } |
|
| 877 | + unset($from[$cle]); |
|
| 878 | + $k--; |
|
| 879 | + } |
|
| 880 | + |
|
| 881 | + if (count($afrom)) { |
|
| 882 | + // Regarder si la table principale ne sert finalement a rien comme dans |
|
| 883 | + //<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3> |
|
| 884 | + //<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2> |
|
| 885 | + //<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5> |
|
| 886 | + // ou dans |
|
| 887 | + //<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8> |
|
| 888 | + // qui comporte plusieurs jointures |
|
| 889 | + // ou dans |
|
| 890 | + // <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6> |
|
| 891 | + // <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7> |
|
| 892 | + // penser a regarder aussi la clause orderby pour ne pas simplifier abusivement |
|
| 893 | + // <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9> |
|
| 894 | + // penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement |
|
| 895 | + // <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10> |
|
| 896 | + |
|
| 897 | + $t = key($from); |
|
| 898 | + $c = current($from); |
|
| 899 | + reset($from); |
|
| 900 | + $e = '/\b(' . "$t\\." . join('|' . $t . '\.', $equiv) . ')\b/'; |
|
| 901 | + if ( |
|
| 902 | + !(strpos($t, ' ') or // jointure des le depart cf boucle_doc |
|
| 903 | + calculer_jointnul($t, $select, $e) or |
|
| 904 | + calculer_jointnul($t, $join, $e) or |
|
| 905 | + calculer_jointnul($t, $where, $e) or |
|
| 906 | + calculer_jointnul($t, $orderby, $e) or |
|
| 907 | + calculer_jointnul($t, $groupby, $e) or |
|
| 908 | + calculer_jointnul($t, $having, $e)) |
|
| 909 | + && count($afrom[$t]) |
|
| 910 | + ) { |
|
| 911 | + $nfrom = reset($afrom[$t]); |
|
| 912 | + $nt = key($afrom[$t]); |
|
| 913 | + unset($from[$t]); |
|
| 914 | + $from[$nt] = $nfrom[1]; |
|
| 915 | + unset($afrom[$t][$nt]); |
|
| 916 | + $afrom[$nt] = $afrom[$t]; |
|
| 917 | + unset($afrom[$t]); |
|
| 918 | + $e = '/\b' . preg_quote($nfrom[6]) . '\b/'; |
|
| 919 | + $t = $nfrom[4]; |
|
| 920 | + $alias = ''; |
|
| 921 | + // verifier que les deux cles sont homonymes, sinon installer un alias dans le select |
|
| 922 | + $oldcle = explode('.', $nfrom[6]); |
|
| 923 | + $oldcle = end($oldcle); |
|
| 924 | + $newcle = explode('.', $nfrom[4]); |
|
| 925 | + $newcle = end($newcle); |
|
| 926 | + if ($newcle != $oldcle) { |
|
| 927 | + // si l'ancienne cle etait deja dans le select avec un AS |
|
| 928 | + // reprendre simplement ce AS |
|
| 929 | + $as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/'; |
|
| 930 | + if (preg_match($as, implode(',', $select), $m)) { |
|
| 931 | + $alias = ''; |
|
| 932 | + } else { |
|
| 933 | + $alias = ', ' . $nfrom[4] . " AS $oldcle"; |
|
| 934 | + } |
|
| 935 | + } |
|
| 936 | + $select = remplacer_jointnul($t . $alias, $select, $e); |
|
| 937 | + $join = remplacer_jointnul($t, $join, $e); |
|
| 938 | + $where = remplacer_jointnul($t, $where, $e); |
|
| 939 | + $having = remplacer_jointnul($t, $having, $e); |
|
| 940 | + $groupby = remplacer_jointnul($t, $groupby, $e); |
|
| 941 | + $orderby = remplacer_jointnul($t, $orderby, $e); |
|
| 942 | + } |
|
| 943 | + $from = reinjecte_joint($afrom, $from); |
|
| 944 | + } |
|
| 945 | + if (empty($GLOBALS['debug']) or !is_array($GLOBALS['debug'])) { |
|
| 946 | + $wasdebug = empty($GLOBALS['debug']) ? false : $GLOBALS['debug']; |
|
| 947 | + $GLOBALS['debug'] = []; |
|
| 948 | + if ($wasdebug) { |
|
| 949 | + $GLOBALS['debug']['debug'] = true; |
|
| 950 | + } |
|
| 951 | + } |
|
| 952 | + $GLOBALS['debug']['aucasou'] = [$table, $id, $serveur, $requeter]; |
|
| 953 | + $r = sql_select( |
|
| 954 | + $select, |
|
| 955 | + $from, |
|
| 956 | + $where, |
|
| 957 | + $groupby, |
|
| 958 | + array_filter($orderby), |
|
| 959 | + $limit, |
|
| 960 | + $having, |
|
| 961 | + $serveur, |
|
| 962 | + $requeter |
|
| 963 | + ); |
|
| 964 | + unset($GLOBALS['debug']['aucasou']); |
|
| 965 | + |
|
| 966 | + return $r; |
|
| 967 | 967 | } |
| 968 | 968 | |
| 969 | 969 | /** |
@@ -974,20 +974,20 @@ discard block |
||
| 974 | 974 | * @return string |
| 975 | 975 | */ |
| 976 | 976 | function calculer_where_to_string($v, $join = 'AND') { |
| 977 | - if (empty($v)) { |
|
| 978 | - return ''; |
|
| 979 | - } |
|
| 980 | - |
|
| 981 | - if (!is_array($v)) { |
|
| 982 | - return $v; |
|
| 983 | - } else { |
|
| 984 | - $exp = ''; |
|
| 985 | - if (strtoupper($join) === 'AND') { |
|
| 986 | - return $exp . join(" $join ", array_map('calculer_where_to_string', $v)); |
|
| 987 | - } else { |
|
| 988 | - return $exp . join($join, $v); |
|
| 989 | - } |
|
| 990 | - } |
|
| 977 | + if (empty($v)) { |
|
| 978 | + return ''; |
|
| 979 | + } |
|
| 980 | + |
|
| 981 | + if (!is_array($v)) { |
|
| 982 | + return $v; |
|
| 983 | + } else { |
|
| 984 | + $exp = ''; |
|
| 985 | + if (strtoupper($join) === 'AND') { |
|
| 986 | + return $exp . join(" $join ", array_map('calculer_where_to_string', $v)); |
|
| 987 | + } else { |
|
| 988 | + return $exp . join($join, $v); |
|
| 989 | + } |
|
| 990 | + } |
|
| 991 | 991 | } |
| 992 | 992 | |
| 993 | 993 | |
@@ -995,62 +995,62 @@ discard block |
||
| 995 | 995 | |
| 996 | 996 | // https://code.spip.net/@calculer_jointnul |
| 997 | 997 | function calculer_jointnul($cle, $exp, $equiv = '') { |
| 998 | - if (!is_array($exp)) { |
|
| 999 | - if ($equiv) { |
|
| 1000 | - $exp = preg_replace($equiv, '', $exp); |
|
| 1001 | - } |
|
| 1002 | - |
|
| 1003 | - return preg_match("/\\b$cle\\./", $exp); |
|
| 1004 | - } else { |
|
| 1005 | - foreach ($exp as $v) { |
|
| 1006 | - if (calculer_jointnul($cle, $v, $equiv)) { |
|
| 1007 | - return true; |
|
| 1008 | - } |
|
| 1009 | - } |
|
| 1010 | - |
|
| 1011 | - return false; |
|
| 1012 | - } |
|
| 998 | + if (!is_array($exp)) { |
|
| 999 | + if ($equiv) { |
|
| 1000 | + $exp = preg_replace($equiv, '', $exp); |
|
| 1001 | + } |
|
| 1002 | + |
|
| 1003 | + return preg_match("/\\b$cle\\./", $exp); |
|
| 1004 | + } else { |
|
| 1005 | + foreach ($exp as $v) { |
|
| 1006 | + if (calculer_jointnul($cle, $v, $equiv)) { |
|
| 1007 | + return true; |
|
| 1008 | + } |
|
| 1009 | + } |
|
| 1010 | + |
|
| 1011 | + return false; |
|
| 1012 | + } |
|
| 1013 | 1013 | } |
| 1014 | 1014 | |
| 1015 | 1015 | // https://code.spip.net/@reinjecte_joint |
| 1016 | 1016 | function reinjecte_joint($afrom, $from) { |
| 1017 | - $from_synth = []; |
|
| 1018 | - foreach ($from as $k => $v) { |
|
| 1019 | - $from_synth[$k] = $from[$k]; |
|
| 1020 | - if (isset($afrom[$k])) { |
|
| 1021 | - foreach ($afrom[$k] as $kk => $vv) { |
|
| 1022 | - $afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]); |
|
| 1023 | - } |
|
| 1024 | - $from_synth["$k@"] = implode(' ', $afrom[$k]); |
|
| 1025 | - unset($afrom[$k]); |
|
| 1026 | - } |
|
| 1027 | - } |
|
| 1028 | - |
|
| 1029 | - return $from_synth; |
|
| 1017 | + $from_synth = []; |
|
| 1018 | + foreach ($from as $k => $v) { |
|
| 1019 | + $from_synth[$k] = $from[$k]; |
|
| 1020 | + if (isset($afrom[$k])) { |
|
| 1021 | + foreach ($afrom[$k] as $kk => $vv) { |
|
| 1022 | + $afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]); |
|
| 1023 | + } |
|
| 1024 | + $from_synth["$k@"] = implode(' ', $afrom[$k]); |
|
| 1025 | + unset($afrom[$k]); |
|
| 1026 | + } |
|
| 1027 | + } |
|
| 1028 | + |
|
| 1029 | + return $from_synth; |
|
| 1030 | 1030 | } |
| 1031 | 1031 | |
| 1032 | 1032 | // https://code.spip.net/@remplacer_jointnul |
| 1033 | 1033 | function remplacer_jointnul($cle, $exp, $equiv = '') { |
| 1034 | - if (!is_array($exp)) { |
|
| 1035 | - return preg_replace($equiv, $cle, $exp); |
|
| 1036 | - } else { |
|
| 1037 | - foreach ($exp as $k => $v) { |
|
| 1038 | - $exp[$k] = remplacer_jointnul($cle, $v, $equiv); |
|
| 1039 | - } |
|
| 1040 | - |
|
| 1041 | - return $exp; |
|
| 1042 | - } |
|
| 1034 | + if (!is_array($exp)) { |
|
| 1035 | + return preg_replace($equiv, $cle, $exp); |
|
| 1036 | + } else { |
|
| 1037 | + foreach ($exp as $k => $v) { |
|
| 1038 | + $exp[$k] = remplacer_jointnul($cle, $v, $equiv); |
|
| 1039 | + } |
|
| 1040 | + |
|
| 1041 | + return $exp; |
|
| 1042 | + } |
|
| 1043 | 1043 | } |
| 1044 | 1044 | |
| 1045 | 1045 | // calcul du nom du squelette |
| 1046 | 1046 | // https://code.spip.net/@calculer_nom_fonction_squel |
| 1047 | 1047 | function calculer_nom_fonction_squel($skel, $mime_type = 'html', $connect = '') { |
| 1048 | - // ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine |
|
| 1049 | - if ($l = strlen(_DIR_RACINE) and strncmp($skel, _DIR_RACINE, $l) == 0) { |
|
| 1050 | - $skel = substr($skel, strlen(_DIR_RACINE)); |
|
| 1051 | - } |
|
| 1052 | - |
|
| 1053 | - return $mime_type |
|
| 1054 | - . (!$connect ? '' : preg_replace('/\W/', '_', $connect)) . '_' |
|
| 1055 | - . md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : '')); |
|
| 1048 | + // ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine |
|
| 1049 | + if ($l = strlen(_DIR_RACINE) and strncmp($skel, _DIR_RACINE, $l) == 0) { |
|
| 1050 | + $skel = substr($skel, strlen(_DIR_RACINE)); |
|
| 1051 | + } |
|
| 1052 | + |
|
| 1053 | + return $mime_type |
|
| 1054 | + . (!$connect ? '' : preg_replace('/\W/', '_', $connect)) . '_' |
|
| 1055 | + . md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : '')); |
|
| 1056 | 1056 | } |
@@ -54,7 +54,7 @@ discard block |
||
| 54 | 54 | $GLOBALS['debug_objets']['courant'] = $nom; |
| 55 | 55 | } |
| 56 | 56 | |
| 57 | - $phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php'; |
|
| 57 | + $phpfile = sous_repertoire(_DIR_SKELS, '', false, true).$nom.'.php'; |
|
| 58 | 58 | |
| 59 | 59 | // si squelette est deja compile et perenne, le charger |
| 60 | 60 | if (!squelette_obsolete($phpfile, $source)) { |
@@ -67,7 +67,7 @@ discard block |
||
| 67 | 67 | #} |
| 68 | 68 | } |
| 69 | 69 | |
| 70 | - if (file_exists($lib = $squelette . '_fonctions' . '.php')) { |
|
| 70 | + if (file_exists($lib = $squelette.'_fonctions'.'.php')) { |
|
| 71 | 71 | include_once $lib; |
| 72 | 72 | } |
| 73 | 73 | |
@@ -95,7 +95,7 @@ discard block |
||
| 95 | 95 | eval("return true; $f ;"); |
| 96 | 96 | } catch (\ParseError $e) { |
| 97 | 97 | // Code syntaxiquement faux (critere etc mal programme') |
| 98 | - $msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage(); |
|
| 98 | + $msg = _T('zbug_erreur_compilation').' | Line '.$e->getLine().' : '.$e->getMessage(); |
|
| 99 | 99 | erreur_squelette($msg, $boucle); |
| 100 | 100 | // continuer pour trouver d'autres fautes eventuelles |
| 101 | 101 | // mais prevenir que c'est mort |
@@ -123,7 +123,7 @@ discard block |
||
| 123 | 123 | |
| 124 | 124 | if (defined('_VAR_MODE') and _VAR_MODE == 'debug') { |
| 125 | 125 | // Tracer ce qui vient d'etre compile |
| 126 | - $GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code; |
|
| 126 | + $GLOBALS['debug_objets']['code'][$nom.'tout'] = $code; |
|
| 127 | 127 | |
| 128 | 128 | // si c'est ce que demande le debusqueur, lui passer la main |
| 129 | 129 | 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 | } |
@@ -216,7 +216,7 @@ discard block |
||
| 216 | 216 | $j = join('-', array_map('ucwords', explode('-', strtolower($r[2])))); |
| 217 | 217 | |
| 218 | 218 | if ($j == 'X-Spip-Filtre' and isset($headers[$j])) { |
| 219 | - $headers[$j] .= '|' . $r[3]; |
|
| 219 | + $headers[$j] .= '|'.$r[3]; |
|
| 220 | 220 | } else { |
| 221 | 221 | $headers[$j] = $r[3]; |
| 222 | 222 | } |
@@ -224,10 +224,10 @@ discard block |
||
| 224 | 224 | } |
| 225 | 225 | // S'agit-il d'un resultat constant ou contenant du code php |
| 226 | 226 | $process_ins = ( |
| 227 | - strpos($corps, '<' . '?') === false |
|
| 227 | + strpos($corps, '<'.'?') === false |
|
| 228 | 228 | or |
| 229 | - (strpos($corps, '<' . '?xml') !== false and |
|
| 230 | - strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) |
|
| 229 | + (strpos($corps, '<'.'?xml') !== false and |
|
| 230 | + strpos(str_replace('<'.'?xml', '', $corps), '<'.'?') === false) |
|
| 231 | 231 | ) |
| 232 | 232 | ? 'html' |
| 233 | 233 | : 'php'; |
@@ -256,10 +256,10 @@ discard block |
||
| 256 | 256 | |
| 257 | 257 | if ($process_ins == 'html') { |
| 258 | 258 | $skel['process_ins'] = ( |
| 259 | - strpos($corps, '<' . '?') === false |
|
| 259 | + strpos($corps, '<'.'?') === false |
|
| 260 | 260 | or |
| 261 | - (strpos($corps, '<' . '?xml') !== false and |
|
| 262 | - strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) |
|
| 261 | + (strpos($corps, '<'.'?xml') !== false and |
|
| 262 | + strpos(str_replace('<'.'?xml', '', $corps), '<'.'?') === false) |
|
| 263 | 263 | ) |
| 264 | 264 | ? 'html' |
| 265 | 265 | : 'php'; |
@@ -277,7 +277,7 @@ discard block |
||
| 277 | 277 | // |
| 278 | 278 | |
| 279 | 279 | /** Code PHP pour inclure une balise dynamique à l'exécution d'une page */ |
| 280 | -define('CODE_INCLURE_BALISE', '<' . '?php |
|
| 280 | +define('CODE_INCLURE_BALISE', '<'.'?php |
|
| 281 | 281 | include_once("%s"); |
| 282 | 282 | if ($lang_select = "%s") $lang_select = lang_select($lang_select); |
| 283 | 283 | inserer_balise_dynamique(balise_%s_dyn(%s), array(%s)); |
@@ -308,7 +308,7 @@ discard block |
||
| 308 | 308 | // pas de lien symbolique sous Windows |
| 309 | 309 | and !(stristr(PHP_OS, 'WIN') and strpos($file, ':') !== false) |
| 310 | 310 | ) { |
| 311 | - $file = './" . _DIR_RACINE . "' . $file; |
|
| 311 | + $file = './" . _DIR_RACINE . "'.$file; |
|
| 312 | 312 | } |
| 313 | 313 | |
| 314 | 314 | $lang = $context_compil[4]; |
@@ -318,7 +318,7 @@ discard block |
||
| 318 | 318 | |
| 319 | 319 | $args = array_map('argumenter_squelette', $args); |
| 320 | 320 | if (!empty($context_compil['appel_php_depuis_modele'])) { |
| 321 | - $args[0] = 'arguments_balise_dyn_depuis_modele(' . $args[0] . ')'; |
|
| 321 | + $args[0] = 'arguments_balise_dyn_depuis_modele('.$args[0].')'; |
|
| 322 | 322 | } |
| 323 | 323 | $args = join(', ', $args); |
| 324 | 324 | |
@@ -352,14 +352,14 @@ discard block |
||
| 352 | 352 | if (is_object($v)) { |
| 353 | 353 | return var_export($v, true); |
| 354 | 354 | } elseif (!is_array($v)) { |
| 355 | - return "'" . texte_script($v) . "'"; |
|
| 355 | + return "'".texte_script($v)."'"; |
|
| 356 | 356 | } else { |
| 357 | 357 | $out = []; |
| 358 | 358 | foreach ($v as $k => $val) { |
| 359 | - $out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val); |
|
| 359 | + $out [] = argumenter_squelette($k).'=>'.argumenter_squelette($val); |
|
| 360 | 360 | } |
| 361 | 361 | |
| 362 | - return 'array(' . join(', ', $out) . ')'; |
|
| 362 | + return 'array('.join(', ', $out).')'; |
|
| 363 | 363 | } |
| 364 | 364 | } |
| 365 | 365 | |
@@ -437,7 +437,7 @@ discard block |
||
| 437 | 437 | } |
| 438 | 438 | |
| 439 | 439 | // Y a-t-il une fonction de traitement des arguments ? |
| 440 | - $f = 'balise_' . $nom_balise . '_stat'; |
|
| 440 | + $f = 'balise_'.$nom_balise.'_stat'; |
|
| 441 | 441 | |
| 442 | 442 | $r = !function_exists($f) ? $args : $f($args, $context_compil); |
| 443 | 443 | |
@@ -447,18 +447,18 @@ discard block |
||
| 447 | 447 | |
| 448 | 448 | // verifier que la fonction dyn est la, |
| 449 | 449 | // sinon se replier sur la generique si elle existe |
| 450 | - if (!function_exists('balise_' . $nom_balise . '_dyn')) { |
|
| 450 | + if (!function_exists('balise_'.$nom_balise.'_dyn')) { |
|
| 451 | 451 | if ( |
| 452 | 452 | $balise_generique = chercher_balise_generique($nom) |
| 453 | 453 | and $nom_balise_generique = $balise_generique['nom_generique'] |
| 454 | - and $file = include_spip('balise/' . strtolower($nom_balise_generique)) |
|
| 455 | - and function_exists('balise_' . $nom_balise_generique . '_dyn') |
|
| 454 | + and $file = include_spip('balise/'.strtolower($nom_balise_generique)) |
|
| 455 | + and function_exists('balise_'.$nom_balise_generique.'_dyn') |
|
| 456 | 456 | ) { |
| 457 | 457 | // et lui injecter en premier arg le nom de la balise |
| 458 | 458 | array_unshift($r, $nom); |
| 459 | 459 | $nom_balise = $nom_balise_generique; |
| 460 | 460 | if (!_DIR_RESTREINT) { |
| 461 | - $file = _DIR_RESTREINT_ABS . $file; |
|
| 461 | + $file = _DIR_RESTREINT_ABS.$file; |
|
| 462 | 462 | } |
| 463 | 463 | } else { |
| 464 | 464 | $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]]; |
@@ -560,7 +560,7 @@ discard block |
||
| 560 | 560 | $n = ''; |
| 561 | 561 | foreach (explode(',', $liste) as $val) { |
| 562 | 562 | if ($a = intval($val) and $val === strval($a)) { |
| 563 | - $n .= ',' . $val; |
|
| 563 | + $n .= ','.$val; |
|
| 564 | 564 | } |
| 565 | 565 | } |
| 566 | 566 | if (strlen($n)) { |
@@ -739,8 +739,8 @@ discard block |
||
| 739 | 739 | // on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction |
| 740 | 740 | $i = 0; |
| 741 | 741 | do { |
| 742 | - $where[$k] = remplace_sous_requete($w, '(' . calculer_select( |
|
| 743 | - [$sous[1] . ' AS id'], |
|
| 742 | + $where[$k] = remplace_sous_requete($w, '('.calculer_select( |
|
| 743 | + [$sous[1].' AS id'], |
|
| 744 | 744 | $from, |
| 745 | 745 | $from_type, |
| 746 | 746 | $wheresub, |
@@ -753,7 +753,7 @@ discard block |
||
| 753 | 753 | $id, |
| 754 | 754 | $serveur, |
| 755 | 755 | false |
| 756 | - ) . ')'); |
|
| 756 | + ).')'); |
|
| 757 | 757 | if (!$i) { |
| 758 | 758 | $i = 1; |
| 759 | 759 | $wherestring = calculer_where_to_string($where[$k]); |
@@ -773,7 +773,7 @@ discard block |
||
| 773 | 773 | if ($sous[0] == 'SUBSELECT') { |
| 774 | 774 | // c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having) |
| 775 | 775 | array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ? |
| 776 | - $where[$k] = remplace_sous_requete($w, '(' . calculer_select( |
|
| 776 | + $where[$k] = remplace_sous_requete($w, '('.calculer_select( |
|
| 777 | 777 | $sous[1], # select |
| 778 | 778 | $sous[2], #from |
| 779 | 779 | [], #from_type |
@@ -788,7 +788,7 @@ discard block |
||
| 788 | 788 | $id, |
| 789 | 789 | $serveur, |
| 790 | 790 | false |
| 791 | - ) . ')'); |
|
| 791 | + ).')'); |
|
| 792 | 792 | } |
| 793 | 793 | array_pop($where_simples); |
| 794 | 794 | } |
@@ -851,15 +851,15 @@ discard block |
||
| 851 | 851 | // sans recours a preg_match |
| 852 | 852 | // un implode(' ',..) est fait dans reinjecte_joint un peu plus bas |
| 853 | 853 | $afrom[$t][$cle] = [ |
| 854 | - "\n" . |
|
| 855 | - (isset($from_type[$cle]) ? $from_type[$cle] : 'INNER') . ' JOIN', |
|
| 854 | + "\n". |
|
| 855 | + (isset($from_type[$cle]) ? $from_type[$cle] : 'INNER').' JOIN', |
|
| 856 | 856 | $from[$cle], |
| 857 | 857 | "AS $cle", |
| 858 | 858 | 'ON (', |
| 859 | 859 | "$cle.$c", |
| 860 | 860 | '=', |
| 861 | 861 | "$t.$carr", |
| 862 | - ($and ? 'AND ' . $and : '') . |
|
| 862 | + ($and ? 'AND '.$and : ''). |
|
| 863 | 863 | ')' |
| 864 | 864 | ]; |
| 865 | 865 | if (isset($afrom[$cle])) { |
@@ -897,7 +897,7 @@ discard block |
||
| 897 | 897 | $t = key($from); |
| 898 | 898 | $c = current($from); |
| 899 | 899 | reset($from); |
| 900 | - $e = '/\b(' . "$t\\." . join('|' . $t . '\.', $equiv) . ')\b/'; |
|
| 900 | + $e = '/\b('."$t\\.".join('|'.$t.'\.', $equiv).')\b/'; |
|
| 901 | 901 | if ( |
| 902 | 902 | !(strpos($t, ' ') or // jointure des le depart cf boucle_doc |
| 903 | 903 | calculer_jointnul($t, $select, $e) or |
@@ -915,7 +915,7 @@ discard block |
||
| 915 | 915 | unset($afrom[$t][$nt]); |
| 916 | 916 | $afrom[$nt] = $afrom[$t]; |
| 917 | 917 | unset($afrom[$t]); |
| 918 | - $e = '/\b' . preg_quote($nfrom[6]) . '\b/'; |
|
| 918 | + $e = '/\b'.preg_quote($nfrom[6]).'\b/'; |
|
| 919 | 919 | $t = $nfrom[4]; |
| 920 | 920 | $alias = ''; |
| 921 | 921 | // verifier que les deux cles sont homonymes, sinon installer un alias dans le select |
@@ -926,14 +926,14 @@ discard block |
||
| 926 | 926 | if ($newcle != $oldcle) { |
| 927 | 927 | // si l'ancienne cle etait deja dans le select avec un AS |
| 928 | 928 | // reprendre simplement ce AS |
| 929 | - $as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/'; |
|
| 929 | + $as = '/\b'.preg_quote($nfrom[6]).'\s+(AS\s+\w+)\b/'; |
|
| 930 | 930 | if (preg_match($as, implode(',', $select), $m)) { |
| 931 | 931 | $alias = ''; |
| 932 | 932 | } else { |
| 933 | - $alias = ', ' . $nfrom[4] . " AS $oldcle"; |
|
| 933 | + $alias = ', '.$nfrom[4]." AS $oldcle"; |
|
| 934 | 934 | } |
| 935 | 935 | } |
| 936 | - $select = remplacer_jointnul($t . $alias, $select, $e); |
|
| 936 | + $select = remplacer_jointnul($t.$alias, $select, $e); |
|
| 937 | 937 | $join = remplacer_jointnul($t, $join, $e); |
| 938 | 938 | $where = remplacer_jointnul($t, $where, $e); |
| 939 | 939 | $having = remplacer_jointnul($t, $having, $e); |
@@ -983,9 +983,9 @@ discard block |
||
| 983 | 983 | } else { |
| 984 | 984 | $exp = ''; |
| 985 | 985 | if (strtoupper($join) === 'AND') { |
| 986 | - return $exp . join(" $join ", array_map('calculer_where_to_string', $v)); |
|
| 986 | + return $exp.join(" $join ", array_map('calculer_where_to_string', $v)); |
|
| 987 | 987 | } else { |
| 988 | - return $exp . join($join, $v); |
|
| 988 | + return $exp.join($join, $v); |
|
| 989 | 989 | } |
| 990 | 990 | } |
| 991 | 991 | } |
@@ -1051,6 +1051,6 @@ discard block |
||
| 1051 | 1051 | } |
| 1052 | 1052 | |
| 1053 | 1053 | return $mime_type |
| 1054 | - . (!$connect ? '' : preg_replace('/\W/', '_', $connect)) . '_' |
|
| 1055 | - . md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : '')); |
|
| 1054 | + . (!$connect ? '' : preg_replace('/\W/', '_', $connect)).'_' |
|
| 1055 | + . md5($GLOBALS['spip_version_code'].' * '.$skel.(isset($GLOBALS['marqueur_skel']) ? '*'.$GLOBALS['marqueur_skel'] : '')); |
|
| 1056 | 1056 | } |
@@ -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 | |
@@ -34,53 +34,53 @@ discard block |
||
| 34 | 34 | * @package SPIP\Core\Compilateur\AST |
| 35 | 35 | */ |
| 36 | 36 | class Contexte { |
| 37 | - /** |
|
| 38 | - * Description du squelette |
|
| 39 | - * |
|
| 40 | - * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 41 | - * |
|
| 42 | - * Peut contenir les index : |
|
| 43 | - * |
|
| 44 | - * - nom : Nom du fichier de cache |
|
| 45 | - * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 46 | - * - sourcefile : Chemin du squelette |
|
| 47 | - * - squelette : Code du squelette |
|
| 48 | - * - id_mere : Identifiant de la boucle parente |
|
| 49 | - * - documents : Pour embed et img dans les textes |
|
| 50 | - * - session : Pour un cache sessionné par auteur |
|
| 51 | - * - niv : Niveau de tabulation |
|
| 52 | - * |
|
| 53 | - * @var array |
|
| 54 | - */ |
|
| 55 | - public $descr = []; |
|
| 56 | - |
|
| 57 | - /** |
|
| 58 | - * Identifiant de la boucle |
|
| 59 | - * |
|
| 60 | - * @var string |
|
| 61 | - */ |
|
| 62 | - public $id_boucle = ''; |
|
| 63 | - |
|
| 64 | - /** |
|
| 65 | - * Numéro de ligne dans le code source du squelette |
|
| 66 | - * |
|
| 67 | - * @var int |
|
| 68 | - */ |
|
| 69 | - public $ligne = 0; |
|
| 70 | - |
|
| 71 | - /** |
|
| 72 | - * Langue d'exécution |
|
| 73 | - * |
|
| 74 | - * @var string |
|
| 75 | - */ |
|
| 76 | - public $lang = ''; |
|
| 77 | - |
|
| 78 | - /** |
|
| 79 | - * Résultat de la compilation: toujours une expression PHP |
|
| 80 | - * |
|
| 81 | - * @var string |
|
| 82 | - */ |
|
| 83 | - public $code = ''; |
|
| 37 | + /** |
|
| 38 | + * Description du squelette |
|
| 39 | + * |
|
| 40 | + * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 41 | + * |
|
| 42 | + * Peut contenir les index : |
|
| 43 | + * |
|
| 44 | + * - nom : Nom du fichier de cache |
|
| 45 | + * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 46 | + * - sourcefile : Chemin du squelette |
|
| 47 | + * - squelette : Code du squelette |
|
| 48 | + * - id_mere : Identifiant de la boucle parente |
|
| 49 | + * - documents : Pour embed et img dans les textes |
|
| 50 | + * - session : Pour un cache sessionné par auteur |
|
| 51 | + * - niv : Niveau de tabulation |
|
| 52 | + * |
|
| 53 | + * @var array |
|
| 54 | + */ |
|
| 55 | + public $descr = []; |
|
| 56 | + |
|
| 57 | + /** |
|
| 58 | + * Identifiant de la boucle |
|
| 59 | + * |
|
| 60 | + * @var string |
|
| 61 | + */ |
|
| 62 | + public $id_boucle = ''; |
|
| 63 | + |
|
| 64 | + /** |
|
| 65 | + * Numéro de ligne dans le code source du squelette |
|
| 66 | + * |
|
| 67 | + * @var int |
|
| 68 | + */ |
|
| 69 | + public $ligne = 0; |
|
| 70 | + |
|
| 71 | + /** |
|
| 72 | + * Langue d'exécution |
|
| 73 | + * |
|
| 74 | + * @var string |
|
| 75 | + */ |
|
| 76 | + public $lang = ''; |
|
| 77 | + |
|
| 78 | + /** |
|
| 79 | + * Résultat de la compilation: toujours une expression PHP |
|
| 80 | + * |
|
| 81 | + * @var string |
|
| 82 | + */ |
|
| 83 | + public $code = ''; |
|
| 84 | 84 | } |
| 85 | 85 | |
| 86 | 86 | |
@@ -90,44 +90,44 @@ discard block |
||
| 90 | 90 | * @package SPIP\Core\Compilateur\AST |
| 91 | 91 | **/ |
| 92 | 92 | class Texte { |
| 93 | - /** |
|
| 94 | - * Type de noeud |
|
| 95 | - * |
|
| 96 | - * @var string |
|
| 97 | - */ |
|
| 98 | - public $type = 'texte'; |
|
| 99 | - |
|
| 100 | - /** |
|
| 101 | - * Le texte |
|
| 102 | - * |
|
| 103 | - * @var string |
|
| 104 | - */ |
|
| 105 | - public $texte; |
|
| 106 | - |
|
| 107 | - /** |
|
| 108 | - * Contenu avant le texte. |
|
| 109 | - * |
|
| 110 | - * Vide ou apostrophe simple ou double si le texte en était entouré |
|
| 111 | - * |
|
| 112 | - * @var string|array |
|
| 113 | - */ |
|
| 114 | - public $avant = ''; |
|
| 115 | - |
|
| 116 | - /** |
|
| 117 | - * Contenu après le texte. |
|
| 118 | - * |
|
| 119 | - * Vide ou apostrophe simple ou double si le texte en était entouré |
|
| 120 | - * |
|
| 121 | - * @var string|array |
|
| 122 | - */ |
|
| 123 | - public $apres = ''; |
|
| 124 | - |
|
| 125 | - /** |
|
| 126 | - * Numéro de ligne dans le code source du squelette |
|
| 127 | - * |
|
| 128 | - * @var int |
|
| 129 | - */ |
|
| 130 | - public $ligne = 0; |
|
| 93 | + /** |
|
| 94 | + * Type de noeud |
|
| 95 | + * |
|
| 96 | + * @var string |
|
| 97 | + */ |
|
| 98 | + public $type = 'texte'; |
|
| 99 | + |
|
| 100 | + /** |
|
| 101 | + * Le texte |
|
| 102 | + * |
|
| 103 | + * @var string |
|
| 104 | + */ |
|
| 105 | + public $texte; |
|
| 106 | + |
|
| 107 | + /** |
|
| 108 | + * Contenu avant le texte. |
|
| 109 | + * |
|
| 110 | + * Vide ou apostrophe simple ou double si le texte en était entouré |
|
| 111 | + * |
|
| 112 | + * @var string|array |
|
| 113 | + */ |
|
| 114 | + public $avant = ''; |
|
| 115 | + |
|
| 116 | + /** |
|
| 117 | + * Contenu après le texte. |
|
| 118 | + * |
|
| 119 | + * Vide ou apostrophe simple ou double si le texte en était entouré |
|
| 120 | + * |
|
| 121 | + * @var string|array |
|
| 122 | + */ |
|
| 123 | + public $apres = ''; |
|
| 124 | + |
|
| 125 | + /** |
|
| 126 | + * Numéro de ligne dans le code source du squelette |
|
| 127 | + * |
|
| 128 | + * @var int |
|
| 129 | + */ |
|
| 130 | + public $ligne = 0; |
|
| 131 | 131 | } |
| 132 | 132 | |
| 133 | 133 | /** |
@@ -136,50 +136,50 @@ discard block |
||
| 136 | 136 | * @package SPIP\Core\Compilateur\AST |
| 137 | 137 | **/ |
| 138 | 138 | class Inclure { |
| 139 | - /** |
|
| 140 | - * Type de noeud |
|
| 141 | - * |
|
| 142 | - * @var string |
|
| 143 | - */ |
|
| 144 | - public $type = 'include'; |
|
| 145 | - |
|
| 146 | - /** |
|
| 147 | - * Nom d'un fichier inclu |
|
| 148 | - * |
|
| 149 | - * - Objet Texte si inclusion d'un autre squelette |
|
| 150 | - * - chaîne si inclusion d'un fichier PHP directement |
|
| 151 | - * |
|
| 152 | - * @var string|Texte |
|
| 153 | - */ |
|
| 154 | - public $texte; |
|
| 155 | - |
|
| 156 | - /** |
|
| 157 | - * Inutilisé, propriété générique de l'AST |
|
| 158 | - * |
|
| 159 | - * @var string|array |
|
| 160 | - */ |
|
| 161 | - public $avant = ''; |
|
| 162 | - |
|
| 163 | - /** |
|
| 164 | - * Inutilisé, propriété générique de l'AST |
|
| 165 | - * |
|
| 166 | - * @var string|array |
|
| 167 | - */ |
|
| 168 | - public $apres = ''; |
|
| 169 | - |
|
| 170 | - /** |
|
| 171 | - * Numéro de ligne dans le code source du squelette |
|
| 172 | - * |
|
| 173 | - * @var int |
|
| 174 | - */ |
|
| 175 | - public $ligne = 0; |
|
| 176 | - |
|
| 177 | - /** |
|
| 178 | - * Valeurs des paramètres |
|
| 179 | - * |
|
| 180 | - * @var array |
|
| 181 | - */ |
|
| 182 | - public $param = []; |
|
| 139 | + /** |
|
| 140 | + * Type de noeud |
|
| 141 | + * |
|
| 142 | + * @var string |
|
| 143 | + */ |
|
| 144 | + public $type = 'include'; |
|
| 145 | + |
|
| 146 | + /** |
|
| 147 | + * Nom d'un fichier inclu |
|
| 148 | + * |
|
| 149 | + * - Objet Texte si inclusion d'un autre squelette |
|
| 150 | + * - chaîne si inclusion d'un fichier PHP directement |
|
| 151 | + * |
|
| 152 | + * @var string|Texte |
|
| 153 | + */ |
|
| 154 | + public $texte; |
|
| 155 | + |
|
| 156 | + /** |
|
| 157 | + * Inutilisé, propriété générique de l'AST |
|
| 158 | + * |
|
| 159 | + * @var string|array |
|
| 160 | + */ |
|
| 161 | + public $avant = ''; |
|
| 162 | + |
|
| 163 | + /** |
|
| 164 | + * Inutilisé, propriété générique de l'AST |
|
| 165 | + * |
|
| 166 | + * @var string|array |
|
| 167 | + */ |
|
| 168 | + public $apres = ''; |
|
| 169 | + |
|
| 170 | + /** |
|
| 171 | + * Numéro de ligne dans le code source du squelette |
|
| 172 | + * |
|
| 173 | + * @var int |
|
| 174 | + */ |
|
| 175 | + public $ligne = 0; |
|
| 176 | + |
|
| 177 | + /** |
|
| 178 | + * Valeurs des paramètres |
|
| 179 | + * |
|
| 180 | + * @var array |
|
| 181 | + */ |
|
| 182 | + public $param = []; |
|
| 183 | 183 | } |
| 184 | 184 | |
| 185 | 185 | |
@@ -189,386 +189,386 @@ discard block |
||
| 189 | 189 | * @package SPIP\Core\Compilateur\AST |
| 190 | 190 | **/ |
| 191 | 191 | class Boucle { |
| 192 | - /** |
|
| 193 | - * Type de noeud |
|
| 194 | - * |
|
| 195 | - * @var string |
|
| 196 | - */ |
|
| 197 | - public $type = 'boucle'; |
|
| 198 | - |
|
| 199 | - /** |
|
| 200 | - * Identifiant de la boucle |
|
| 201 | - * |
|
| 202 | - * @var string |
|
| 203 | - */ |
|
| 204 | - public $id_boucle; |
|
| 205 | - |
|
| 206 | - /** |
|
| 207 | - * Identifiant de la boucle parente |
|
| 208 | - * |
|
| 209 | - * @var string |
|
| 210 | - */ |
|
| 211 | - public $id_parent = ''; |
|
| 212 | - |
|
| 213 | - /** |
|
| 214 | - * Partie avant toujours affichee |
|
| 215 | - * |
|
| 216 | - * @var string|array |
|
| 217 | - */ |
|
| 218 | - public $preaff = ''; |
|
| 219 | - |
|
| 220 | - /** |
|
| 221 | - * Partie optionnelle avant |
|
| 222 | - * |
|
| 223 | - * @var string|array |
|
| 224 | - */ |
|
| 225 | - public $avant = ''; |
|
| 226 | - |
|
| 227 | - /** |
|
| 228 | - * Pour chaque élément |
|
| 229 | - * |
|
| 230 | - * @var string|array |
|
| 231 | - */ |
|
| 232 | - public $milieu = ''; |
|
| 233 | - |
|
| 234 | - /** |
|
| 235 | - * Partie optionnelle après |
|
| 236 | - * |
|
| 237 | - * @var string|array |
|
| 238 | - */ |
|
| 239 | - public $apres = ''; |
|
| 240 | - |
|
| 241 | - /** |
|
| 242 | - * Partie alternative, si pas de résultat dans la boucle |
|
| 243 | - * |
|
| 244 | - * @var string|array |
|
| 245 | - */ |
|
| 246 | - public $altern = ''; |
|
| 247 | - |
|
| 248 | - /** |
|
| 249 | - * Partie apres toujours affichee |
|
| 250 | - * |
|
| 251 | - * @var string|array |
|
| 252 | - */ |
|
| 253 | - public $postaff = ''; |
|
| 254 | - |
|
| 255 | - |
|
| 256 | - /** |
|
| 257 | - * La boucle doit-elle sélectionner la langue ? |
|
| 258 | - * |
|
| 259 | - * @var string|null |
|
| 260 | - */ |
|
| 261 | - public $lang_select; |
|
| 262 | - |
|
| 263 | - /** |
|
| 264 | - * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 265 | - * |
|
| 266 | - * @var string|null |
|
| 267 | - */ |
|
| 268 | - public $type_requete; |
|
| 269 | - |
|
| 270 | - /** |
|
| 271 | - * La table est elle optionnelle ? |
|
| 272 | - * |
|
| 273 | - * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente |
|
| 274 | - * |
|
| 275 | - * @var bool |
|
| 276 | - */ |
|
| 277 | - public $table_optionnelle = false; |
|
| 278 | - |
|
| 279 | - /** |
|
| 280 | - * Nom du fichier de connexion |
|
| 281 | - * |
|
| 282 | - * @var string |
|
| 283 | - */ |
|
| 284 | - public $sql_serveur = ''; |
|
| 285 | - |
|
| 286 | - /** |
|
| 287 | - * Paramètres de la boucle |
|
| 288 | - * |
|
| 289 | - * Description des paramètres passés à la boucle, qui servent ensuite |
|
| 290 | - * au calcul des critères |
|
| 291 | - * |
|
| 292 | - * @var array |
|
| 293 | - */ |
|
| 294 | - public $param = []; |
|
| 295 | - |
|
| 296 | - /** |
|
| 297 | - * Critères de la boucle |
|
| 298 | - * |
|
| 299 | - * @var Critere[] |
|
| 300 | - */ |
|
| 301 | - public $criteres = []; |
|
| 302 | - |
|
| 303 | - /** |
|
| 304 | - * Textes insérés entre 2 éléments de boucle (critère inter) |
|
| 305 | - * |
|
| 306 | - * @var string[] |
|
| 307 | - */ |
|
| 308 | - public $separateur = []; |
|
| 309 | - |
|
| 310 | - /** |
|
| 311 | - * Liste des jointures possibles avec cette table |
|
| 312 | - * |
|
| 313 | - * Les jointures par défaut de la table sont complétées en priorité |
|
| 314 | - * des jointures déclarées explicitement sur la boucle |
|
| 315 | - * |
|
| 316 | - * @see base_trouver_table_dist() |
|
| 317 | - * @var array |
|
| 318 | - */ |
|
| 319 | - public $jointures = []; |
|
| 320 | - |
|
| 321 | - /** |
|
| 322 | - * Jointures explicites avec cette table |
|
| 323 | - * |
|
| 324 | - * Ces jointures sont utilisées en priorité par rapport aux jointures |
|
| 325 | - * normales possibles pour retrouver les colonnes demandées extérieures |
|
| 326 | - * à la boucle. |
|
| 327 | - * |
|
| 328 | - * @var string|bool |
|
| 329 | - */ |
|
| 330 | - public $jointures_explicites = false; |
|
| 331 | - |
|
| 332 | - /** |
|
| 333 | - * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index" |
|
| 334 | - * |
|
| 335 | - * @var string|null |
|
| 336 | - */ |
|
| 337 | - public $doublons; |
|
| 338 | - |
|
| 339 | - /** |
|
| 340 | - * Code PHP ajouté au début de chaque itération de boucle. |
|
| 341 | - * |
|
| 342 | - * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}... |
|
| 343 | - * |
|
| 344 | - * @var string |
|
| 345 | - */ |
|
| 346 | - public $partie = ''; |
|
| 347 | - |
|
| 348 | - /** |
|
| 349 | - * Nombre de divisions de la boucle, d'éléments à afficher, |
|
| 350 | - * ou de soustractions d'éléments à faire |
|
| 351 | - * |
|
| 352 | - * Dans les critères limitant le nombre d'éléments affichés |
|
| 353 | - * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties. |
|
| 354 | - * |
|
| 355 | - * @var string |
|
| 356 | - */ |
|
| 357 | - public $total_parties = ''; |
|
| 358 | - |
|
| 359 | - /** |
|
| 360 | - * Code PHP ajouté avant l'itération de boucle. |
|
| 361 | - * |
|
| 362 | - * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b} |
|
| 363 | - * pour initialiser les variables de début et de fin d'itération. |
|
| 364 | - * |
|
| 365 | - * @var string |
|
| 366 | - */ |
|
| 367 | - public $mode_partie = ''; |
|
| 368 | - |
|
| 369 | - /** |
|
| 370 | - * Identifiant d'une boucle qui appelle celle-ci de manière récursive |
|
| 371 | - * |
|
| 372 | - * Si une boucle est appelée de manière récursive quelque part par |
|
| 373 | - * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette |
|
| 374 | - * boucle (identifiant) reçoit dans cette propriété l'identifiant |
|
| 375 | - * de l'appelant (rec) |
|
| 376 | - * |
|
| 377 | - * @var string |
|
| 378 | - */ |
|
| 379 | - public $externe = ''; |
|
| 380 | - |
|
| 381 | - // champs pour la construction de la requete SQL |
|
| 382 | - |
|
| 383 | - /** |
|
| 384 | - * Liste des champs à récupérer par la boucle |
|
| 385 | - * |
|
| 386 | - * Expression 'table.nom_champ' ou calculée 'nom_champ AS x' |
|
| 387 | - * |
|
| 388 | - * @var string[] |
|
| 389 | - */ |
|
| 390 | - public $select = []; |
|
| 391 | - |
|
| 392 | - /** |
|
| 393 | - * Liste des alias / tables SQL utilisées dans la boucle |
|
| 394 | - * |
|
| 395 | - * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira |
|
| 396 | - * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée. |
|
| 397 | - * |
|
| 398 | - * L'index 0 peut définir le type de sources de données de l'itérateur DATA |
|
| 399 | - * |
|
| 400 | - * @var string[] |
|
| 401 | - */ |
|
| 402 | - public $from = []; |
|
| 403 | - |
|
| 404 | - /** |
|
| 405 | - * Liste des alias / type de jointures utilisées dans la boucle |
|
| 406 | - * |
|
| 407 | - * L'index est le nom d'alias (comme pour la propriété $from), et la valeur |
|
| 408 | - * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'. |
|
| 409 | - * |
|
| 410 | - * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER' |
|
| 411 | - * qui sera utilisé par défaut (créant donc un INNER JOIN). |
|
| 412 | - * |
|
| 413 | - * @var string[] |
|
| 414 | - */ |
|
| 415 | - public $from_type = []; |
|
| 416 | - |
|
| 417 | - /** |
|
| 418 | - * Liste des conditions WHERE de la boucle |
|
| 419 | - * |
|
| 420 | - * Permet de restreindre les éléments retournés par une boucle |
|
| 421 | - * en fonctions des conditions transmises dans ce tableau. |
|
| 422 | - * |
|
| 423 | - * Ce tableau peut avoir plusieurs niveaux de profondeur. |
|
| 424 | - * |
|
| 425 | - * Les éléments du premier niveau sont reliés par des AND, donc |
|
| 426 | - * chaque élément ajouté directement au where par |
|
| 427 | - * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'" |
|
| 428 | - * est une condition AND en plus. |
|
| 429 | - * |
|
| 430 | - * Par contre, lorsqu'on indique un tableau, il peut décrire des relations |
|
| 431 | - * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs : |
|
| 432 | - * $expr = array(operateur, val1, val2) |
|
| 433 | - * |
|
| 434 | - * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur |
|
| 435 | - * à réaliser tel que : |
|
| 436 | - * |
|
| 437 | - * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... : |
|
| 438 | - * val1 et val2 sont des champs et valeurs à utiliser dans la comparaison |
|
| 439 | - * suivant cet ordre : "val1 operateur val2". |
|
| 440 | - * Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'"); |
|
| 441 | - * - "'AND'", "'OR'", "'NOT'" : |
|
| 442 | - * dans ce cas val1 et val2 sont également des expressions |
|
| 443 | - * de comparaison complètes, et peuvent être eux-même des tableaux comme $expr |
|
| 444 | - * Exemples : |
|
| 445 | - * $boucle->where[] = array("'OR'", $expr1, $expr2); |
|
| 446 | - * $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT |
|
| 447 | - * |
|
| 448 | - * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) : |
|
| 449 | - * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes |
|
| 450 | - * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3) |
|
| 451 | - * |
|
| 452 | - * @var array |
|
| 453 | - */ |
|
| 454 | - public $where = []; |
|
| 455 | - |
|
| 456 | - public $join = []; |
|
| 457 | - public $having = []; |
|
| 458 | - public $limit; |
|
| 459 | - public $group = []; |
|
| 460 | - public $order = []; |
|
| 461 | - public $default_order = []; |
|
| 462 | - public $date = 'date'; |
|
| 463 | - public $hash = ''; |
|
| 464 | - public $in = ''; |
|
| 465 | - public $sous_requete = false; |
|
| 466 | - |
|
| 467 | - /** |
|
| 468 | - * Code PHP qui sera ajouté en tout début de la fonction de boucle |
|
| 469 | - * |
|
| 470 | - * Il sert à insérer le code calculant une hierarchie |
|
| 471 | - * |
|
| 472 | - * @var string |
|
| 473 | - */ |
|
| 474 | - public $hierarchie = ''; |
|
| 475 | - |
|
| 476 | - // champs pour la construction du corps PHP |
|
| 477 | - |
|
| 478 | - /** |
|
| 479 | - * Description des sources de données de la boucle |
|
| 480 | - * |
|
| 481 | - * Description des données de la boucle issu de trouver_table |
|
| 482 | - * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'. |
|
| 483 | - * |
|
| 484 | - * @see base_trouver_table_dist() |
|
| 485 | - * @var array |
|
| 486 | - */ |
|
| 487 | - public $show = []; |
|
| 488 | - |
|
| 489 | - /** |
|
| 490 | - * Nom de la table SQL principale de la boucle, sans son préfixe |
|
| 491 | - * |
|
| 492 | - * @var string |
|
| 493 | - */ |
|
| 494 | - public $id_table; |
|
| 495 | - |
|
| 496 | - /** |
|
| 497 | - * Nom de la clé primaire de la table SQL principale de la boucle |
|
| 498 | - * |
|
| 499 | - * @var string |
|
| 500 | - */ |
|
| 501 | - public $primary; |
|
| 502 | - |
|
| 503 | - /** |
|
| 504 | - * Code PHP compilé de la boucle |
|
| 505 | - * |
|
| 506 | - * @var string |
|
| 507 | - */ |
|
| 508 | - public $return; |
|
| 509 | - |
|
| 510 | - public $numrows = false; |
|
| 511 | - public $cptrows = false; |
|
| 512 | - |
|
| 513 | - /** |
|
| 514 | - * Description du squelette |
|
| 515 | - * |
|
| 516 | - * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 517 | - * |
|
| 518 | - * Peut contenir les index : |
|
| 519 | - * |
|
| 520 | - * - nom : Nom du fichier de cache |
|
| 521 | - * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 522 | - * - sourcefile : Chemin du squelette |
|
| 523 | - * - squelette : Code du squelette |
|
| 524 | - * - id_mere : Identifiant de la boucle parente |
|
| 525 | - * - documents : Pour embed et img dans les textes |
|
| 526 | - * - session : Pour un cache sessionné par auteur |
|
| 527 | - * - niv : Niveau de tabulation |
|
| 528 | - * |
|
| 529 | - * @var array |
|
| 530 | - */ |
|
| 531 | - public $descr = []; |
|
| 532 | - |
|
| 533 | - /** |
|
| 534 | - * Numéro de ligne dans le code source du squelette |
|
| 535 | - * |
|
| 536 | - * @var int |
|
| 537 | - */ |
|
| 538 | - public $ligne = 0; |
|
| 539 | - |
|
| 540 | - |
|
| 541 | - public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement |
|
| 542 | - |
|
| 543 | - /** |
|
| 544 | - * Type d'itérateur utilisé pour cette boucle |
|
| 545 | - * |
|
| 546 | - * - 'SQL' dans le cadre d'une boucle sur une table SQL |
|
| 547 | - * - 'DATA' pour l'itérateur DATA, ... |
|
| 548 | - * |
|
| 549 | - * @var string |
|
| 550 | - */ |
|
| 551 | - public $iterateur = ''; // type d'iterateur |
|
| 552 | - |
|
| 553 | - /** |
|
| 554 | - * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug |
|
| 555 | - */ |
|
| 556 | - public $debug = []; |
|
| 557 | - |
|
| 558 | - /** |
|
| 559 | - * Index de la boucle dont le champ présent dans cette boucle est originaire, |
|
| 560 | - * notamment si le champ a été trouve dans une boucle parente |
|
| 561 | - * |
|
| 562 | - * Tableau nom du champ => index de boucle |
|
| 563 | - * |
|
| 564 | - * @var array $index_champ |
|
| 565 | - */ |
|
| 566 | - public $index_champ = []; |
|
| 567 | - |
|
| 568 | - // obsoletes, conserves provisoirement pour compatibilite |
|
| 569 | - public $tout = false; |
|
| 570 | - public $plat = false; |
|
| 571 | - public $lien = false; |
|
| 192 | + /** |
|
| 193 | + * Type de noeud |
|
| 194 | + * |
|
| 195 | + * @var string |
|
| 196 | + */ |
|
| 197 | + public $type = 'boucle'; |
|
| 198 | + |
|
| 199 | + /** |
|
| 200 | + * Identifiant de la boucle |
|
| 201 | + * |
|
| 202 | + * @var string |
|
| 203 | + */ |
|
| 204 | + public $id_boucle; |
|
| 205 | + |
|
| 206 | + /** |
|
| 207 | + * Identifiant de la boucle parente |
|
| 208 | + * |
|
| 209 | + * @var string |
|
| 210 | + */ |
|
| 211 | + public $id_parent = ''; |
|
| 212 | + |
|
| 213 | + /** |
|
| 214 | + * Partie avant toujours affichee |
|
| 215 | + * |
|
| 216 | + * @var string|array |
|
| 217 | + */ |
|
| 218 | + public $preaff = ''; |
|
| 219 | + |
|
| 220 | + /** |
|
| 221 | + * Partie optionnelle avant |
|
| 222 | + * |
|
| 223 | + * @var string|array |
|
| 224 | + */ |
|
| 225 | + public $avant = ''; |
|
| 226 | + |
|
| 227 | + /** |
|
| 228 | + * Pour chaque élément |
|
| 229 | + * |
|
| 230 | + * @var string|array |
|
| 231 | + */ |
|
| 232 | + public $milieu = ''; |
|
| 233 | + |
|
| 234 | + /** |
|
| 235 | + * Partie optionnelle après |
|
| 236 | + * |
|
| 237 | + * @var string|array |
|
| 238 | + */ |
|
| 239 | + public $apres = ''; |
|
| 240 | + |
|
| 241 | + /** |
|
| 242 | + * Partie alternative, si pas de résultat dans la boucle |
|
| 243 | + * |
|
| 244 | + * @var string|array |
|
| 245 | + */ |
|
| 246 | + public $altern = ''; |
|
| 247 | + |
|
| 248 | + /** |
|
| 249 | + * Partie apres toujours affichee |
|
| 250 | + * |
|
| 251 | + * @var string|array |
|
| 252 | + */ |
|
| 253 | + public $postaff = ''; |
|
| 254 | + |
|
| 255 | + |
|
| 256 | + /** |
|
| 257 | + * La boucle doit-elle sélectionner la langue ? |
|
| 258 | + * |
|
| 259 | + * @var string|null |
|
| 260 | + */ |
|
| 261 | + public $lang_select; |
|
| 262 | + |
|
| 263 | + /** |
|
| 264 | + * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 265 | + * |
|
| 266 | + * @var string|null |
|
| 267 | + */ |
|
| 268 | + public $type_requete; |
|
| 269 | + |
|
| 270 | + /** |
|
| 271 | + * La table est elle optionnelle ? |
|
| 272 | + * |
|
| 273 | + * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente |
|
| 274 | + * |
|
| 275 | + * @var bool |
|
| 276 | + */ |
|
| 277 | + public $table_optionnelle = false; |
|
| 278 | + |
|
| 279 | + /** |
|
| 280 | + * Nom du fichier de connexion |
|
| 281 | + * |
|
| 282 | + * @var string |
|
| 283 | + */ |
|
| 284 | + public $sql_serveur = ''; |
|
| 285 | + |
|
| 286 | + /** |
|
| 287 | + * Paramètres de la boucle |
|
| 288 | + * |
|
| 289 | + * Description des paramètres passés à la boucle, qui servent ensuite |
|
| 290 | + * au calcul des critères |
|
| 291 | + * |
|
| 292 | + * @var array |
|
| 293 | + */ |
|
| 294 | + public $param = []; |
|
| 295 | + |
|
| 296 | + /** |
|
| 297 | + * Critères de la boucle |
|
| 298 | + * |
|
| 299 | + * @var Critere[] |
|
| 300 | + */ |
|
| 301 | + public $criteres = []; |
|
| 302 | + |
|
| 303 | + /** |
|
| 304 | + * Textes insérés entre 2 éléments de boucle (critère inter) |
|
| 305 | + * |
|
| 306 | + * @var string[] |
|
| 307 | + */ |
|
| 308 | + public $separateur = []; |
|
| 309 | + |
|
| 310 | + /** |
|
| 311 | + * Liste des jointures possibles avec cette table |
|
| 312 | + * |
|
| 313 | + * Les jointures par défaut de la table sont complétées en priorité |
|
| 314 | + * des jointures déclarées explicitement sur la boucle |
|
| 315 | + * |
|
| 316 | + * @see base_trouver_table_dist() |
|
| 317 | + * @var array |
|
| 318 | + */ |
|
| 319 | + public $jointures = []; |
|
| 320 | + |
|
| 321 | + /** |
|
| 322 | + * Jointures explicites avec cette table |
|
| 323 | + * |
|
| 324 | + * Ces jointures sont utilisées en priorité par rapport aux jointures |
|
| 325 | + * normales possibles pour retrouver les colonnes demandées extérieures |
|
| 326 | + * à la boucle. |
|
| 327 | + * |
|
| 328 | + * @var string|bool |
|
| 329 | + */ |
|
| 330 | + public $jointures_explicites = false; |
|
| 331 | + |
|
| 332 | + /** |
|
| 333 | + * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index" |
|
| 334 | + * |
|
| 335 | + * @var string|null |
|
| 336 | + */ |
|
| 337 | + public $doublons; |
|
| 338 | + |
|
| 339 | + /** |
|
| 340 | + * Code PHP ajouté au début de chaque itération de boucle. |
|
| 341 | + * |
|
| 342 | + * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}... |
|
| 343 | + * |
|
| 344 | + * @var string |
|
| 345 | + */ |
|
| 346 | + public $partie = ''; |
|
| 347 | + |
|
| 348 | + /** |
|
| 349 | + * Nombre de divisions de la boucle, d'éléments à afficher, |
|
| 350 | + * ou de soustractions d'éléments à faire |
|
| 351 | + * |
|
| 352 | + * Dans les critères limitant le nombre d'éléments affichés |
|
| 353 | + * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties. |
|
| 354 | + * |
|
| 355 | + * @var string |
|
| 356 | + */ |
|
| 357 | + public $total_parties = ''; |
|
| 358 | + |
|
| 359 | + /** |
|
| 360 | + * Code PHP ajouté avant l'itération de boucle. |
|
| 361 | + * |
|
| 362 | + * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b} |
|
| 363 | + * pour initialiser les variables de début et de fin d'itération. |
|
| 364 | + * |
|
| 365 | + * @var string |
|
| 366 | + */ |
|
| 367 | + public $mode_partie = ''; |
|
| 368 | + |
|
| 369 | + /** |
|
| 370 | + * Identifiant d'une boucle qui appelle celle-ci de manière récursive |
|
| 371 | + * |
|
| 372 | + * Si une boucle est appelée de manière récursive quelque part par |
|
| 373 | + * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette |
|
| 374 | + * boucle (identifiant) reçoit dans cette propriété l'identifiant |
|
| 375 | + * de l'appelant (rec) |
|
| 376 | + * |
|
| 377 | + * @var string |
|
| 378 | + */ |
|
| 379 | + public $externe = ''; |
|
| 380 | + |
|
| 381 | + // champs pour la construction de la requete SQL |
|
| 382 | + |
|
| 383 | + /** |
|
| 384 | + * Liste des champs à récupérer par la boucle |
|
| 385 | + * |
|
| 386 | + * Expression 'table.nom_champ' ou calculée 'nom_champ AS x' |
|
| 387 | + * |
|
| 388 | + * @var string[] |
|
| 389 | + */ |
|
| 390 | + public $select = []; |
|
| 391 | + |
|
| 392 | + /** |
|
| 393 | + * Liste des alias / tables SQL utilisées dans la boucle |
|
| 394 | + * |
|
| 395 | + * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira |
|
| 396 | + * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée. |
|
| 397 | + * |
|
| 398 | + * L'index 0 peut définir le type de sources de données de l'itérateur DATA |
|
| 399 | + * |
|
| 400 | + * @var string[] |
|
| 401 | + */ |
|
| 402 | + public $from = []; |
|
| 403 | + |
|
| 404 | + /** |
|
| 405 | + * Liste des alias / type de jointures utilisées dans la boucle |
|
| 406 | + * |
|
| 407 | + * L'index est le nom d'alias (comme pour la propriété $from), et la valeur |
|
| 408 | + * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'. |
|
| 409 | + * |
|
| 410 | + * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER' |
|
| 411 | + * qui sera utilisé par défaut (créant donc un INNER JOIN). |
|
| 412 | + * |
|
| 413 | + * @var string[] |
|
| 414 | + */ |
|
| 415 | + public $from_type = []; |
|
| 416 | + |
|
| 417 | + /** |
|
| 418 | + * Liste des conditions WHERE de la boucle |
|
| 419 | + * |
|
| 420 | + * Permet de restreindre les éléments retournés par une boucle |
|
| 421 | + * en fonctions des conditions transmises dans ce tableau. |
|
| 422 | + * |
|
| 423 | + * Ce tableau peut avoir plusieurs niveaux de profondeur. |
|
| 424 | + * |
|
| 425 | + * Les éléments du premier niveau sont reliés par des AND, donc |
|
| 426 | + * chaque élément ajouté directement au where par |
|
| 427 | + * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'" |
|
| 428 | + * est une condition AND en plus. |
|
| 429 | + * |
|
| 430 | + * Par contre, lorsqu'on indique un tableau, il peut décrire des relations |
|
| 431 | + * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs : |
|
| 432 | + * $expr = array(operateur, val1, val2) |
|
| 433 | + * |
|
| 434 | + * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur |
|
| 435 | + * à réaliser tel que : |
|
| 436 | + * |
|
| 437 | + * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... : |
|
| 438 | + * val1 et val2 sont des champs et valeurs à utiliser dans la comparaison |
|
| 439 | + * suivant cet ordre : "val1 operateur val2". |
|
| 440 | + * Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'"); |
|
| 441 | + * - "'AND'", "'OR'", "'NOT'" : |
|
| 442 | + * dans ce cas val1 et val2 sont également des expressions |
|
| 443 | + * de comparaison complètes, et peuvent être eux-même des tableaux comme $expr |
|
| 444 | + * Exemples : |
|
| 445 | + * $boucle->where[] = array("'OR'", $expr1, $expr2); |
|
| 446 | + * $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT |
|
| 447 | + * |
|
| 448 | + * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) : |
|
| 449 | + * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes |
|
| 450 | + * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3) |
|
| 451 | + * |
|
| 452 | + * @var array |
|
| 453 | + */ |
|
| 454 | + public $where = []; |
|
| 455 | + |
|
| 456 | + public $join = []; |
|
| 457 | + public $having = []; |
|
| 458 | + public $limit; |
|
| 459 | + public $group = []; |
|
| 460 | + public $order = []; |
|
| 461 | + public $default_order = []; |
|
| 462 | + public $date = 'date'; |
|
| 463 | + public $hash = ''; |
|
| 464 | + public $in = ''; |
|
| 465 | + public $sous_requete = false; |
|
| 466 | + |
|
| 467 | + /** |
|
| 468 | + * Code PHP qui sera ajouté en tout début de la fonction de boucle |
|
| 469 | + * |
|
| 470 | + * Il sert à insérer le code calculant une hierarchie |
|
| 471 | + * |
|
| 472 | + * @var string |
|
| 473 | + */ |
|
| 474 | + public $hierarchie = ''; |
|
| 475 | + |
|
| 476 | + // champs pour la construction du corps PHP |
|
| 477 | + |
|
| 478 | + /** |
|
| 479 | + * Description des sources de données de la boucle |
|
| 480 | + * |
|
| 481 | + * Description des données de la boucle issu de trouver_table |
|
| 482 | + * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'. |
|
| 483 | + * |
|
| 484 | + * @see base_trouver_table_dist() |
|
| 485 | + * @var array |
|
| 486 | + */ |
|
| 487 | + public $show = []; |
|
| 488 | + |
|
| 489 | + /** |
|
| 490 | + * Nom de la table SQL principale de la boucle, sans son préfixe |
|
| 491 | + * |
|
| 492 | + * @var string |
|
| 493 | + */ |
|
| 494 | + public $id_table; |
|
| 495 | + |
|
| 496 | + /** |
|
| 497 | + * Nom de la clé primaire de la table SQL principale de la boucle |
|
| 498 | + * |
|
| 499 | + * @var string |
|
| 500 | + */ |
|
| 501 | + public $primary; |
|
| 502 | + |
|
| 503 | + /** |
|
| 504 | + * Code PHP compilé de la boucle |
|
| 505 | + * |
|
| 506 | + * @var string |
|
| 507 | + */ |
|
| 508 | + public $return; |
|
| 509 | + |
|
| 510 | + public $numrows = false; |
|
| 511 | + public $cptrows = false; |
|
| 512 | + |
|
| 513 | + /** |
|
| 514 | + * Description du squelette |
|
| 515 | + * |
|
| 516 | + * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 517 | + * |
|
| 518 | + * Peut contenir les index : |
|
| 519 | + * |
|
| 520 | + * - nom : Nom du fichier de cache |
|
| 521 | + * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 522 | + * - sourcefile : Chemin du squelette |
|
| 523 | + * - squelette : Code du squelette |
|
| 524 | + * - id_mere : Identifiant de la boucle parente |
|
| 525 | + * - documents : Pour embed et img dans les textes |
|
| 526 | + * - session : Pour un cache sessionné par auteur |
|
| 527 | + * - niv : Niveau de tabulation |
|
| 528 | + * |
|
| 529 | + * @var array |
|
| 530 | + */ |
|
| 531 | + public $descr = []; |
|
| 532 | + |
|
| 533 | + /** |
|
| 534 | + * Numéro de ligne dans le code source du squelette |
|
| 535 | + * |
|
| 536 | + * @var int |
|
| 537 | + */ |
|
| 538 | + public $ligne = 0; |
|
| 539 | + |
|
| 540 | + |
|
| 541 | + public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement |
|
| 542 | + |
|
| 543 | + /** |
|
| 544 | + * Type d'itérateur utilisé pour cette boucle |
|
| 545 | + * |
|
| 546 | + * - 'SQL' dans le cadre d'une boucle sur une table SQL |
|
| 547 | + * - 'DATA' pour l'itérateur DATA, ... |
|
| 548 | + * |
|
| 549 | + * @var string |
|
| 550 | + */ |
|
| 551 | + public $iterateur = ''; // type d'iterateur |
|
| 552 | + |
|
| 553 | + /** |
|
| 554 | + * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug |
|
| 555 | + */ |
|
| 556 | + public $debug = []; |
|
| 557 | + |
|
| 558 | + /** |
|
| 559 | + * Index de la boucle dont le champ présent dans cette boucle est originaire, |
|
| 560 | + * notamment si le champ a été trouve dans une boucle parente |
|
| 561 | + * |
|
| 562 | + * Tableau nom du champ => index de boucle |
|
| 563 | + * |
|
| 564 | + * @var array $index_champ |
|
| 565 | + */ |
|
| 566 | + public $index_champ = []; |
|
| 567 | + |
|
| 568 | + // obsoletes, conserves provisoirement pour compatibilite |
|
| 569 | + public $tout = false; |
|
| 570 | + public $plat = false; |
|
| 571 | + public $lien = false; |
|
| 572 | 572 | } |
| 573 | 573 | |
| 574 | 574 | /** |
@@ -579,56 +579,56 @@ discard block |
||
| 579 | 579 | * @package SPIP\Core\Compilateur\AST |
| 580 | 580 | **/ |
| 581 | 581 | class Critere { |
| 582 | - /** |
|
| 583 | - * Type de noeud |
|
| 584 | - * |
|
| 585 | - * @var string |
|
| 586 | - */ |
|
| 587 | - public $type = 'critere'; |
|
| 588 | - |
|
| 589 | - /** |
|
| 590 | - * Opérateur (>, <, >=, IN, ...) |
|
| 591 | - * |
|
| 592 | - * @var null|string |
|
| 593 | - */ |
|
| 594 | - public $op; |
|
| 595 | - |
|
| 596 | - /** |
|
| 597 | - * Présence d'une négation (truc !op valeur) |
|
| 598 | - * |
|
| 599 | - * @var null|string |
|
| 600 | - */ |
|
| 601 | - public $not; |
|
| 602 | - |
|
| 603 | - /** |
|
| 604 | - * Présence d'une exclusion (!truc op valeur) |
|
| 605 | - * |
|
| 606 | - * @var null|string |
|
| 607 | - */ |
|
| 608 | - public $exclus; |
|
| 609 | - |
|
| 610 | - /** |
|
| 611 | - * Présence d'une condition dans le critère (truc ?) |
|
| 612 | - * |
|
| 613 | - * @var bool |
|
| 614 | - */ |
|
| 615 | - public $cond = false; |
|
| 616 | - |
|
| 617 | - /** |
|
| 618 | - * Paramètres du critère |
|
| 619 | - * - $param[0] : élément avant l'opérateur |
|
| 620 | - * - $param[1..n] : éléments après l'opérateur |
|
| 621 | - * |
|
| 622 | - * @var array |
|
| 623 | - */ |
|
| 624 | - public $param = []; |
|
| 625 | - |
|
| 626 | - /** |
|
| 627 | - * Numéro de ligne dans le code source du squelette |
|
| 628 | - * |
|
| 629 | - * @var int |
|
| 630 | - */ |
|
| 631 | - public $ligne = 0; |
|
| 582 | + /** |
|
| 583 | + * Type de noeud |
|
| 584 | + * |
|
| 585 | + * @var string |
|
| 586 | + */ |
|
| 587 | + public $type = 'critere'; |
|
| 588 | + |
|
| 589 | + /** |
|
| 590 | + * Opérateur (>, <, >=, IN, ...) |
|
| 591 | + * |
|
| 592 | + * @var null|string |
|
| 593 | + */ |
|
| 594 | + public $op; |
|
| 595 | + |
|
| 596 | + /** |
|
| 597 | + * Présence d'une négation (truc !op valeur) |
|
| 598 | + * |
|
| 599 | + * @var null|string |
|
| 600 | + */ |
|
| 601 | + public $not; |
|
| 602 | + |
|
| 603 | + /** |
|
| 604 | + * Présence d'une exclusion (!truc op valeur) |
|
| 605 | + * |
|
| 606 | + * @var null|string |
|
| 607 | + */ |
|
| 608 | + public $exclus; |
|
| 609 | + |
|
| 610 | + /** |
|
| 611 | + * Présence d'une condition dans le critère (truc ?) |
|
| 612 | + * |
|
| 613 | + * @var bool |
|
| 614 | + */ |
|
| 615 | + public $cond = false; |
|
| 616 | + |
|
| 617 | + /** |
|
| 618 | + * Paramètres du critère |
|
| 619 | + * - $param[0] : élément avant l'opérateur |
|
| 620 | + * - $param[1..n] : éléments après l'opérateur |
|
| 621 | + * |
|
| 622 | + * @var array |
|
| 623 | + */ |
|
| 624 | + public $param = []; |
|
| 625 | + |
|
| 626 | + /** |
|
| 627 | + * Numéro de ligne dans le code source du squelette |
|
| 628 | + * |
|
| 629 | + * @var int |
|
| 630 | + */ |
|
| 631 | + public $ligne = 0; |
|
| 632 | 632 | } |
| 633 | 633 | |
| 634 | 634 | /** |
@@ -637,139 +637,139 @@ discard block |
||
| 637 | 637 | * @package SPIP\Core\Compilateur\AST |
| 638 | 638 | **/ |
| 639 | 639 | class Champ { |
| 640 | - /** |
|
| 641 | - * Type de noeud |
|
| 642 | - * |
|
| 643 | - * @var string |
|
| 644 | - */ |
|
| 645 | - public $type = 'champ'; |
|
| 646 | - |
|
| 647 | - /** |
|
| 648 | - * Nom du champ demandé. Exemple 'ID_ARTICLE' |
|
| 649 | - * |
|
| 650 | - * @var string|null |
|
| 651 | - */ |
|
| 652 | - public $nom_champ; |
|
| 653 | - |
|
| 654 | - /** |
|
| 655 | - * Identifiant de la boucle parente si explicité |
|
| 656 | - * |
|
| 657 | - * @var string|null |
|
| 658 | - */ |
|
| 659 | - public $nom_boucle = ''; |
|
| 660 | - |
|
| 661 | - /** |
|
| 662 | - * Partie optionnelle avant |
|
| 663 | - * |
|
| 664 | - * @var null|string|array |
|
| 665 | - */ |
|
| 666 | - public $avant; |
|
| 667 | - |
|
| 668 | - /** |
|
| 669 | - * Partie optionnelle après |
|
| 670 | - * |
|
| 671 | - * @var null|string|array |
|
| 672 | - */ |
|
| 673 | - public $apres; |
|
| 674 | - |
|
| 675 | - /** |
|
| 676 | - * Étoiles : annuler des automatismes |
|
| 677 | - * |
|
| 678 | - * - '*' annule les filtres automatiques |
|
| 679 | - * - '**' annule en plus les protections de scripts |
|
| 680 | - * |
|
| 681 | - * @var null|string |
|
| 682 | - */ |
|
| 683 | - public $etoile; |
|
| 684 | - |
|
| 685 | - /** |
|
| 686 | - * Arguments et filtres explicites sur la balise |
|
| 687 | - * |
|
| 688 | - * - $param[0] contient les arguments de la balise |
|
| 689 | - * - $param[1..n] contient les filtres à appliquer à la balise |
|
| 690 | - * |
|
| 691 | - * @var array |
|
| 692 | - */ |
|
| 693 | - public $param = []; |
|
| 694 | - |
|
| 695 | - /** |
|
| 696 | - * Source des filtres (compatibilité) (?) |
|
| 697 | - * |
|
| 698 | - * @var array|null |
|
| 699 | - */ |
|
| 700 | - public $fonctions = []; |
|
| 701 | - |
|
| 702 | - /** |
|
| 703 | - * Identifiant de la boucle |
|
| 704 | - * |
|
| 705 | - * @var string |
|
| 706 | - */ |
|
| 707 | - public $id_boucle = ''; |
|
| 708 | - |
|
| 709 | - /** |
|
| 710 | - * AST du squelette, liste de toutes les boucles |
|
| 711 | - * |
|
| 712 | - * @var Boucles[] |
|
| 713 | - */ |
|
| 714 | - public $boucles; |
|
| 715 | - |
|
| 716 | - /** |
|
| 717 | - * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 718 | - * |
|
| 719 | - * @var string|null |
|
| 720 | - */ |
|
| 721 | - public $type_requete; |
|
| 722 | - |
|
| 723 | - /** |
|
| 724 | - * Résultat de la compilation: toujours une expression PHP |
|
| 725 | - * |
|
| 726 | - * @var string |
|
| 727 | - */ |
|
| 728 | - public $code = ''; |
|
| 729 | - |
|
| 730 | - /** |
|
| 731 | - * Interdire les scripts |
|
| 732 | - * |
|
| 733 | - * false si on est sûr de cette balise |
|
| 734 | - * |
|
| 735 | - * @see interdire_scripts() |
|
| 736 | - * @var bool |
|
| 737 | - */ |
|
| 738 | - public $interdire_scripts = true; |
|
| 739 | - |
|
| 740 | - /** |
|
| 741 | - * Description du squelette |
|
| 742 | - * |
|
| 743 | - * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 744 | - * |
|
| 745 | - * Peut contenir les index : |
|
| 746 | - * |
|
| 747 | - * - nom : Nom du fichier de cache |
|
| 748 | - * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 749 | - * - sourcefile : Chemin du squelette |
|
| 750 | - * - squelette : Code du squelette |
|
| 751 | - * - id_mere : Identifiant de la boucle parente |
|
| 752 | - * - documents : Pour embed et img dans les textes |
|
| 753 | - * - session : Pour un cache sessionné par auteur |
|
| 754 | - * - niv : Niveau de tabulation |
|
| 755 | - * |
|
| 756 | - * @var array |
|
| 757 | - */ |
|
| 758 | - public $descr = []; |
|
| 759 | - |
|
| 760 | - /** |
|
| 761 | - * Numéro de ligne dans le code source du squelette |
|
| 762 | - * |
|
| 763 | - * @var int |
|
| 764 | - */ |
|
| 765 | - public $ligne = 0; |
|
| 766 | - |
|
| 767 | - /** |
|
| 768 | - * Drapeau pour reperer les balises calculées par une fonction explicite |
|
| 769 | - * |
|
| 770 | - * @var bool |
|
| 771 | - */ |
|
| 772 | - public $balise_calculee = false; |
|
| 640 | + /** |
|
| 641 | + * Type de noeud |
|
| 642 | + * |
|
| 643 | + * @var string |
|
| 644 | + */ |
|
| 645 | + public $type = 'champ'; |
|
| 646 | + |
|
| 647 | + /** |
|
| 648 | + * Nom du champ demandé. Exemple 'ID_ARTICLE' |
|
| 649 | + * |
|
| 650 | + * @var string|null |
|
| 651 | + */ |
|
| 652 | + public $nom_champ; |
|
| 653 | + |
|
| 654 | + /** |
|
| 655 | + * Identifiant de la boucle parente si explicité |
|
| 656 | + * |
|
| 657 | + * @var string|null |
|
| 658 | + */ |
|
| 659 | + public $nom_boucle = ''; |
|
| 660 | + |
|
| 661 | + /** |
|
| 662 | + * Partie optionnelle avant |
|
| 663 | + * |
|
| 664 | + * @var null|string|array |
|
| 665 | + */ |
|
| 666 | + public $avant; |
|
| 667 | + |
|
| 668 | + /** |
|
| 669 | + * Partie optionnelle après |
|
| 670 | + * |
|
| 671 | + * @var null|string|array |
|
| 672 | + */ |
|
| 673 | + public $apres; |
|
| 674 | + |
|
| 675 | + /** |
|
| 676 | + * Étoiles : annuler des automatismes |
|
| 677 | + * |
|
| 678 | + * - '*' annule les filtres automatiques |
|
| 679 | + * - '**' annule en plus les protections de scripts |
|
| 680 | + * |
|
| 681 | + * @var null|string |
|
| 682 | + */ |
|
| 683 | + public $etoile; |
|
| 684 | + |
|
| 685 | + /** |
|
| 686 | + * Arguments et filtres explicites sur la balise |
|
| 687 | + * |
|
| 688 | + * - $param[0] contient les arguments de la balise |
|
| 689 | + * - $param[1..n] contient les filtres à appliquer à la balise |
|
| 690 | + * |
|
| 691 | + * @var array |
|
| 692 | + */ |
|
| 693 | + public $param = []; |
|
| 694 | + |
|
| 695 | + /** |
|
| 696 | + * Source des filtres (compatibilité) (?) |
|
| 697 | + * |
|
| 698 | + * @var array|null |
|
| 699 | + */ |
|
| 700 | + public $fonctions = []; |
|
| 701 | + |
|
| 702 | + /** |
|
| 703 | + * Identifiant de la boucle |
|
| 704 | + * |
|
| 705 | + * @var string |
|
| 706 | + */ |
|
| 707 | + public $id_boucle = ''; |
|
| 708 | + |
|
| 709 | + /** |
|
| 710 | + * AST du squelette, liste de toutes les boucles |
|
| 711 | + * |
|
| 712 | + * @var Boucles[] |
|
| 713 | + */ |
|
| 714 | + public $boucles; |
|
| 715 | + |
|
| 716 | + /** |
|
| 717 | + * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 718 | + * |
|
| 719 | + * @var string|null |
|
| 720 | + */ |
|
| 721 | + public $type_requete; |
|
| 722 | + |
|
| 723 | + /** |
|
| 724 | + * Résultat de la compilation: toujours une expression PHP |
|
| 725 | + * |
|
| 726 | + * @var string |
|
| 727 | + */ |
|
| 728 | + public $code = ''; |
|
| 729 | + |
|
| 730 | + /** |
|
| 731 | + * Interdire les scripts |
|
| 732 | + * |
|
| 733 | + * false si on est sûr de cette balise |
|
| 734 | + * |
|
| 735 | + * @see interdire_scripts() |
|
| 736 | + * @var bool |
|
| 737 | + */ |
|
| 738 | + public $interdire_scripts = true; |
|
| 739 | + |
|
| 740 | + /** |
|
| 741 | + * Description du squelette |
|
| 742 | + * |
|
| 743 | + * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 744 | + * |
|
| 745 | + * Peut contenir les index : |
|
| 746 | + * |
|
| 747 | + * - nom : Nom du fichier de cache |
|
| 748 | + * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 749 | + * - sourcefile : Chemin du squelette |
|
| 750 | + * - squelette : Code du squelette |
|
| 751 | + * - id_mere : Identifiant de la boucle parente |
|
| 752 | + * - documents : Pour embed et img dans les textes |
|
| 753 | + * - session : Pour un cache sessionné par auteur |
|
| 754 | + * - niv : Niveau de tabulation |
|
| 755 | + * |
|
| 756 | + * @var array |
|
| 757 | + */ |
|
| 758 | + public $descr = []; |
|
| 759 | + |
|
| 760 | + /** |
|
| 761 | + * Numéro de ligne dans le code source du squelette |
|
| 762 | + * |
|
| 763 | + * @var int |
|
| 764 | + */ |
|
| 765 | + public $ligne = 0; |
|
| 766 | + |
|
| 767 | + /** |
|
| 768 | + * Drapeau pour reperer les balises calculées par une fonction explicite |
|
| 769 | + * |
|
| 770 | + * @var bool |
|
| 771 | + */ |
|
| 772 | + public $balise_calculee = false; |
|
| 773 | 773 | } |
| 774 | 774 | |
| 775 | 775 | |
@@ -777,123 +777,123 @@ discard block |
||
| 777 | 777 | * Description d'une chaîne de langue |
| 778 | 778 | **/ |
| 779 | 779 | class Idiome { |
| 780 | - /** |
|
| 781 | - * Type de noeud |
|
| 782 | - * |
|
| 783 | - * @var string |
|
| 784 | - */ |
|
| 785 | - public $type = 'idiome'; |
|
| 786 | - |
|
| 787 | - /** |
|
| 788 | - * Clé de traduction demandée. Exemple 'item_oui' |
|
| 789 | - * |
|
| 790 | - * @var string |
|
| 791 | - */ |
|
| 792 | - public $nom_champ = ''; |
|
| 793 | - |
|
| 794 | - /** |
|
| 795 | - * Module de langue où chercher la clé de traduction. Exemple 'medias' |
|
| 796 | - * |
|
| 797 | - * @var string |
|
| 798 | - */ |
|
| 799 | - public $module = ''; |
|
| 800 | - |
|
| 801 | - /** |
|
| 802 | - * Arguments à passer à la chaîne |
|
| 803 | - * |
|
| 804 | - * @var array |
|
| 805 | - */ |
|
| 806 | - public $arg = []; |
|
| 807 | - |
|
| 808 | - /** |
|
| 809 | - * Filtres à appliquer au résultat |
|
| 810 | - * |
|
| 811 | - * @var array |
|
| 812 | - */ |
|
| 813 | - public $param = []; |
|
| 814 | - |
|
| 815 | - /** |
|
| 816 | - * Source des filtres (compatibilité) (?) |
|
| 817 | - * |
|
| 818 | - * @var array|null |
|
| 819 | - */ |
|
| 820 | - public $fonctions = []; |
|
| 821 | - |
|
| 822 | - /** |
|
| 823 | - * Inutilisé, propriété générique de l'AST |
|
| 824 | - * |
|
| 825 | - * @var string|array |
|
| 826 | - */ |
|
| 827 | - public $avant = ''; |
|
| 828 | - |
|
| 829 | - /** |
|
| 830 | - * Inutilisé, propriété générique de l'AST |
|
| 831 | - * |
|
| 832 | - * @var string|array |
|
| 833 | - */ |
|
| 834 | - public $apres = ''; |
|
| 835 | - |
|
| 836 | - /** |
|
| 837 | - * Identifiant de la boucle |
|
| 838 | - * |
|
| 839 | - * @var string |
|
| 840 | - */ |
|
| 841 | - public $id_boucle = ''; |
|
| 842 | - |
|
| 843 | - /** |
|
| 844 | - * AST du squelette, liste de toutes les boucles |
|
| 845 | - * |
|
| 846 | - * @var Boucles[] |
|
| 847 | - */ |
|
| 848 | - public $boucles; |
|
| 849 | - |
|
| 850 | - /** |
|
| 851 | - * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 852 | - * |
|
| 853 | - * @var string|null |
|
| 854 | - */ |
|
| 855 | - public $type_requete; |
|
| 856 | - |
|
| 857 | - /** |
|
| 858 | - * Résultat de la compilation: toujours une expression PHP |
|
| 859 | - * |
|
| 860 | - * @var string |
|
| 861 | - */ |
|
| 862 | - public $code = ''; |
|
| 863 | - |
|
| 864 | - /** |
|
| 865 | - * Interdire les scripts |
|
| 866 | - * |
|
| 867 | - * @see interdire_scripts() |
|
| 868 | - * @var bool |
|
| 869 | - */ |
|
| 870 | - public $interdire_scripts = false; |
|
| 871 | - |
|
| 872 | - /** |
|
| 873 | - * Description du squelette |
|
| 874 | - * |
|
| 875 | - * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 876 | - * |
|
| 877 | - * Peut contenir les index : |
|
| 878 | - * - nom : Nom du fichier de cache |
|
| 879 | - * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 880 | - * - sourcefile : Chemin du squelette |
|
| 881 | - * - squelette : Code du squelette |
|
| 882 | - * - id_mere : Identifiant de la boucle parente |
|
| 883 | - * - documents : Pour embed et img dans les textes |
|
| 884 | - * - session : Pour un cache sessionné par auteur |
|
| 885 | - * - niv : Niveau de tabulation |
|
| 886 | - * |
|
| 887 | - * @var array |
|
| 888 | - */ |
|
| 889 | - public $descr = []; |
|
| 890 | - |
|
| 891 | - /** |
|
| 892 | - * Numéro de ligne dans le code source du squelette |
|
| 893 | - * |
|
| 894 | - * @var int |
|
| 895 | - */ |
|
| 896 | - public $ligne = 0; |
|
| 780 | + /** |
|
| 781 | + * Type de noeud |
|
| 782 | + * |
|
| 783 | + * @var string |
|
| 784 | + */ |
|
| 785 | + public $type = 'idiome'; |
|
| 786 | + |
|
| 787 | + /** |
|
| 788 | + * Clé de traduction demandée. Exemple 'item_oui' |
|
| 789 | + * |
|
| 790 | + * @var string |
|
| 791 | + */ |
|
| 792 | + public $nom_champ = ''; |
|
| 793 | + |
|
| 794 | + /** |
|
| 795 | + * Module de langue où chercher la clé de traduction. Exemple 'medias' |
|
| 796 | + * |
|
| 797 | + * @var string |
|
| 798 | + */ |
|
| 799 | + public $module = ''; |
|
| 800 | + |
|
| 801 | + /** |
|
| 802 | + * Arguments à passer à la chaîne |
|
| 803 | + * |
|
| 804 | + * @var array |
|
| 805 | + */ |
|
| 806 | + public $arg = []; |
|
| 807 | + |
|
| 808 | + /** |
|
| 809 | + * Filtres à appliquer au résultat |
|
| 810 | + * |
|
| 811 | + * @var array |
|
| 812 | + */ |
|
| 813 | + public $param = []; |
|
| 814 | + |
|
| 815 | + /** |
|
| 816 | + * Source des filtres (compatibilité) (?) |
|
| 817 | + * |
|
| 818 | + * @var array|null |
|
| 819 | + */ |
|
| 820 | + public $fonctions = []; |
|
| 821 | + |
|
| 822 | + /** |
|
| 823 | + * Inutilisé, propriété générique de l'AST |
|
| 824 | + * |
|
| 825 | + * @var string|array |
|
| 826 | + */ |
|
| 827 | + public $avant = ''; |
|
| 828 | + |
|
| 829 | + /** |
|
| 830 | + * Inutilisé, propriété générique de l'AST |
|
| 831 | + * |
|
| 832 | + * @var string|array |
|
| 833 | + */ |
|
| 834 | + public $apres = ''; |
|
| 835 | + |
|
| 836 | + /** |
|
| 837 | + * Identifiant de la boucle |
|
| 838 | + * |
|
| 839 | + * @var string |
|
| 840 | + */ |
|
| 841 | + public $id_boucle = ''; |
|
| 842 | + |
|
| 843 | + /** |
|
| 844 | + * AST du squelette, liste de toutes les boucles |
|
| 845 | + * |
|
| 846 | + * @var Boucles[] |
|
| 847 | + */ |
|
| 848 | + public $boucles; |
|
| 849 | + |
|
| 850 | + /** |
|
| 851 | + * Alias de table d'application de la requête ou nom complet de la table SQL |
|
| 852 | + * |
|
| 853 | + * @var string|null |
|
| 854 | + */ |
|
| 855 | + public $type_requete; |
|
| 856 | + |
|
| 857 | + /** |
|
| 858 | + * Résultat de la compilation: toujours une expression PHP |
|
| 859 | + * |
|
| 860 | + * @var string |
|
| 861 | + */ |
|
| 862 | + public $code = ''; |
|
| 863 | + |
|
| 864 | + /** |
|
| 865 | + * Interdire les scripts |
|
| 866 | + * |
|
| 867 | + * @see interdire_scripts() |
|
| 868 | + * @var bool |
|
| 869 | + */ |
|
| 870 | + public $interdire_scripts = false; |
|
| 871 | + |
|
| 872 | + /** |
|
| 873 | + * Description du squelette |
|
| 874 | + * |
|
| 875 | + * Sert pour la gestion d'erreur et la production de code dependant du contexte |
|
| 876 | + * |
|
| 877 | + * Peut contenir les index : |
|
| 878 | + * - nom : Nom du fichier de cache |
|
| 879 | + * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) |
|
| 880 | + * - sourcefile : Chemin du squelette |
|
| 881 | + * - squelette : Code du squelette |
|
| 882 | + * - id_mere : Identifiant de la boucle parente |
|
| 883 | + * - documents : Pour embed et img dans les textes |
|
| 884 | + * - session : Pour un cache sessionné par auteur |
|
| 885 | + * - niv : Niveau de tabulation |
|
| 886 | + * |
|
| 887 | + * @var array |
|
| 888 | + */ |
|
| 889 | + public $descr = []; |
|
| 890 | + |
|
| 891 | + /** |
|
| 892 | + * Numéro de ligne dans le code source du squelette |
|
| 893 | + * |
|
| 894 | + * @var int |
|
| 895 | + */ |
|
| 896 | + public $ligne = 0; |
|
| 897 | 897 | } |
| 898 | 898 | |
| 899 | 899 | /** |
@@ -902,28 +902,28 @@ discard block |
||
| 902 | 902 | * @package SPIP\Core\Compilateur\AST |
| 903 | 903 | **/ |
| 904 | 904 | class Polyglotte { |
| 905 | - /** |
|
| 906 | - * Type de noeud |
|
| 907 | - * |
|
| 908 | - * @var string |
|
| 909 | - */ |
|
| 910 | - public $type = 'polyglotte'; |
|
| 911 | - |
|
| 912 | - /** |
|
| 913 | - * Tableau des traductions possibles classées par langue |
|
| 914 | - * |
|
| 915 | - * Tableau code de langue => texte |
|
| 916 | - * |
|
| 917 | - * @var array |
|
| 918 | - */ |
|
| 919 | - public $traductions = []; |
|
| 920 | - |
|
| 921 | - /** |
|
| 922 | - * Numéro de ligne dans le code source du squelette |
|
| 923 | - * |
|
| 924 | - * @var int |
|
| 925 | - */ |
|
| 926 | - public $ligne = 0; |
|
| 905 | + /** |
|
| 906 | + * Type de noeud |
|
| 907 | + * |
|
| 908 | + * @var string |
|
| 909 | + */ |
|
| 910 | + public $type = 'polyglotte'; |
|
| 911 | + |
|
| 912 | + /** |
|
| 913 | + * Tableau des traductions possibles classées par langue |
|
| 914 | + * |
|
| 915 | + * Tableau code de langue => texte |
|
| 916 | + * |
|
| 917 | + * @var array |
|
| 918 | + */ |
|
| 919 | + public $traductions = []; |
|
| 920 | + |
|
| 921 | + /** |
|
| 922 | + * Numéro de ligne dans le code source du squelette |
|
| 923 | + * |
|
| 924 | + * @var int |
|
| 925 | + */ |
|
| 926 | + public $ligne = 0; |
|
| 927 | 927 | } |
| 928 | 928 | |
| 929 | 929 | |
@@ -948,88 +948,88 @@ discard block |
||
| 948 | 948 | */ |
| 949 | 949 | function declarer_interfaces() { |
| 950 | 950 | |
| 951 | - $GLOBALS['table_des_tables']['articles'] = 'articles'; |
|
| 952 | - $GLOBALS['table_des_tables']['auteurs'] = 'auteurs'; |
|
| 953 | - $GLOBALS['table_des_tables']['rubriques'] = 'rubriques'; |
|
| 954 | - $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques'; |
|
| 955 | - |
|
| 956 | - // definition des statuts de publication |
|
| 957 | - $GLOBALS['table_statut'] = []; |
|
| 958 | - |
|
| 959 | - // |
|
| 960 | - // tableau des tables de jointures |
|
| 961 | - // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES) |
|
| 962 | - $GLOBALS['tables_jointures'] = []; |
|
| 963 | - $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens'; |
|
| 964 | - |
|
| 965 | - // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple |
|
| 966 | - $GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur']; |
|
| 967 | - |
|
| 968 | - |
|
| 969 | - if (!defined('_TRAITEMENT_TYPO')) { |
|
| 970 | - define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])'); |
|
| 971 | - } |
|
| 972 | - if (!defined('_TRAITEMENT_RACCOURCIS')) { |
|
| 973 | - define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])'); |
|
| 974 | - } |
|
| 975 | - if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) { |
|
| 976 | - define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))'); |
|
| 977 | - } |
|
| 978 | - $GLOBALS['table_des_traitements']['BIO'][] = _TRAITEMENT_RACCOURCIS; |
|
| 979 | - $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS; |
|
| 980 | - $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)'; |
|
| 981 | - $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)'; |
|
| 982 | - $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)'; |
|
| 983 | - $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)'; |
|
| 984 | - $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS; |
|
| 985 | - $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS; |
|
| 986 | - $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO; |
|
| 987 | - $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO; |
|
| 988 | - $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO; |
|
| 989 | - $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS; |
|
| 990 | - $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO; |
|
| 991 | - $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO; |
|
| 992 | - $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO; |
|
| 993 | - $GLOBALS['table_des_traitements']['TAGS'][] = '%s'; |
|
| 994 | - $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS; |
|
| 995 | - $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO; |
|
| 996 | - $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO; |
|
| 997 | - $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS; |
|
| 998 | - $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO; |
|
| 999 | - $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)'; |
|
| 1000 | - |
|
| 1001 | - // valeur par defaut pour les balises non listees ci-dessus |
|
| 1002 | - $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante |
|
| 1003 | - // toujours securiser les DATA |
|
| 1004 | - $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)'; |
|
| 1005 | - // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all * |
|
| 1006 | - $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)'; |
|
| 1007 | - |
|
| 1008 | - |
|
| 1009 | - // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales |
|
| 1010 | - $interfaces = pipeline( |
|
| 1011 | - 'declarer_tables_interfaces', |
|
| 1012 | - [ |
|
| 1013 | - 'table_des_tables' => $GLOBALS['table_des_tables'], |
|
| 1014 | - 'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'], |
|
| 1015 | - 'table_date' => $GLOBALS['table_date'], |
|
| 1016 | - 'table_titre' => $GLOBALS['table_titre'], |
|
| 1017 | - 'tables_jointures' => $GLOBALS['tables_jointures'], |
|
| 1018 | - 'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'], |
|
| 1019 | - 'table_des_traitements' => $GLOBALS['table_des_traitements'], |
|
| 1020 | - 'table_statut' => $GLOBALS['table_statut'], |
|
| 1021 | - ] |
|
| 1022 | - ); |
|
| 1023 | - if ($interfaces) { |
|
| 1024 | - $GLOBALS['table_des_tables'] = $interfaces['table_des_tables']; |
|
| 1025 | - $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables']; |
|
| 1026 | - $GLOBALS['table_date'] = $interfaces['table_date']; |
|
| 1027 | - $GLOBALS['table_titre'] = $interfaces['table_titre']; |
|
| 1028 | - $GLOBALS['tables_jointures'] = $interfaces['tables_jointures']; |
|
| 1029 | - $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures']; |
|
| 1030 | - $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements']; |
|
| 1031 | - $GLOBALS['table_statut'] = $interfaces['table_statut']; |
|
| 1032 | - } |
|
| 951 | + $GLOBALS['table_des_tables']['articles'] = 'articles'; |
|
| 952 | + $GLOBALS['table_des_tables']['auteurs'] = 'auteurs'; |
|
| 953 | + $GLOBALS['table_des_tables']['rubriques'] = 'rubriques'; |
|
| 954 | + $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques'; |
|
| 955 | + |
|
| 956 | + // definition des statuts de publication |
|
| 957 | + $GLOBALS['table_statut'] = []; |
|
| 958 | + |
|
| 959 | + // |
|
| 960 | + // tableau des tables de jointures |
|
| 961 | + // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES) |
|
| 962 | + $GLOBALS['tables_jointures'] = []; |
|
| 963 | + $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens'; |
|
| 964 | + |
|
| 965 | + // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple |
|
| 966 | + $GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur']; |
|
| 967 | + |
|
| 968 | + |
|
| 969 | + if (!defined('_TRAITEMENT_TYPO')) { |
|
| 970 | + define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])'); |
|
| 971 | + } |
|
| 972 | + if (!defined('_TRAITEMENT_RACCOURCIS')) { |
|
| 973 | + define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])'); |
|
| 974 | + } |
|
| 975 | + if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) { |
|
| 976 | + define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))'); |
|
| 977 | + } |
|
| 978 | + $GLOBALS['table_des_traitements']['BIO'][] = _TRAITEMENT_RACCOURCIS; |
|
| 979 | + $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS; |
|
| 980 | + $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)'; |
|
| 981 | + $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)'; |
|
| 982 | + $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)'; |
|
| 983 | + $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)'; |
|
| 984 | + $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS; |
|
| 985 | + $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS; |
|
| 986 | + $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO; |
|
| 987 | + $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO; |
|
| 988 | + $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO; |
|
| 989 | + $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS; |
|
| 990 | + $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO; |
|
| 991 | + $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO; |
|
| 992 | + $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO; |
|
| 993 | + $GLOBALS['table_des_traitements']['TAGS'][] = '%s'; |
|
| 994 | + $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS; |
|
| 995 | + $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO; |
|
| 996 | + $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO; |
|
| 997 | + $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS; |
|
| 998 | + $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO; |
|
| 999 | + $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)'; |
|
| 1000 | + |
|
| 1001 | + // valeur par defaut pour les balises non listees ci-dessus |
|
| 1002 | + $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante |
|
| 1003 | + // toujours securiser les DATA |
|
| 1004 | + $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)'; |
|
| 1005 | + // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all * |
|
| 1006 | + $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)'; |
|
| 1007 | + |
|
| 1008 | + |
|
| 1009 | + // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales |
|
| 1010 | + $interfaces = pipeline( |
|
| 1011 | + 'declarer_tables_interfaces', |
|
| 1012 | + [ |
|
| 1013 | + 'table_des_tables' => $GLOBALS['table_des_tables'], |
|
| 1014 | + 'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'], |
|
| 1015 | + 'table_date' => $GLOBALS['table_date'], |
|
| 1016 | + 'table_titre' => $GLOBALS['table_titre'], |
|
| 1017 | + 'tables_jointures' => $GLOBALS['tables_jointures'], |
|
| 1018 | + 'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'], |
|
| 1019 | + 'table_des_traitements' => $GLOBALS['table_des_traitements'], |
|
| 1020 | + 'table_statut' => $GLOBALS['table_statut'], |
|
| 1021 | + ] |
|
| 1022 | + ); |
|
| 1023 | + if ($interfaces) { |
|
| 1024 | + $GLOBALS['table_des_tables'] = $interfaces['table_des_tables']; |
|
| 1025 | + $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables']; |
|
| 1026 | + $GLOBALS['table_date'] = $interfaces['table_date']; |
|
| 1027 | + $GLOBALS['table_titre'] = $interfaces['table_titre']; |
|
| 1028 | + $GLOBALS['tables_jointures'] = $interfaces['tables_jointures']; |
|
| 1029 | + $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures']; |
|
| 1030 | + $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements']; |
|
| 1031 | + $GLOBALS['table_statut'] = $interfaces['table_statut']; |
|
| 1032 | + } |
|
| 1033 | 1033 | } |
| 1034 | 1034 | |
| 1035 | 1035 | declarer_interfaces(); |
@@ -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 | |
@@ -32,7 +32,7 @@ discard block |
||
| 32 | 32 | * Code PHP compilé de la boucle |
| 33 | 33 | **/ |
| 34 | 34 | function boucle_DEFAUT_dist($id_boucle, &$boucles) { |
| 35 | - return calculer_boucle($id_boucle, $boucles); |
|
| 35 | + return calculer_boucle($id_boucle, $boucles); |
|
| 36 | 36 | } |
| 37 | 37 | |
| 38 | 38 | |
@@ -51,7 +51,7 @@ discard block |
||
| 51 | 51 | * Code PHP compilé de la boucle |
| 52 | 52 | **/ |
| 53 | 53 | function boucle_BOUCLE_dist($id_boucle, &$boucles) { |
| 54 | - return calculer_boucle($id_boucle, $boucles); |
|
| 54 | + return calculer_boucle($id_boucle, $boucles); |
|
| 55 | 55 | } |
| 56 | 56 | |
| 57 | 57 | |
@@ -81,30 +81,30 @@ discard block |
||
| 81 | 81 | * Code PHP compilé de la boucle |
| 82 | 82 | **/ |
| 83 | 83 | function boucle_HIERARCHIE_dist($id_boucle, &$boucles) { |
| 84 | - $boucle = &$boucles[$id_boucle]; |
|
| 85 | - $id_table = $boucle->id_table . '.id_rubrique'; |
|
| 84 | + $boucle = &$boucles[$id_boucle]; |
|
| 85 | + $id_table = $boucle->id_table . '.id_rubrique'; |
|
| 86 | 86 | |
| 87 | - // Si la boucle mere est une boucle RUBRIQUES il faut ignorer la feuille |
|
| 88 | - // sauf en presence du critere {tout} (vu par phraser_html) |
|
| 89 | - // ou {id_article} qui positionne aussi le {tout} |
|
| 87 | + // Si la boucle mere est une boucle RUBRIQUES il faut ignorer la feuille |
|
| 88 | + // sauf en presence du critere {tout} (vu par phraser_html) |
|
| 89 | + // ou {id_article} qui positionne aussi le {tout} |
|
| 90 | 90 | |
| 91 | - $boucle->hierarchie = 'if (!($id_rubrique = intval(' |
|
| 92 | - . calculer_argument_precedent($boucle->id_boucle, 'id_rubrique', $boucles) |
|
| 93 | - . ")))\n\t\treturn '';\n\t" |
|
| 94 | - . "include_spip('inc/rubriques');\n\t" |
|
| 95 | - . '$hierarchie = calcul_hierarchie_in($id_rubrique,' |
|
| 96 | - . (isset($boucle->modificateur['tout']) ? 'true' : 'false') |
|
| 97 | - . ");\n\t" |
|
| 98 | - . 'if (!$hierarchie) return "";' . "\n\t"; |
|
| 91 | + $boucle->hierarchie = 'if (!($id_rubrique = intval(' |
|
| 92 | + . calculer_argument_precedent($boucle->id_boucle, 'id_rubrique', $boucles) |
|
| 93 | + . ")))\n\t\treturn '';\n\t" |
|
| 94 | + . "include_spip('inc/rubriques');\n\t" |
|
| 95 | + . '$hierarchie = calcul_hierarchie_in($id_rubrique,' |
|
| 96 | + . (isset($boucle->modificateur['tout']) ? 'true' : 'false') |
|
| 97 | + . ");\n\t" |
|
| 98 | + . 'if (!$hierarchie) return "";' . "\n\t"; |
|
| 99 | 99 | |
| 100 | - $boucle->where[] = ["'IN'", "'$id_table'", '"($hierarchie)"']; |
|
| 100 | + $boucle->where[] = ["'IN'", "'$id_table'", '"($hierarchie)"']; |
|
| 101 | 101 | |
| 102 | - $order = "FIELD($id_table, \$hierarchie)"; |
|
| 103 | - if (!isset($boucle->default_order[0]) or $boucle->default_order[0] != ' DESC') { |
|
| 104 | - $boucle->default_order[] = "\"$order\""; |
|
| 105 | - } else { |
|
| 106 | - $boucle->default_order[0] = "\"$order DESC\""; |
|
| 107 | - } |
|
| 102 | + $order = "FIELD($id_table, \$hierarchie)"; |
|
| 103 | + if (!isset($boucle->default_order[0]) or $boucle->default_order[0] != ' DESC') { |
|
| 104 | + $boucle->default_order[] = "\"$order\""; |
|
| 105 | + } else { |
|
| 106 | + $boucle->default_order[0] = "\"$order DESC\""; |
|
| 107 | + } |
|
| 108 | 108 | |
| 109 | - return calculer_boucle($id_boucle, $boucles); |
|
| 109 | + return calculer_boucle($id_boucle, $boucles); |
|
| 110 | 110 | } |
@@ -82,7 +82,7 @@ discard block |
||
| 82 | 82 | **/ |
| 83 | 83 | function boucle_HIERARCHIE_dist($id_boucle, &$boucles) { |
| 84 | 84 | $boucle = &$boucles[$id_boucle]; |
| 85 | - $id_table = $boucle->id_table . '.id_rubrique'; |
|
| 85 | + $id_table = $boucle->id_table.'.id_rubrique'; |
|
| 86 | 86 | |
| 87 | 87 | // Si la boucle mere est une boucle RUBRIQUES il faut ignorer la feuille |
| 88 | 88 | // sauf en presence du critere {tout} (vu par phraser_html) |
@@ -95,7 +95,7 @@ discard block |
||
| 95 | 95 | . '$hierarchie = calcul_hierarchie_in($id_rubrique,' |
| 96 | 96 | . (isset($boucle->modificateur['tout']) ? 'true' : 'false') |
| 97 | 97 | . ");\n\t" |
| 98 | - . 'if (!$hierarchie) return "";' . "\n\t"; |
|
| 98 | + . 'if (!$hierarchie) return "";'."\n\t"; |
|
| 99 | 99 | |
| 100 | 100 | $boucle->where[] = ["'IN'", "'$id_table'", '"($hierarchie)"']; |
| 101 | 101 | |