Skip to content
Extraits de code Groupes Projets
inc-calcul.php3 8,02 ko
Newer Older
<?php
Fil's avatar
Fil a validé

Fil's avatar
Fil a validé
/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
Fil's avatar
Fil a validé
 *  Copyright (c) 2001-2006                                                *
Fil's avatar
Fil a validé
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/


Fil's avatar
Fil a validé

if (!defined("_ECRIRE_INC_VERSION")) return;
Yannick Patois's avatar
Yannick Patois a validé

Fil's avatar
Fil a validé
//
// Ce fichier calcule une page en executant un squelette.
//
Fil's avatar
Fil a validé

include_ecrire("inc_meta");
include_ecrire("inc_index");
include_ecrire("inc_texte");
include_ecrire("inc_lang");
include_ecrire("inc_documents");
include_ecrire("inc_abstract_sql");
include_ecrire("inc_forum");
include_ecrire("inc_debug_sql");
include_ecrire("inc_distant");
include_local("inc-calcul-outils");
Fil's avatar
Fil a validé
// NB: Ce fichier peut initialiser $dossier_squelettes (old-style)
if ($f = find_in_path("mes_fonctions" . _EXTENSION_PHP))
// Le squelette compile est-il trop vieux ?
function squelette_obsolete($skel, $squelette) {
	return (
		($GLOBALS['var_mode'] AND $GLOBALS['var_mode']<>'calcul')
		OR !@file_exists($skel)
		OR (@filemtime($squelette) > ($date = @filemtime($skel)))
		OR (@filemtime('mes_fonctions' . _EXTENSION_PHP) > $date)
		OR (@filemtime(_FILE_OPTIONS) > $date)
# Charge un squelette (au besoin le compile) 
# et retoune le nom de sa fonction principale, ou '' s'il est indefini
# Charge egalement un fichier homonyme de celui du squelette
# mais de suffixe '_fonctions.php' pouvant contenir:
# - des filtres
# - des fonctions de traduction de balise, de critere et de boucle
# - des declaration de tables SQL supplementaires

Fil's avatar
Fil a validé
function charger_squelette ($squelette) {
	$ext = $GLOBALS['extension_squelette'];
	$nom = $ext . '_' . md5($squelette);
	$sourcefile = $squelette . ".$ext";

	// le squelette est-il deja en memoire (INCLURE  a repetition)
Fil's avatar
Fil a validé
	if (function_exists($nom))
		return $nom;
	$phpfile = _DIR_CACHE . 'skel_' . $nom . '.php';
Fil's avatar
Fil a validé

	// le squelette est-il deja compile et perenne ?
	if (!squelette_obsolete($phpfile, $sourcefile)
Fil's avatar
Fil a validé
	AND lire_fichier ($phpfile, $contenu,
	array('critique' => 'oui', 'phpcheck' => 'oui'))) 
		eval('?'.'>'.$contenu);

	// sinon, charger le compilateur et verifier que le source est lisible
	// Le fichier suivant peut contenir entre autres:
	// 1. les filtres utilises par le squelette
	// Le point 1 exige qu'il soit lu dans tous les cas.
	// Le point 2 exige qu'il soit lu apres inc-compilo
	// (car celui-ci initialise $tables_principales) mais avant la compil

	include_local($squelette . '_fonctions', true);
Fil's avatar
Fil a validé
	if (function_exists($nom)) return $nom;
	$skel_code = calculer_squelette($skel, $nom, $ext, $sourcefile);
	// Tester si le compilateur renvoie une erreur
Fil's avatar
Fil a validé
	if (is_array($skel_code))
		erreur_squelette($skel_code[0], $skel_code[1]);
	else {
esj's avatar
esj a validé
		if ($GLOBALS['var_mode'] == 'debug') {
			include_ecrire("inc_debug_sql");
			debug_dumpfile ($skel_code, $nom, 'code');
esj's avatar
 
esj a validé
#		spip_log($skel_code);
Fil's avatar
Fil a validé
		eval('?'.'>'.$skel_code);
		if (function_exists($nom)) {
Fil's avatar
Fil a validé
			ecrire_fichier ($phpfile, $skel_code);
			return $nom;
		} else {
			erreur_squelette($sourcefile, _L('Erreur de compilation'));
Fil's avatar
Fil a validé
}

# Provoque la recherche du squelette $fond d'une $lang donnee,
esj's avatar
esj a validé
# et l'applique sur un $contexte pour un certain $cache.
Fil's avatar
Fil a validé
# Retourne un tableau de 3 elements:
# 'texte' => la page calculee
# 'process_ins' => 'html' ou 'php' si presence d'un '< ?php'
esj's avatar
esj a validé
# 'invalideurs' => les invalideurs (cf inc-calcul-squel)

# En cas d'erreur process_ins est absent et texte est un tableau de 2 chaines

# La recherche est assuree par la fonction chercher_squelette,
# definie dans inc-chercher, fichier non charge si elle est deja definie
# (typiquement dans mes_fonctions.php)
function cherche_page ($cache, $contexte, $fond)  {
	if (!function_exists('chercher_squelette'))
		include_local("inc-chercher-squelette");
Fil's avatar
Fil a validé
	// Choisir entre $fond-dist.html, $fond=7.html, etc?
	$id_rubrique_fond = 0;
	// Chercher le fond qui va servir de squelette
	if ($r = sql_rubrique_fond($contexte))
		list($id_rubrique_fond, $lang) = $r;
esj's avatar
 
esj a validé
		$lang = $GLOBALS['meta']['langue_site'];
	// Si inc-urls ou un appel dynamique veut fixer la langue, la recuperer
	$lang = $contexte['lang'];

	if (!$GLOBALS['forcer_lang'])
		lang_select($lang);

Fil's avatar
Fil a validé
	$skel = chercher_squelette($fond,
			$id_rubrique_fond,
			$GLOBALS['spip_lang']);
	// Charger le squelette et recuperer sa fonction principale
	// (compilation automatique au besoin) et calculer
esj's avatar
esj a validé
	$page = array();

	if ($skel) {
Fil's avatar
Fil a validé
		if ($fonc = charger_squelette($skel)) {
			spip_timer('calcul page');
			$page = $fonc(array('cache' => $cache), array($contexte));
			spip_log("calcul ("
				.spip_timer('calcul page')
				.") ".trim("[$skel] $cache")
				." - ".strlen($page['texte']).' octets'
			);
		}
Fil's avatar
Fil a validé

Fil's avatar
Fil a validé
		if ($GLOBALS['var_mode'] == 'debug') {
			include_ecrire("inc_debug_sql");
			debug_dumpfile ($page['texte'], $fonc, 'resultat');
Fil's avatar
Fil a validé
		}
Fil's avatar
Fil a validé
#	spip_log("page " . strlen($page['texte']) . " $skel .  $fonc");
Fil's avatar
Fil a validé
	// Retourner la structure de la page
esj's avatar
esj a validé

Fil's avatar
Fil a validé
	return $page;
Fil's avatar
Fil a validé

//
// Contexte : lors du calcul d'une page spip etablit le contexte a partir
Fil's avatar
Fil a validé
// des variables $_GET et $_POST, et leur ajoute la date
// Note : pour hacker le contexte depuis le fichier d'appel (page.php),
Fil's avatar
Fil a validé
// il est recommande de modifier $_GET['toto'] (meme si la page est
Fil's avatar
Fil a validé
// appelee avec la methode POST).
//
Fil's avatar
Fil a validé
function calculer_contexte() {
Fil's avatar
Fil a validé
	global $_GET, $_POST;

	$contexte = array();
Fil's avatar
Fil a validé
	foreach($_GET as $var => $val) {
		if (strpos($var, 'var_') !== 0)
Fil's avatar
Fil a validé
			$contexte[$var] = $val;
	}
Fil's avatar
Fil a validé
	foreach($_POST as $var => $val) {
		if (strpos($var, 'var_') !== 0)
Fil's avatar
Fil a validé
	if ($GLOBALS['date'])
		$contexte['date'] = $contexte['date_redac'] = normaliser_date($GLOBALS['date']);
Fil's avatar
Fil a validé
	else
		$contexte['date'] = $contexte['date_redac'] = date("Y-m-d H:i:s");

	return $contexte;
function calculer_page_globale($cache, $fond) {

esj's avatar
esj a validé
	global $lastmodified, $_SERVER, $contexte;
esj's avatar
esj a validé
	$contexte = calculer_contexte();
Fil's avatar
Fil a validé

esj's avatar
esj a validé
	// Gestion des URLs personnalises (propre etc)
	// ATTENTION: $contexte est global car cette fonction le modifie.
	// $fond est passe par reference aussi pour modification
	// (tout ca parce que ces URL masque ces donnees qu'on restaure ici)
	// Bref,  les URL dites propres ont une implementation sale.
	// Interdit de nettoyer, faut assumer l'histoire.
Fil's avatar
Fil a validé
	if (function_exists("recuperer_parametres_url")) {
		recuperer_parametres_url($fond, nettoyer_uri());
		// remettre les globales pour le bouton "Modifier cet article"
esj's avatar
esj a validé
		foreach ($contexte as $var=>$val)
			if (substr($var,0,3) == 'id_') $GLOBALS[$var] = $val;
Fil's avatar
Fil a validé
	}

	// si le champ chapo commence par '=' c'est une redirection.
	if ($id_article = intval($contexte['id_article'])) {
		if ($art = sql_chapo($id_article)) {
			$chapo = $art['chapo'];
			if (substr($chapo, 0, 1) == '=') {
				list(,$url) = extraire_lien(array('','','',
				substr($chapo, 1)));
				if ($url) { // sinon les navigateurs pataugent
					$url = texte_script(str_replace('&amp;', '&', $url));
					return array('texte' => "<".
					"?php redirige_par_entete('$url'); ?" . ">",
					'process_ins' => 'php');
				}
			}
		}
	}

Fil's avatar
Fil a validé
	// Go to work !
esj's avatar
esj a validé
	$page = cherche_page($cache, $contexte, $fond);
Fil's avatar
Fil a validé
	$signal = array();
	foreach(array('id_parent', 'id_rubrique', 'id_article', 'id_auteur',
	'id_breve', 'id_forum', 'id_secteur', 'id_syndic', 'id_syndic_article',
	'id_mot', 'id_groupe', 'id_document') as $val) {
esj's avatar
esj a validé
		if ($contexte[$val])
			$signal['contexte'][$val] = intval($contexte[$val]);
Fil's avatar
Fil a validé
	}

	$page['signal'] = $signal;
	$page['signal']['process_ins'] = $page['process_ins'];
	$lastmodified = time();
Fil's avatar
Fil a validé
	return $page;
esj's avatar
esj a validé
}
Yannick Patois's avatar
Yannick Patois a validé
?>