Subversion Repositories Sites.tela-botanica.org

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
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('&amp;', '&', $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
?>