4 |
david |
1 |
<?php
|
|
|
2 |
|
|
|
3 |
/***************************************************************************\
|
|
|
4 |
* SPIP, Systeme de publication pour l'internet *
|
|
|
5 |
* *
|
|
|
6 |
* Copyright (c) 2001-2005 *
|
|
|
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 |
|
|
|
14 |
|
|
|
15 |
// Ce fichier ne sera execute qu'une fois
|
|
|
16 |
if (defined("_INC_CALCUL")) return;
|
|
|
17 |
define("_INC_CALCUL", "1");
|
|
|
18 |
|
|
|
19 |
//
|
|
|
20 |
// Ce fichier calcule une page en executant un squelette.
|
|
|
21 |
//
|
|
|
22 |
|
|
|
23 |
include_ecrire("inc_meta.php3");
|
|
|
24 |
include_ecrire("inc_index.php3");
|
|
|
25 |
include_ecrire("inc_texte.php3");
|
|
|
26 |
include_ecrire("inc_filtres.php3");
|
|
|
27 |
include_ecrire("inc_lang.php3");
|
|
|
28 |
include_ecrire("inc_documents.php3");
|
|
|
29 |
include_ecrire("inc_abstract_sql.php3");
|
|
|
30 |
include_ecrire("inc_forum.php3");
|
|
|
31 |
include_ecrire("inc_debug_sql.php3");
|
|
|
32 |
include_local("inc-calcul-outils.php3");
|
|
|
33 |
|
|
|
34 |
// NB: Ce fichier peut initialiser $dossier_squelettes (old-style)
|
|
|
35 |
if ($f = find_in_path("mes_fonctions.php3"))
|
|
|
36 |
include_local ($f);
|
|
|
37 |
|
|
|
38 |
// Gestionnaire d'URLs
|
|
|
39 |
if (@file_exists("inc-urls.php3"))
|
|
|
40 |
include_local("inc-urls.php3");
|
|
|
41 |
else
|
|
|
42 |
include_local("inc-urls-".$GLOBALS['type_urls'].".php3");
|
|
|
43 |
|
|
|
44 |
|
|
|
45 |
// Le squelette compile est-il trop vieux ?
|
|
|
46 |
function squelette_obsolete($skel, $squelette) {
|
|
|
47 |
return (
|
|
|
48 |
($GLOBALS['var_mode'] AND $GLOBALS['var_mode']<>'calcul')
|
|
|
49 |
OR !@file_exists($skel)
|
|
|
50 |
OR (@filemtime($squelette) > ($date = @filemtime($skel)))
|
|
|
51 |
OR (@filemtime('mes_fonctions.php3') > $date)
|
|
|
52 |
OR (@filemtime(_FILE_OPTIONS) > $date)
|
|
|
53 |
);
|
|
|
54 |
}
|
|
|
55 |
|
|
|
56 |
|
|
|
57 |
# Charge un squelette (au besoin le compile)
|
|
|
58 |
# et retoune le nom de sa fonction principale, ou '' s'il est indefini
|
|
|
59 |
# Charge egalement un fichier homonyme de celui du squelette
|
|
|
60 |
# mais de suffixe '_fonctions.php3' pouvant contenir:
|
|
|
61 |
# - des filtres
|
|
|
62 |
# - des fonctions de traduction de balise, de critere et de boucle
|
|
|
63 |
# - des declaration de tables SQL supplementaires
|
|
|
64 |
|
|
|
65 |
function charger_squelette ($squelette) {
|
|
|
66 |
$ext = $GLOBALS['extension_squelette'];
|
|
|
67 |
$nom = $ext . '_' . md5($squelette);
|
|
|
68 |
$sourcefile = $squelette . ".$ext";
|
|
|
69 |
|
|
|
70 |
// le squelette est-il deja en memoire (INCLURE a repetition)
|
|
|
71 |
if (function_exists($nom))
|
|
|
72 |
return $nom;
|
|
|
73 |
|
|
|
74 |
$phpfile = _DIR_CACHE . 'skel_' . $nom . '.php';
|
|
|
75 |
|
|
|
76 |
// le squelette est-il deja compile et perenne ?
|
|
|
77 |
if (!squelette_obsolete($phpfile, $sourcefile)
|
|
|
78 |
AND lire_fichier ($phpfile, $contenu,
|
|
|
79 |
array('critique' => 'oui', 'phpcheck' => 'oui')))
|
|
|
80 |
eval('?'.'>'.$contenu);
|
|
|
81 |
|
|
|
82 |
// sinon, charger le compilateur et verifier que le source est lisible
|
|
|
83 |
if (!function_exists($nom)) {
|
|
|
84 |
include_local("inc-compilo.php3");
|
|
|
85 |
lire_fichier ($sourcefile, $skel);
|
|
|
86 |
}
|
|
|
87 |
|
|
|
88 |
// Le fichier suivant peut contenir entre autres:
|
|
|
89 |
// 1. les filtres utilises par le squelette
|
|
|
90 |
// 2. des ajouts au compilateur
|
|
|
91 |
// Le point 1 exige qu'il soit lu dans tous les cas.
|
|
|
92 |
// Le point 2 exige qu'il soit lu apres inc-compilo
|
|
|
93 |
// (car celui-ci initialise $tables_principales) mais avant la compil
|
|
|
94 |
$f = $squelette . '_fonctions.php3';
|
|
|
95 |
if (@file_exists($f)) include($f);
|
|
|
96 |
|
|
|
97 |
if (function_exists($nom)) return $nom;
|
|
|
98 |
|
|
|
99 |
$skel_code = calculer_squelette($skel, $nom, $ext, $sourcefile);
|
|
|
100 |
// Tester si le compilateur renvoie une erreur
|
|
|
101 |
|
|
|
102 |
if (is_array($skel_code))
|
|
|
103 |
erreur_squelette($skel_code[0], $skel_code[1]);
|
|
|
104 |
else {
|
|
|
105 |
|
|
|
106 |
if ($GLOBALS['var_mode'] == 'debug') {
|
|
|
107 |
include_ecrire("inc_debug_sql.php3");
|
|
|
108 |
debug_dumpfile ($skel_code, $nom, 'code');
|
|
|
109 |
}
|
|
|
110 |
eval('?'.'>'.$skel_code);
|
|
|
111 |
if (function_exists($nom)) {
|
|
|
112 |
ecrire_fichier ($phpfile, $skel_code);
|
|
|
113 |
return $nom;
|
|
|
114 |
} else {
|
|
|
115 |
erreur_squelette($sourcefile, _L('Erreur de compilation'));
|
|
|
116 |
}
|
|
|
117 |
}
|
|
|
118 |
}
|
|
|
119 |
|
|
|
120 |
# Provoque la recherche du squelette $fond d'une $lang donnee,
|
|
|
121 |
# et l'applique sur un $contexte pour un certain $cache.
|
|
|
122 |
# Retourne un tableau de 3 elements:
|
|
|
123 |
# 'texte' => la page calculee
|
|
|
124 |
# 'process_ins' => 'html' ou 'php' si presence d'un '< ?php'
|
|
|
125 |
# 'invalideurs' => les invalideurs (cf inc-calcul-squel)
|
|
|
126 |
|
|
|
127 |
# En cas d'erreur process_ins est absent et texte est un tableau de 2 chaines
|
|
|
128 |
|
|
|
129 |
# La recherche est assuree par la fonction chercher_squelette,
|
|
|
130 |
# definie dans inc-chercher, fichier non charge si elle est deja definie
|
|
|
131 |
# (typiquement dans mes_fonctions.php3)
|
|
|
132 |
|
|
|
133 |
function cherche_page ($cache, $contexte, $fond) {
|
|
|
134 |
global $delais;
|
|
|
135 |
|
|
|
136 |
if (!function_exists('chercher_squelette'))
|
|
|
137 |
include_local("inc-chercher-squelette.php3");
|
|
|
138 |
|
|
|
139 |
// Choisir entre $fond-dist.html, $fond=7.html, etc?
|
|
|
140 |
$id_rubrique_fond = 0;
|
|
|
141 |
// Chercher le fond qui va servir de squelette
|
|
|
142 |
if ($r = sql_rubrique_fond($contexte))
|
|
|
143 |
list($id_rubrique_fond, $lang) = $r;
|
|
|
144 |
if (!$lang)
|
|
|
145 |
$lang = lire_meta('langue_site');
|
|
|
146 |
// Si inc-urls ou un appel dynamique veut fixer la langue, la recuperer
|
|
|
147 |
$lang = $contexte['lang'];
|
|
|
148 |
|
|
|
149 |
if (!$GLOBALS['forcer_lang'])
|
|
|
150 |
lang_select($lang);
|
|
|
151 |
|
|
|
152 |
$skel = chercher_squelette($fond,
|
|
|
153 |
$id_rubrique_fond,
|
|
|
154 |
$GLOBALS['spip_lang']);
|
|
|
155 |
|
|
|
156 |
// Charger le squelette et recuperer sa fonction principale
|
|
|
157 |
// (compilation automatique au besoin) et calculer
|
|
|
158 |
|
|
|
159 |
$page = array();
|
|
|
160 |
|
|
|
161 |
if ($skel) {
|
|
|
162 |
if ($fonc = charger_squelette($skel))
|
|
|
163 |
$page = $fonc(array('cache' => $cache), array($contexte));
|
|
|
164 |
|
|
|
165 |
// Passer la main au debuggueur)
|
|
|
166 |
if ($GLOBALS['var_mode'] == 'debug')
|
|
|
167 |
{
|
|
|
168 |
include_ecrire("inc_debug_sql.php3");
|
|
|
169 |
debug_dumpfile ($page['texte'], $fonc, 'resultat');
|
|
|
170 |
}
|
|
|
171 |
}
|
|
|
172 |
|
|
|
173 |
// Entrer les invalideurs dans la base
|
|
|
174 |
if ($delais>0) {
|
|
|
175 |
include_ecrire('inc_invalideur.php3');
|
|
|
176 |
maj_invalideurs($cache, $page['invalideurs'], $delais);
|
|
|
177 |
}
|
|
|
178 |
|
|
|
179 |
// Retourner la structure de la page
|
|
|
180 |
|
|
|
181 |
return $page;
|
|
|
182 |
}
|
|
|
183 |
|
|
|
184 |
|
|
|
185 |
//
|
|
|
186 |
// Contexte : lors du calcul d'une page spip etablit le contexte a partir
|
|
|
187 |
// des variables $_GET et $_POST, et leur ajoute la date
|
|
|
188 |
// Note : pour hacker le contexte depuis le fichier d'appel (article.php3),
|
|
|
189 |
// il est recommande de modifier $_GET['toto'] (meme si la page est
|
|
|
190 |
// appelee avec la methode POST).
|
|
|
191 |
//
|
|
|
192 |
function calculer_contexte() {
|
|
|
193 |
global $_GET, $_POST;
|
|
|
194 |
|
|
|
195 |
foreach($_GET as $var => $val) {
|
|
|
196 |
if (strpos($var, 'var_') !== 0)
|
|
|
197 |
$contexte[$var] = $val;
|
|
|
198 |
}
|
|
|
199 |
foreach($_POST as $var => $val) {
|
|
|
200 |
if (strpos($var, 'var_') !== 0)
|
|
|
201 |
$contexte[$var] = $val;
|
|
|
202 |
}
|
|
|
203 |
|
|
|
204 |
if ($GLOBALS['date'])
|
|
|
205 |
$contexte['date'] = $contexte['date_redac'] = normaliser_date($GLOBALS['date']);
|
|
|
206 |
else
|
|
|
207 |
$contexte['date'] = $contexte['date_redac'] = date("Y-m-d H:i:s");
|
|
|
208 |
|
|
|
209 |
return $contexte;
|
|
|
210 |
}
|
|
|
211 |
|
|
|
212 |
function calculer_page_globale($cache, $contexte_local, $fond) {
|
|
|
213 |
|
|
|
214 |
// Gestion des URLs personnalises - sale mais historique
|
|
|
215 |
if (function_exists("recuperer_parametres_url")) {
|
|
|
216 |
global $contexte;
|
|
|
217 |
$contexte = $contexte_local;
|
|
|
218 |
recuperer_parametres_url($fond, nettoyer_uri());
|
|
|
219 |
|
|
|
220 |
// remettre les globales pour le bouton "Modifier cet article"
|
|
|
221 |
if (is_array($contexte))
|
|
|
222 |
foreach ($contexte as $var=>$val)
|
|
|
223 |
if (substr($var,0,3) == 'id_')
|
|
|
224 |
$GLOBALS[$var] = $val;
|
|
|
225 |
$contexte_local = $contexte;
|
|
|
226 |
}
|
|
|
227 |
|
|
|
228 |
// si le champ chapo commence par '=' c'est une redirection.
|
|
|
229 |
if ($id_article = intval($contexte['id_article'])) {
|
|
|
230 |
if ($art = sql_chapo($id_article)) {
|
|
|
231 |
$chapo = $art['chapo'];
|
|
|
232 |
if (substr($chapo, 0, 1) == '=') {
|
|
|
233 |
include_ecrire('inc_texte.php3');
|
|
|
234 |
list(,$url) = extraire_lien(array('','','',
|
|
|
235 |
substr($chapo, 1)));
|
|
|
236 |
if ($url) { // sinon les navigateurs pataugent
|
|
|
237 |
$url = texte_script(str_replace('&', '&', $url));
|
|
|
238 |
$page = array('texte' => "<".
|
|
|
239 |
"?php header('Location: $url'); ?" . ">",
|
|
|
240 |
'process_ins' => 'php');
|
|
|
241 |
}
|
|
|
242 |
}
|
|
|
243 |
}
|
|
|
244 |
}
|
|
|
245 |
|
|
|
246 |
// Go to work !
|
|
|
247 |
if (!$page)
|
|
|
248 |
$page = cherche_page($cache, $contexte_local, $fond);
|
|
|
249 |
|
|
|
250 |
$signal = array();
|
|
|
251 |
foreach(array('id_parent', 'id_rubrique', 'id_article', 'id_auteur',
|
|
|
252 |
'id_breve', 'id_forum', 'id_secteur', 'id_syndic', 'id_syndic_article',
|
|
|
253 |
'id_mot', 'id_groupe', 'id_document') as $val) {
|
|
|
254 |
if ($contexte_local[$val])
|
|
|
255 |
$signal['contexte'][$val] = intval($contexte_local[$val]);
|
|
|
256 |
}
|
|
|
257 |
|
|
|
258 |
$page['signal'] = $signal;
|
|
|
259 |
|
|
|
260 |
return $page;
|
|
|
261 |
}
|
|
|
262 |
|
|
|
263 |
|
|
|
264 |
|
|
|
265 |
function calculer_page($chemin_cache, $elements, $delais, $inclusion=false) {
|
|
|
266 |
global $_POST;
|
|
|
267 |
|
|
|
268 |
// Inclusion
|
|
|
269 |
if ($inclusion) {
|
|
|
270 |
$contexte_inclus = $elements['contexte'];
|
|
|
271 |
$page = cherche_page($chemin_cache,
|
|
|
272 |
$contexte_inclus, $elements['fond']);
|
|
|
273 |
}
|
|
|
274 |
else {
|
|
|
275 |
$page = calculer_page_globale($chemin_cache,
|
|
|
276 |
$elements['contexte'],
|
|
|
277 |
$elements['fond']);
|
|
|
278 |
}
|
|
|
279 |
|
|
|
280 |
$page['signal']['process_ins'] = $page['process_ins'];
|
|
|
281 |
$signal = "<!-- ".str_replace("\n", " ",
|
|
|
282 |
serialize($page['signal']))." -->\n";
|
|
|
283 |
|
|
|
284 |
// Enregistrer le fichier cache
|
|
|
285 |
if ($delais > 0 AND $GLOBALS['var_mode'] != 'debug'
|
|
|
286 |
AND !count($_POST))
|
|
|
287 |
ecrire_fichier($chemin_cache, $signal.$page['texte']);
|
|
|
288 |
|
|
|
289 |
return $page;
|
|
|
290 |
}
|
|
|
291 |
?>
|