[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / public / parametrer.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 include_spip('inc/lang');
16
17 // NB: mes_fonctions peut initialiser $dossier_squelettes (old-style)
18 // donc il faut l'inclure "en globals"
19 if ($f = find_in_path('mes_fonctions.php')) {
20 global $dossier_squelettes;
21 include_once(_ROOT_CWD . $f);
22 }
23
24 if (@is_readable(_CACHE_PLUGINS_FCT)) {
25 // chargement optimise precompile
26 include_once(_CACHE_PLUGINS_FCT);
27 }
28 if (test_espace_prive ())
29 include_spip('inc/filtres_ecrire');
30
31 # Determine le squelette associe a une requete
32 # et l'applique sur le contexte, le nom du cache et le serveur
33 # en ayant evacue au prealable le cas de la redirection
34 # Retourne un tableau ainsi construit
35 # 'texte' => la page calculee
36 # 'process_ins' => 'html' ou 'php' si presence d'un '< ?php'
37 # 'invalideurs' => les invalideurs de ce cache
38 # 'entetes' => headers http
39 # 'duree' => duree de vie du cache
40 # 'signal' => contexte (les id_* globales)
41
42 # En cas d'erreur process_ins est absent et texte est un tableau de 2 chaines
43
44 // http://doc.spip.org/@public_parametrer_dist
45 function public_parametrer_dist($fond, $contexte='', $cache='', $connect='') {
46 static $composer,$styliser,$notes=null;
47 $page = tester_redirection($fond, $contexte, $connect);
48 if ($page) return $page;
49
50 if (isset($contexte['lang']))
51 $lang = $contexte['lang'];
52 elseif (!isset($lang))
53 $lang = $GLOBALS['meta']['langue_site'];
54
55 $select = ((!isset($GLOBALS['forcer_lang']) OR !$GLOBALS['forcer_lang']) AND $lang <> $GLOBALS['spip_lang']);
56 if ($select) $select = lang_select($lang);
57
58 $debug = (defined('_VAR_MODE') && _VAR_MODE == 'debug');
59
60 if (!$styliser)
61 $styliser = charger_fonction('styliser', 'public');
62 list($skel,$mime_type, $gram, $sourcefile) =
63 $styliser($fond, $contexte, $GLOBALS['spip_lang'], $connect);
64
65 if ($skel) {
66
67 // sauver le nom de l'eventuel squelette en cours d'execution
68 // (recursion possible a cause des modeles)
69 if ($debug) {
70 $courant = @$GLOBALS['debug_objets']['courant'];
71 $GLOBALS['debug_objets']['contexte'][$sourcefile] = $contexte;
72 }
73
74 // charger le squelette en specifiant les langages cibles et source
75 // au cas il faudrait le compiler (source posterieure au resultat)
76
77 if (!$composer)
78 $composer = charger_fonction('composer', 'public');
79 $fonc = $composer($skel, $mime_type, $gram, $sourcefile, $connect);
80 }
81 else
82 $fonc = '';
83
84 if (!$fonc) { // squelette inconnu (==='') ou faux (===false)
85 $page = $fonc;
86 }
87 else {
88 // Preparer l'appel de la fonction principale du squelette
89
90 spip_timer($a = 'calcul page '.rand(0,1000));
91
92 // On cree un marqueur de notes unique lie a cette composition
93 // et on enregistre l'etat courant des globales de notes...
94 if (is_null($notes))
95 $notes = charger_fonction('notes', 'inc', true);
96 if ($notes)
97 $notes('','empiler');
98
99 // Rajouter d'office ces deux parametres
100 // (mais vaudrait mieux que le compilateur sache le simuler
101 // car ca interdit l'usage de criteres conditionnels dessus).
102 if (!isset($contexte['date'])) {
103 $contexte['date'] = date("Y-m-d H:i:s");
104 $contexte['date_default'] = true;
105 } else $contexte['date'] = normaliser_date($contexte['date'], true);
106
107 if (!isset($contexte['date_redac'])) {
108 $contexte['date_redac'] = date("Y-m-d H:i:s");
109 $contexte['date_redac_default'] = true;
110 } else $contexte['date_redac'] = normaliser_date($contexte['date_redac'], true);
111
112 // Passer le nom du cache pour produire sa destruction automatique
113 $page = $fonc(array('cache' => $cache), array($contexte));
114
115 // Restituer les globales de notes telles qu'elles etaient avant l'appel
116 // Si l'inclus n'a pas affiche ses notes, tant pis (elles *doivent*
117 // etre dans son resultat, autrement elles ne seraient pas prises en
118 // compte a chaque calcul d'un texte contenant un modele, mais seulement
119 // quand le modele serait calcule, et on aurait des resultats incoherents)
120 if ($notes)
121 $notes('','depiler');
122
123 // reinjecter en dynamique la pile des notes
124 // si il y a des inclure dynamiques
125 // si la pile n'est pas vide
126 // la generalisation de cette injection permettrait de corriger le point juste au dessus
127 // en faisant remonter les notes a l'incluant (A tester et valider avant application)
128 if ($notes)
129 $page['notes'] = $notes('','sauver_etat');
130
131 // spip_log: un joli contexte
132 $infos = array();
133 foreach (array_filter($contexte) as $var => $val) {
134 if (is_array($val)) $val = serialize($val);
135 if (strlen("$val") > 30)
136 $val = substr("$val", 0,27).'..';
137 if (strstr($val,' '))
138 $val = "'$val'";
139 $infos[] = $var.'='.$val;
140 }
141 $profile = spip_timer($a);
142 spip_log("calcul ($profile) [$skel] "
143 . join(', ', $infos)
144 .' ('.strlen($page['texte']).' octets)');
145
146 if (defined('_CALCUL_PROFILER') AND intval($profile)>_CALCUL_PROFILER){
147 spip_log("calcul ($profile) [$skel] "
148 . join(', ', $infos)
149 .' ('.strlen($page['texte']).' octets) | '.$_SERVER['REQUEST_URI'],"profiler"._LOG_AVERTISSEMENT);
150 }
151
152 if ($debug) {
153 // si c'est ce que demande le debusqueur, lui passer la main
154 $t = strlen($page['texte']) ? $page['texte'] : " ";
155 $GLOBALS['debug_objets']['resultat'][$fonc . 'tout'] = $t;
156 $GLOBALS['debug_objets']['courant'] = $courant;
157 $GLOBALS['debug_objets']['profile'][$sourcefile] = $profile;
158 if ($GLOBALS['debug_objets']['sourcefile']
159 AND (_request('var_mode_objet') == $fonc)
160 AND (_request('var_mode_affiche') == 'resultat')) {
161 erreur_squelette();
162 }
163 }
164 // Si #CACHE{} n'etait pas la, le mettre a $delais
165 if (!isset($page['entetes']['X-Spip-Cache'])){
166 // Dans l'espace prive ou dans un modeles/ on pose un cache 0 par defaut
167 // si aucun #CACHE{} specifie
168 // le contexte implicite qui conditionne le cache assure qu'on retombe pas sur le meme
169 // entre public et prive
170 if (test_espace_prive() OR strncmp($fond,'modeles/',8)==0)
171 $page['entetes']['X-Spip-Cache'] = 0;
172 else
173 $page['entetes']['X-Spip-Cache'] = isset($GLOBALS['delais'])?$GLOBALS['delais']:36000;
174 }
175
176 $page['contexte'] = $contexte;
177
178 // faire remonter le fichier source
179 static $js_inclus = false;
180 if (defined('_VAR_INCLURE') AND _VAR_INCLURE){
181 $page['sourcefile'] = $sourcefile;
182 $page['texte'] =
183 "<div class='inclure_blocs'><h6>".$page['sourcefile']."</h6>".$page['texte']."</div>"
184 . ($js_inclus?"":"<script type='text/javascript'>jQuery(function(){jQuery('.inclure_blocs > h6:first-child').hover(function(){jQuery(this).parent().addClass('hover')},function(){jQuery(this).parent().removeClass('hover')})});</script>");
185 $js_inclus = true;
186 }
187
188 // Si un modele contenait #SESSION, on note l'info dans $page
189 if (isset($GLOBALS['cache_utilise_session'])) {
190 $page['invalideurs']['session'] = $GLOBALS['cache_utilise_session'];
191 unset($GLOBALS['cache_utilise_session']);
192 }
193 }
194
195 if ($select) lang_select();
196
197 return $page;
198 }
199
200
201 /**
202 * si le champ virtuel est non vide c'est une redirection.
203 * avec un eventuel raccourci Spip
204 * si le raccourci a un titre il sera pris comme corps du 302
205 *
206 * http://doc.spip.org/@tester_redirection
207 *
208 * @param string $fond
209 * @param array $contexte
210 * @param string $connect
211 * @return array|bool
212 */
213 function tester_redirection($fond, $contexte, $connect)
214 {
215 if ($fond == 'article'
216 AND $id_article = intval($contexte['id_article'])) {
217 include_spip('public/quete'); // pour quete_virtuel et ses dependances
218 $m = quete_virtuel($id_article, $connect);
219 if (strlen($m)) {
220 include_spip('inc/texte');
221 // les navigateurs pataugent si l'URL est vide
222 if ($url = virtuel_redirige($m, true)){
223 // passer en url absolue car cette redirection pourra
224 // etre utilisee dans un contexte d'url qui change
225 // y compris url arbo
226 $status = 302;
227 if (defined('_STATUS_REDIRECTION_VIRTUEL'))
228 $status=_STATUS_REDIRECTION_VIRTUEL;
229 if (!preg_match(',^\w+:,', $url)) {
230 include_spip('inc/filtres_mini');
231 $url = url_absolue($url);
232 }
233 $url = str_replace('&amp;', '&', $url);
234 return array('texte' => "<"
235 . "?php include_spip('inc/headers');redirige_par_entete('"
236 . texte_script($url)
237 . "','',$status);"
238 . "?" . ">",
239 'process_ins' => 'php',
240 'status' => $status);
241 }
242 }
243 }
244 return false;
245 }
246
247 ?>