Пример #1
0
function traiter_appels_inclusions_ajax(){
	// traiter les appels de bloc ajax (ex: pagination)
	if ($v = _request('var_ajax')
	AND $v !== 'form'
	AND $args = _request('var_ajax_env')) {
		include_spip('inc/filtres');
		include_spip('inc/actions');
		if ($args = decoder_contexte_ajax($args)
		AND $fond = $args['fond']) {
			include_spip('public/assembler');
			$contexte = calculer_contexte();
			$contexte = array_merge($args, $contexte);
			$page = recuperer_fond($fond,$contexte,array('trim'=>false));
			$texte = $page;
			if ($ancre = _request('var_ajax_ancre')){
				// pas n'importe quoi quand meme dans la variable !
				$ancre = str_replace(array('<','"',"'"),array('&lt;','&quot;',''),$ancre);
				$texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>".$texte;
			}
		}
		else {
			include_spip('inc/headers');
			http_status(403);
			$texte = _L('signature ajax bloc incorrecte');
		}
		ajax_retour($texte);
		return true; // on a fini le hit
	}
	return false;	
}
Пример #2
0
function assembler($fond, $connect='') {

	global $flag_preserver,$lastmodified, $use_cache, $contexte;

	$contexte = calculer_contexte();
	$page = array('contexte_implicite'=>calculer_contexte_implicite());
	$page['contexte_implicite']['cache'] = $fond . preg_replace(',\.[a-zA-Z0-9]*$,', '', preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI']));
	// Cette fonction est utilisee deux fois
	$cacher = charger_fonction('cacher', 'public');
	// Les quatre derniers parametres sont modifies par la fonction:
	// emplacement, validite, et, s'il est valide, contenu & age
	$res = $cacher($GLOBALS['contexte'], $use_cache, $chemin_cache, $page, $lastmodified);
	// Si un resultat est retourne, c'est un message d'impossibilite
	if ($res) {return array('texte' => $res);}

	if (!$chemin_cache || !$lastmodified) $lastmodified = time();

	$headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');

	// Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
	// une perennite valide a meme reponse qu'une requete HEAD (par defaut les
	// pages sont dynamiques)
	if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
	AND !$GLOBALS['var_mode']
	AND $chemin_cache
	AND isset($page['entetes'])
	AND isset($page['entetes']['Cache-Control'])
	AND strstr($page['entetes']['Cache-Control'],'max-age=')
	AND !strstr($_SERVER['SERVER_SOFTWARE'],'IIS/')
	) {
		$since = preg_replace('/;.*/', '',
			$_SERVER['HTTP_IF_MODIFIED_SINCE']);
		$since = str_replace('GMT', '', $since);
		if (trim($since) == gmdate("D, d M Y H:i:s", $lastmodified)) {
			$page['status'] = 304;
			$headers_only = true;
		}
	}

	// Si requete HEAD ou Last-modified compatible, ignorer le texte
	// et pas de content-type (pour contrer le bouton admin de inc-public)
	if ($headers_only) {
		$page['entetes']["Connection"] = "close";
		$page['texte'] = "";
	} else {
		// si la page est prise dans le cache
		if (!$use_cache)  {
		// Informer les boutons d'admin du contexte
		// (fourni par $renommer ci-dessous lors de la mise en cache)
			$contexte = $page['contexte'];

			// vider les globales url propres qui ne doivent plus etre utilisees en cas
			// d'inversion url => objet
			unset($_SERVER['REDIRECT_url_propre']);
			unset($_ENV['url_propre']);
		}
		// ATTENTION, gestion des URLs transformee par le htaccess
		// $renommer = 'urls_propres_dist';
		// renvoie array($contexte, $type, $url_redirect, $nfond)
		// $nfond n'est retourne que si l'url est definie apres le ?
		// et risque d'etre effacee par un form en get
		// elle est utilisee par form_hidden exclusivement
		// Compat ascendante si le retour est null:
		// 1. $contexte est global car cette fonction le modifie.
		// 2. $fond est passe par reference, pour la meme raison
		// et calculer la page
		else {
			$renommer = generer_url_entite();
			if ($renommer) {
				$url = nettoyer_uri();
				$a = $renommer($url, $fond, $contexte);
				if (is_array($a)) {
					list($ncontexte, $type, $url_redirect, $nfond) = $a;
					if (strlen($url_redirect)
					AND $url !== $url_redirect) {
						spip_log("Redirige $url vers $url_redirect");
						include_spip('inc/headers');
						redirige_par_entete($url_redirect, '', 301);
					}
					if (isset($nfond))
						$fond = $nfond;
					else if ($fond == ''
					OR $fond == 'type_urls' /* compat avec htaccess 2.0.0 */
					)
						$fond = ($type === 'syndic') ? 'site' : $type;
					if (isset($ncontexte))
						$contexte = $ncontexte;
					if (defined('_DEFINIR_CONTEXTE_TYPE') AND _DEFINIR_CONTEXTE_TYPE)
						$contexte['type'] = ($type === 'syndic') ? 'site' : $type;
				}
			}
			// compatibilite <= 1.9.2
			elseif (function_exists('recuperer_parametres_url'))
				recuperer_parametres_url($fond, nettoyer_uri());

			// vider les globales url propres qui ne doivent plus etre utilisees en cas
			// d'inversion url => objet
			unset($_SERVER['REDIRECT_url_propre']);
			unset($_ENV['url_propre']);

			// squelette par defaut
			if (!strlen($fond))
				$fond = 'sommaire';

			// produire la page : peut mettre a jour $lastmodified
			$produire_page = charger_fonction('produire_page','public');
			$page = $produire_page($fond, $GLOBALS['contexte'], $use_cache, $chemin_cache, NULL, $page, $lastmodified, $connect);
			if ($page === '') {
				$erreur = _T('info_erreur_squelette2',
					array('fichier'=>htmlspecialchars($fond).'.'._EXTENSION_SQUELETTES));
				erreur_squelette($erreur);
				// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
				$page = array('texte' => '', 'erreur' => $erreur);
			}
		}

		if ($page AND $chemin_cache) $page['cache'] = $chemin_cache;

		auto_content_type($page);

		$flag_preserver |=  headers_sent();

		// Definir les entetes si ce n'est fait 
		if (!$flag_preserver) {
			if ($GLOBALS['flag_ob']) {
				// Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
				if (trim($page['texte']) === ''
				AND $GLOBALS['var_mode'] != 'debug'
				AND !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
				) {
					// passer le type d'objet recherche au contexte de la page d'erreur
					$contexte['type'] = (isset($type)?$type:$fond);
				  $page = message_page_indisponible($page, $contexte);
					// cacher la page d'erreur car celle ci est contextuelle
					if ($chemin_cache
					AND is_array($page)
					AND count($page)
					AND $page['entetes']['X-Spip-Cache'] > 0){
						$cacher = charger_fonction('cacher', 'public');
						$lastinclude = time();
						$cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
					}
				}
				// pas de cache client en mode 'observation'
				if ($GLOBALS['var_mode']) {
					$page['entetes']["Cache-Control"]= "no-cache,must-revalidate";
					$page['entetes']["Pragma"] = "no-cache";
				}
			}
		}
	}

	// Entete Last-Modified:
	// eviter d'etre incoherent en envoyant un lastmodified identique
	// a celui qu'on a refuse d'honorer plus haut (cf. #655)
	if ($lastmodified
	AND !isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
	AND !isset($page['entetes']["Last-Modified"]))
		$page['entetes']["Last-Modified"]=gmdate("D, d M Y H:i:s", $lastmodified)." GMT";

	return $page;
}
Пример #3
0
function assembler($fond, $connect = '')
{
    // flag_preserver est modifie ici, et utilise en globale
    // use_cache sert a informer le bouton d'admin pr savoir s'il met un *
    // contexte est utilise en globale dans le formulaire d'admin
    $GLOBALS['contexte'] = calculer_contexte();
    $page = array('contexte_implicite' => calculer_contexte_implicite());
    $page['contexte_implicite']['cache'] = $fond . preg_replace(',\\.[a-zA-Z0-9]*$,', '', preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI']));
    // Cette fonction est utilisee deux fois
    $cacher = charger_fonction('cacher', 'public', true);
    // Les quatre derniers parametres sont modifies par la fonction:
    // emplacement, validite, et, s'il est valide, contenu & age
    if ($cacher) {
        $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified);
    } else {
        $GLOBALS['use_cache'] = -1;
    }
    // Si un resultat est retourne, c'est un message d'impossibilite
    if ($res) {
        return array('texte' => $res);
    }
    if (!$chemin_cache || !$lastmodified) {
        $lastmodified = time();
    }
    $headers_only = $_SERVER['REQUEST_METHOD'] == 'HEAD';
    $calculer_page = true;
    // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
    // une perennite valide a meme reponse qu'une requete HEAD (par defaut les
    // pages sont dynamiques)
    if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) and (!defined('_VAR_MODE') or !_VAR_MODE) and $chemin_cache and isset($page['entetes']) and isset($page['entetes']['Cache-Control']) and strstr($page['entetes']['Cache-Control'], 'max-age=') and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')) {
        $since = preg_replace('/;.*/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE']);
        $since = str_replace('GMT', '', $since);
        if (trim($since) == gmdate("D, d M Y H:i:s", $lastmodified)) {
            $page['status'] = 304;
            $headers_only = true;
            $calculer_page = false;
        }
    }
    // Si requete HEAD ou Last-modified compatible, ignorer le texte
    // et pas de content-type (pour contrer le bouton admin de inc-public)
    if (!$calculer_page) {
        $page['texte'] = "";
    } else {
        // si la page est prise dans le cache
        if (!$GLOBALS['use_cache']) {
            // Informer les boutons d'admin du contexte
            // (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
            $GLOBALS['contexte'] = $page['contexte'];
            // vider les globales url propres qui ne doivent plus etre utilisees en cas
            // d'inversion url => objet
            // plus necessaire si on utilise bien la fonction urls_decoder_url
            #unset($_SERVER['REDIRECT_url_propre']);
            #unset($_ENV['url_propre']);
        } else {
            // Compat ascendante :
            // 1. $contexte est global
            // (a evacuer car urls_decoder_url gere ce probleme ?)
            // et calculer la page
            if (!test_espace_prive()) {
                include_spip('inc/urls');
                list($fond, $GLOBALS['contexte'], $url_redirect) = urls_decoder_url(nettoyer_uri(), $fond, $GLOBALS['contexte'], true);
            }
            // squelette par defaut
            if (!strlen($fond)) {
                $fond = 'sommaire';
            }
            // produire la page : peut mettre a jour $lastmodified
            $produire_page = charger_fonction('produire_page', 'public');
            $page = $produire_page($fond, $GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, null, $page, $lastmodified, $connect);
            if ($page === '') {
                $erreur = _T('info_erreur_squelette2', array('fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES));
                erreur_squelette($erreur);
                // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
                $page = array('texte' => '', 'erreur' => $erreur);
            }
        }
        if ($page and $chemin_cache) {
            $page['cache'] = $chemin_cache;
        }
        auto_content_type($page);
        $GLOBALS['flag_preserver'] |= headers_sent();
        // Definir les entetes si ce n'est fait
        if (!$GLOBALS['flag_preserver']) {
            if ($GLOBALS['flag_ob']) {
                // Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
                if (trim($page['texte']) === '' and _VAR_MODE != 'debug' and !isset($page['entetes']['Location'])) {
                    $GLOBALS['contexte']['fond_erreur'] = $fond;
                    $page = message_page_indisponible($page, $GLOBALS['contexte']);
                }
                // pas de cache client en mode 'observation'
                if (defined('_VAR_MODE') and _VAR_MODE) {
                    $page['entetes']["Cache-Control"] = "no-cache,must-revalidate";
                    $page['entetes']["Pragma"] = "no-cache";
                }
            }
        }
    }
    // Entete Last-Modified:
    // eviter d'etre incoherent en envoyant un lastmodified identique
    // a celui qu'on a refuse d'honorer plus haut (cf. #655)
    if ($lastmodified and !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) and !isset($page['entetes']["Last-Modified"])) {
        $page['entetes']["Last-Modified"] = gmdate("D, d M Y H:i:s", $lastmodified) . " GMT";
    }
    // fermer la connexion apres les headers si requete HEAD
    if ($headers_only) {
        $page['entetes']["Connection"] = "close";
    }
    return $page;
}
/**
 * Permet d’ajouter du contenu dans le menu admin du plugin réservation.
 *
 * @pipeline affiche_gauche
 *
 * @param array $flux
 *        	Données du pipeline
 * @return array Données du pipeline
 */
function reservations_credits_reservation_evenement_menu_admin($flux)
{
    // reservations sur les evenements
    $contexte = calculer_contexte();
    $data .= recuperer_fond('prive/gauche/menu_admin_credit', $contexte);
    $flux['data'] .= $data;
    return $flux;
}