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