[SPIP] +2.1.12
[velocampus/web/www.git] / www / ecrire / public.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2010 *
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 // Distinguer une inclusion d'un appel initial
14 // (cette distinction est obsolete a present, on la garde provisoirement
15 // par souci de compatiilite).
16
17 if (isset($GLOBALS['_INC_PUBLIC'])) {
18
19 echo recuperer_fond($fond, $contexte_inclus, array(), _request('connect'));
20
21 } else {
22
23 $GLOBALS['_INC_PUBLIC'] = 0;
24
25 // Faut-il initialiser SPIP ? (oui dans le cas general)
26 if (!defined('_DIR_RESTREINT_ABS'))
27 if (defined('_DIR_RESTREINT')
28 AND @file_exists( _ROOT_RESTREINT . 'inc_version.php')) {
29 include_once _ROOT_RESTREINT . 'inc_version.php';
30 }
31 else
32 die('inc_version absent ?');
33
34
35 // $fond defini dans le fichier d'appel ?
36
37 else if (isset($fond) AND !_request('fond')) { }
38
39 // fond demande dans l'url par page=xxxx ?
40 else if (isset($_GET[_SPIP_PAGE])) {
41 $fond = (string)$_GET[_SPIP_PAGE];
42
43 // Securite
44 if (strstr($fond, '/')
45 AND !(
46 isset($GLOBALS['visiteur_session']) // pour eviter d'evaluer la suite pour les anonymes
47 AND include_spip('inc/autoriser')
48 AND autoriser('webmestre'))) {
49 include_spip('inc/minipres');
50 echo minipres();
51 exit;
52 }
53 // l'argument Page a priorite sur l'argument action
54 // le cas se presente a cause des RewriteRule d'Apache
55 // qui permettent d'ajouter un argument dans la QueryString
56 // mais pas d'en retirer un en conservant les autres.
57 if (isset($_GET['action']) AND $_GET['action'] === $fond)
58 unset($_GET['action']);
59 # sinon, fond par defaut
60 } else {
61 // traiter le cas pathologique d'un upload de document ayant echoue
62 // car trop gros
63 if (empty($_GET) AND empty($_POST) AND empty($_FILES)
64 AND isset($_SERVER["CONTENT_LENGTH"])
65 AND strstr($_SERVER["CONTENT_TYPE"], "multipart/form-data;")) {
66 include_spip('inc/getdocument');
67 erreur_upload_trop_gros();
68 }
69
70 // sinon fond par defaut (cf. assembler.php)
71 $fond = '';
72 }
73
74 $tableau_des_temps = array();
75
76 // Particularites de certains squelettes
77 if ($fond == 'login')
78 $forcer_lang = true;
79
80 if (isset($forcer_lang) AND $forcer_lang AND ($forcer_lang!=='non') AND !_request('action')) {
81 include_spip('inc/lang');
82 verifier_lang_url();
83 }
84
85 $lang = !isset($_GET['lang']) ? '' : lang_select($_GET['lang']);
86
87 // Charger l'aiguilleur des traitements derogatoires
88 // (action en base SQL, formulaires CVT, AJax)
89 if (_request('action') OR _request('var_ajax') OR _request('formulaire_action')){
90 include_spip('public/aiguiller');
91 if (
92 // cas des appels actions ?action=xxx
93 traiter_appels_actions()
94 OR
95 // cas des hits ajax sur les inclusions ajax
96 traiter_appels_inclusions_ajax()
97 OR
98 // cas des formulaires charger/verifier/traiter
99 traiter_formulaires_dynamiques())
100 exit; // le hit est fini !
101 }
102
103 // si signature de petition, l'enregistrer avant d'afficher la page
104 // afin que celle-ci contienne la signature
105
106 if (isset($_GET['var_confirm'])) {
107 $reponse_confirmation = charger_fonction('reponse_confirmation','formulaires/signature');
108 $reponse_confirmation($_GET['var_confirm']);
109 }
110
111 // Il y a du texte a produire, charger le metteur en page
112 include_spip('public/assembler');
113 $page = assembler($fond, _request('connect'));
114
115 if (isset($page['status'])) {
116 include_spip('inc/headers');
117 http_status($page['status']);
118 }
119
120 // Tester si on est admin et il y a des choses supplementaires a dire
121 // type tableau pour y mettre des choses au besoin.
122 $debug = ((_request('var_mode') == 'debug') OR $tableau_des_temps) ? array(1) : array();
123
124 // Mettre le Content-Type Html si manquant
125 // Idem si debug, avec retrait du Content-Diposition pour voir le voir
126
127 if ($debug OR !isset($page['entetes']['Content-Type'])) {
128 $page['entetes']['Content-Type'] =
129 "text/html; charset=" . $GLOBALS['meta']['charset'];
130 if ($debug) unset($page['entetes']['Content-Disposition']);
131 $html = true;
132 } else {
133 $html = preg_match(',^\s*text/html,',$page['entetes']['Content-Type']);
134 }
135
136 if ($var_preview AND $html) {
137 include_spip('inc/filtres'); // pour http_img_pack
138 $x = _T('previsualisation');
139 $x = http_img_pack('naviguer-site.png', $x) . '&nbsp;' . majuscules($x);
140 $x = "<div class='spip-previsu'>$x</div>";
141 if (!$pos = strpos($page['texte'], '</body>'))
142 $pos = strlen($page['texte']);
143 $page['texte'] = substr_replace($page['texte'], $x, $pos, 0);
144 }
145
146 $affiche_boutons_admin = ($html AND ((
147 isset($_COOKIE['spip_admin'])
148 AND !$flag_preserver
149 ) OR $debug));
150
151 if ($affiche_boutons_admin)
152 include_spip('balise/formulaire_admin');
153
154
155
156 // decompte des visites, on peut forcer a oui ou non avec le header X-Spip-Visites
157 // par defaut on ne compte que les pages en html (ce qui exclue les js,css et flux rss)
158 $spip_compter_visites = $html?'oui':'non';
159 if (isset($page['entetes']['X-Spip-Visites'])){
160 $spip_compter_visites = in_array($page['entetes']['X-Spip-Visites'],array('oui','non'))?$page['entetes']['X-Spip-Visites']:$spip_compter_visites;
161 unset($page['entetes']['X-Spip-Visites']);
162 }
163
164 // Execution de la page calculee
165
166
167 // traitements sur les entetes avant envoi
168 // peut servir pour le plugin de stats
169 $page['entetes'] = pipeline('affichage_entetes_final', $page['entetes']);
170
171
172 // 1. Cas d'une page contenant uniquement du HTML :
173 if ($page['process_ins'] == 'html') {
174 envoyer_entetes($page['entetes']);
175 }
176
177 // 2. Cas d'une page contenant du PHP :
178 // Attention cette partie eval() doit imperativement
179 // etre declenchee dans l'espace des globales (donc pas
180 // dans une fonction).
181 else {
182 // sinon, inclure_balise_dynamique nous enverra peut-etre
183 // quelques en-tetes de plus (voire qq envoyes directement)
184
185 // restaurer l'etat des notes
186 if (isset($page['notes']) AND $page['notes']){
187 $notes = charger_fonction("notes","inc");
188 $notes($page['notes'],'restaurer_etat');
189 }
190 ob_start();
191 xml_hack($page, true);
192 $res = eval('?' . '>' . $page['texte']);
193 $page['texte'] = ob_get_contents();
194 xml_hack($page);
195 ob_end_clean();
196
197 envoyer_entetes($page['entetes']);
198 // en cas d'erreur lors du eval,
199 // la memoriser dans le tableau des erreurs
200
201 if ($res === false) {
202 $msg = array('zbug_erreur_execution_page');
203 erreur_squelette($msg);
204 }
205 }
206
207 //
208 // Post-traitements
209 //
210 page_base_href($page['texte']);
211
212 // (c'est ici qu'on fait var_recherche, validation, boutons d'admin,
213 // cf. public/assembler.php)
214 echo pipeline('affichage_final', $page['texte']);
215
216 if ($lang) lang_select();
217 // l'affichage de la page a pu lever des erreurs (inclusion manquante)
218 // il faut tester a nouveau
219 $debug = ((_request('var_mode') == 'debug') OR $tableau_des_temps) ? array(1) : array();
220
221 // Appel au debusqueur en cas d'erreurs ou de demande de trace
222 // at last
223 if ($debug) {
224 // en cas d'erreur, retester l'affichage
225 if ($html AND ($affiche_boutons_admin OR $debug)) {
226 if (!_request('var_mode_affiche'))
227 set_request('var_mode_affiche', 'resultat');
228 $var_mode_affiche = _request('var_mode_affiche');
229 $var_mode_objet = _request('var_mode_objet');
230 $GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet . 'tout'] = ($var_mode_affiche== 'validation' ? $page['texte'] :"");
231 echo erreur_squelette(false);
232 }
233 } else {
234 if (isset($GLOBALS['meta']['date_prochain_postdate'])
235 AND $GLOBALS['meta']['date_prochain_postdate'] <= time()) {
236 include_spip('inc/rubriques');
237 calculer_prochain_postdate(true);
238 }
239
240 // Effectuer une tache de fond ?
241 // si #SPIP_CRON est present, on ne le tente que pour les navigateurs
242 // en mode texte (par exemple), et seulement sur les pages web
243 if (defined('_DIRECT_CRON_FORCE')
244 OR (
245 !defined('_DIRECT_CRON_INHIBE')
246 AND $html
247 AND !strstr($page['texte'], '<!-- SPIP-CRON -->')
248 AND !preg_match(',msie|mozilla|opera|konqueror,i', $_SERVER['HTTP_USER_AGENT']))
249 )
250 cron();
251
252 // sauver le cache chemin si necessaire
253 save_path_cache();
254 }
255
256 // Gestion des statistiques du site public
257 if (($GLOBALS['meta']["activer_statistiques"] != "non")
258 AND $spip_compter_visites!='non'
259 AND $stats = charger_fonction('stats', 'public', true))
260 $stats();
261 }
262
263 ?>