[SPIP] v3.2.1-->v3.2.2
[lhc/web/www.git] / www / ecrire / public.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
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 * Chargement (et affichage) d'une page ou d'un appel public
15 *
16 * @package SPIP\Core\Affichage
17 **/
18
19 // Distinguer une inclusion d'un appel initial
20 // (cette distinction est obsolete a present, on la garde provisoirement
21 // par souci de compatiilite).
22
23 if (isset($GLOBALS['_INC_PUBLIC']) and $GLOBALS['_INC_PUBLIC']) {
24
25 echo recuperer_fond($fond, $contexte_inclus, array(), _request('connect'));
26
27 } else {
28
29 $GLOBALS['_INC_PUBLIC'] = 1;
30 define('_PIPELINE_SUFFIX', test_espace_prive() ? '_prive' : '');
31
32 // Faut-il initialiser SPIP ? (oui dans le cas general)
33 if (!defined('_DIR_RESTREINT_ABS')) {
34 if (defined('_DIR_RESTREINT')
35 and @file_exists(_ROOT_RESTREINT . 'inc_version.php')
36 ) {
37 include_once _ROOT_RESTREINT . 'inc_version.php';
38 } else {
39 die('inc_version absent ?');
40 }
41 } // $fond defini dans le fichier d'appel ?
42
43 else {
44 if (isset($fond) and !_request('fond')) {
45 } // fond demande dans l'url par page=xxxx ?
46 else {
47 if (isset($_GET[_SPIP_PAGE])) {
48 $fond = (string)$_GET[_SPIP_PAGE];
49
50 // Securite
51 if (strstr($fond, '/')
52 and !(
53 isset($GLOBALS['visiteur_session']) // pour eviter d'evaluer la suite pour les anonymes
54 and include_spip('inc/autoriser')
55 and autoriser('webmestre'))
56 ) {
57 include_spip('inc/minipres');
58 echo minipres();
59 exit;
60 }
61 // l'argument Page a priorite sur l'argument action
62 // le cas se presente a cause des RewriteRule d'Apache
63 // qui permettent d'ajouter un argument dans la QueryString
64 // mais pas d'en retirer un en conservant les autres.
65 if (isset($_GET['action']) and $_GET['action'] === $fond) {
66 unset($_GET['action']);
67 }
68 # sinon, fond par defaut
69 } else {
70 // sinon fond par defaut (cf. assembler.php)
71 $fond = pipeline('detecter_fond_par_defaut', '');
72 }
73 }
74 }
75
76 $tableau_des_temps = array();
77
78 // Particularites de certains squelettes
79 if ($fond == 'login') {
80 $forcer_lang = true;
81 }
82
83 if (isset($forcer_lang) and $forcer_lang and ($forcer_lang !== 'non')
84 and !_request('action')
85 and $_SERVER['REQUEST_METHOD'] != 'POST'
86 ) {
87 include_spip('inc/lang');
88 verifier_lang_url();
89 }
90
91 $lang = !isset($_GET['lang']) ? '' : lang_select($_GET['lang']);
92
93 // Charger l'aiguilleur des traitements derogatoires
94 // (action en base SQL, formulaires CVT, AJax)
95 if (_request('action') or _request('var_ajax') or _request('formulaire_action')) {
96 include_spip('public/aiguiller');
97 if (
98 // cas des appels actions ?action=xxx
99 traiter_appels_actions()
100 or
101 // cas des hits ajax sur les inclusions ajax
102 traiter_appels_inclusions_ajax()
103 or
104 // cas des formulaires charger/verifier/traiter
105 traiter_formulaires_dynamiques()
106 ) {
107 // lancer les taches sur affichage final, comme le cron
108 // mais sans rien afficher
109 $GLOBALS['html'] = false; // ne rien afficher
110 pipeline('affichage_final' . _PIPELINE_SUFFIX, '');
111 exit; // le hit est fini !
112 }
113 }
114
115 // Il y a du texte a produire, charger le metteur en page
116 include_spip('public/assembler');
117 $page = assembler($fond, _request('connect'));
118
119 if (isset($page['status'])) {
120 include_spip('inc/headers');
121 http_status($page['status']);
122 }
123
124 // Content-Type ?
125 if (!isset($page['entetes']['Content-Type'])) {
126 $charset = isset($GLOBALS['meta']['charset']) ? $GLOBALS['meta']['charset'] : "utf-8";
127 $page['entetes']['Content-Type'] = 'text/html; charset=' . $charset;
128 $html = true;
129 } else {
130 $html = preg_match(',^\s*text/html,', $page['entetes']['Content-Type']);
131 }
132
133 // Tester si on est admin et il y a des choses supplementaires a dire
134 // type tableau pour y mettre des choses au besoin.
135 $debug = ((_request('var_mode') == 'debug') or $tableau_des_temps) ? array(1) : array();
136
137 // affiche-t-on les boutons d'administration ? voir f_admin()
138 $affiche_boutons_admin = ($html and (
139 (isset($_COOKIE['spip_admin']) and (!isset($flag_preserver) or !$flag_preserver))
140 or ($debug and include_spip('inc/autoriser') and autoriser('debug'))
141 or (defined('_VAR_PREVIEW') and _VAR_PREVIEW)
142 ));
143
144 if ($affiche_boutons_admin) {
145 include_spip('balise/formulaire_admin');
146 }
147
148
149 // Execution de la page calculee
150
151 // traitements sur les entetes avant envoi
152 // peut servir pour le plugin de stats
153 $page['entetes'] = pipeline('affichage_entetes_final' . _PIPELINE_SUFFIX, $page['entetes']);
154
155
156 // eval $page et affecte $res
157 include _ROOT_RESTREINT . "public/evaluer_page.php";
158 envoyer_entetes($page['entetes']);
159 if ($res === false) {
160 include_spip('inc/autoriser');
161 $err = _T('zbug_erreur_execution_page');
162 if (autoriser('webmestre')) {
163 $err .= "\n<hr />\n"
164 . highlight_string($page['codephp'], true)
165 . "\n<hr />\n";
166 }
167 $msg = array($err);
168 erreur_squelette($msg);
169 }
170
171 //
172 // Envoyer le resultat apres post-traitements
173 //
174 // (c'est ici qu'on fait var_recherche, validation, boutons d'admin,
175 // cf. public/assembler.php)
176 echo pipeline('affichage_final' . _PIPELINE_SUFFIX, $page['texte']);
177
178 if ($lang) {
179 lang_select();
180 }
181 // l'affichage de la page a pu lever des erreurs (inclusion manquante)
182 // il faut tester a nouveau
183 $debug = ((_request('var_mode') == 'debug') or $tableau_des_temps) ? array(1) : array();
184
185 // Appel au debusqueur en cas d'erreurs ou de demande de trace
186 // at last
187 if ($debug) {
188 // en cas d'erreur, retester l'affichage
189 if ($html and ($affiche_boutons_admin or $debug)) {
190 $var_mode_affiche = _request('var_mode_affiche');
191 $var_mode_objet = _request('var_mode_objet');
192 $GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet . 'tout'] = ($var_mode_affiche == 'validation' ? $page['texte'] : "");
193 echo erreur_squelette(false);
194 }
195 } else {
196
197 if (isset($GLOBALS['meta']['date_prochain_postdate'])
198 and $GLOBALS['meta']['date_prochain_postdate'] <= time()
199 ) {
200 include_spip('inc/rubriques');
201 calculer_prochain_postdate(true);
202 }
203
204 // Effectuer une tache de fond ?
205 // si _DIRECT_CRON_FORCE est present, on force l'appel
206 if (defined('_DIRECT_CRON_FORCE')) {
207 cron();
208 }
209
210 // sauver le cache chemin si necessaire
211 save_path_cache();
212 }
213 }