3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
14 * Chargement (et affichage) d'une page ou d'un appel public
16 * @package SPIP\Core\Affichage
19 // Distinguer une inclusion d'un appel initial
20 // (cette distinction est obsolete a present, on la garde provisoirement
21 // par souci de compatiilite).
23 if (isset($GLOBALS['_INC_PUBLIC']) and $GLOBALS['_INC_PUBLIC']) {
25 echo recuperer_fond($fond, $contexte_inclus, array(), _request('connect'));
29 $GLOBALS['_INC_PUBLIC'] = 1;
30 define('_PIPELINE_SUFFIX', test_espace_prive() ?
'_prive' : '');
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')
37 include_once _ROOT_RESTREINT
. 'inc_version.php';
39 die('inc_version absent ?');
41 } // $fond defini dans le fichier d'appel ?
44 if (isset($fond) and !_request('fond')) {
45 } // fond demande dans l'url par page=xxxx ?
47 if (isset($_GET[_SPIP_PAGE
])) {
48 $fond = (string)$_GET[_SPIP_PAGE
];
51 if (strstr($fond, '/')
53 isset($GLOBALS['visiteur_session']) // pour eviter d'evaluer la suite pour les anonymes
54 and include_spip('inc/autoriser')
55 and autoriser('webmestre'))
57 include_spip('inc/minipres');
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']);
68 # sinon, fond par defaut
70 // sinon fond par defaut (cf. assembler.php)
71 $fond = pipeline('detecter_fond_par_defaut', '');
76 $tableau_des_temps = array();
78 // Particularites de certains squelettes
79 if ($fond == 'login') {
83 if (isset($forcer_lang) and $forcer_lang and ($forcer_lang !== 'non')
84 and !_request('action')
85 and $_SERVER['REQUEST_METHOD'] != 'POST'
87 include_spip('inc/lang');
91 $lang = !isset($_GET['lang']) ?
'' : lang_select($_GET['lang']);
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');
98 // cas des appels actions ?action=xxx
99 traiter_appels_actions()
101 // cas des hits ajax sur les inclusions ajax
102 traiter_appels_inclusions_ajax()
104 // cas des formulaires charger/verifier/traiter
105 traiter_formulaires_dynamiques()
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 !
115 // Il y a du texte a produire, charger le metteur en page
116 include_spip('public/assembler');
117 $page = assembler($fond, _request('connect'));
119 if (isset($page['status'])) {
120 include_spip('inc/headers');
121 http_status($page['status']);
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;
130 $html = preg_match(',^\s*text/html,', $page['entetes']['Content-Type']);
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();
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
)
144 if ($affiche_boutons_admin) {
145 include_spip('balise/formulaire_admin');
149 // Execution de la page calculee
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']);
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')) {
164 . highlight_string($page['codephp'], true)
168 erreur_squelette($msg);
172 // Envoyer le resultat apres post-traitements
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']);
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();
185 // Appel au debusqueur en cas d'erreurs ou de demande de trace
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);
197 if (isset($GLOBALS['meta']['date_prochain_postdate'])
198 and $GLOBALS['meta']['date_prochain_postdate'] <= time()
200 include_spip('inc/rubriques');
201 calculer_prochain_postdate(true);
204 // Effectuer une tache de fond ?
205 // si _DIRECT_CRON_FORCE est present, on force l'appel
206 if (defined('_DIRECT_CRON_FORCE')) {
210 // sauver le cache chemin si necessaire