예제 #1
0
function sommaire_d_une_page(&$texte, &$nbh3, $page=0, $num_pages=0) {
	static $index = 0;
	if($page===false) $index = 0;
	static $self = NULL; 
	if(!isset($self)) 
		$self = str_replace('&', '&', nettoyer_uri());//self();//$GLOBALS['REQUEST_URI'];
	if($page===false) return;
	// trouver quel <hx> est utilise
	$root = $niveau = $match = preg_match(',<h(\d),',$GLOBALS['debut_intertitre'],$regs)?$regs[1]:'3';
	@define('_sommaire_NB_CARACTERES', 30);
	@define('_sommaire_PROFONDEUR', 1);
	if(_sommaire_PROFONDEUR>1)
		$match = $match .'-' . ($match+_sommaire_PROFONDEUR-1);
	// traitement des intertitres <hx>
	preg_match_all(",(<h([$match])[^>]*)>(.*)</h\\2>,Umsi", $texte, $regs);
	$nbh3 += count($regs[0]);
	$pos = 0; $sommaire = '';
	// calcul de la page
	$suffixe = $page?_T('couteau:sommaire_page', array('page'=>$page)):'';
	$fct_lien_retour = function_exists('sommaire_lien_retour')?'sommaire_lien_retour':'sommaire_lien_retour_dist';
	$fct_id_ancre = defined('_sommaire_JOLIES_ANCRES')?'sommaire_id_ancre_ex'
		:(function_exists('sommaire_id_ancre')?'sommaire_id_ancre':'sommaire_id_ancre_dist');
	$nb = count($regs[0]);
	for($i=0;$i<$nb;$i++,$index++){
		$w = &$regs[0][$i]; $h = &$regs[1][$i]; $n = &$regs[2][$i];
		if (($pos2 = strpos($texte, $w, $pos))!==false) {
			$t = $regs[3][$i];
			// calcul de l'ancre, $t peut etre modifie
			$ancre = $fct_id_ancre($index, $t, $n);
			$id = " id=\"$ancre\">";
			//$titre = preg_replace(',^<p[^>]*>(.*)</p>$,Umsi', '\\1', trim($t));
			// ancre 'retour au sommaire', sauf :
			// si on imprime, ou si les blocs depliables utilisent h{$n}...
			$titre = (defined('_CS_PRINT') OR (strpos($w, 'blocs_titre')!==false))
				?$t//$titre
				:$fct_lien_retour($self, $t);//$titre);
			$texte = substr($texte, 0, $pos2) . $h . $id . $titre
				. substr($texte, $pos2 + strlen($h)+1 + strlen($regs[3][$i]));
			$pos = $pos2 + strlen($id) + strlen($w);
			$brut = sommaire_nettoyer_titre($t);
			// pas trop long quand meme...
			$lien = cs_propre(couper($brut, _sommaire_NB_CARACTERES));
			// eviter une ponctuation a la fin, surtout si la page est precisee
			$lien = preg_replace('/(&nbsp;|\s)*'.($page?'[!?,;.:]+$/':'[,;.:]+$/'), '', $lien);
			$titre = attribut_html(couper($brut, 100));
			// si la decoupe en page est active...
			$artpage = (function_exists('decoupe_url') && (strlen(_request('artpage')) || $page>1) )
				?decoupe_url($self, $page, $num_pages):$self;
			$artpage = "\n<li><a $st title=\"$titre\" href=\"{$artpage}#$ancre\">$lien</a>$suffixe";
			if($niveau==$n) $sommaire .= ($sommaire?'</li>':'').$artpage;
			elseif($niveau<$n) $sommaire .= "\n<ul>".$artpage;
			else $sommaire .= '</li></ul></li>'.$artpage;
			$niveau = $n;
		}
	}
	return $sommaire?$sommaire.'</li>'.($niveau!=$root?'</ul>':''):'';
}
예제 #2
0
function sommaire_d_une_page(&$texte, &$nbh3, $page = 0, $num_pages = 0)
{
    static $index;
    if (!$index || $page === false) {
        $index = 0;
    }
    if ($page === false) {
        return;
    }
    // trouver quel <hx> est utilise
    $hierarchie = preg_match(',<h(\\d),', $GLOBALS['debut_intertitre'], $regs) ? $regs[1] : '3';
    @define('_sommaire_NB_CARACTERES', 30);
    $self = nettoyer_uri();
    //self();//$GLOBALS['REQUEST_URI'];
    // si on n'est pas en mode impression, on calcule l'image de retour au sommaire
    if (!defined('_CS_PRINT')) {
        $titre = _T('couteau:sommaire_titre');
        $haut = "<a title=\"{$titre}\" href=\"" . $self . "#sommaire\" class=\"sommaire_ancre\">&nbsp;</a>";
        // modif cld
    } else {
        $haut = '';
    }
    // traitement des intertitres <hx>
    preg_match_all(",(<h{$hierarchie}[^>]*)>(.*)</h{$hierarchie}>,Umsi", $texte, $regs);
    $nbh3 += count($regs[0]);
    $pos = 0;
    $sommaire = '';
    // calcul de la page
    $p = $page ? _T('couteau:sommaire_page', array('page' => $page)) : '';
    for ($i = 0; $i < count($regs[0]); $i++, $index++) {
        $ancre = " id=\"sommaire_{$index}\">";
        // modif cld
        if (($pos2 = strpos($texte, $regs[0][$i], $pos)) !== false) {
            $titre = preg_replace(',^<p[^>]*>(.*)</p>$,Umsi', '\\1', trim($regs[2][$i]));
            // ancre 'haut', sauf si les blocs depliables utilisent h3...
            $texte = substr($texte, 0, $pos2) . $regs[1][$i] . $ancre . (strpos($regs[0][$i], 'blocs_titre') === false ? $haut : '') . $titre . substr($texte, $pos2 + strlen($regs[1][$i]) + 1 + strlen($regs[2][$i]));
            $pos = $pos2 + strlen($ancre) + strlen($regs[0][$i]);
            // tout le texte, sans les notes
            $brut = preg_replace(',\\[<a href=["\']#nb.*?</a>\\],', '', echappe_retour($regs[2][$i], 'CS'));
            // pas de glossaire
            if (function_exists('cs_retire_glossaire')) {
                $brut = cs_retire_glossaire($brut);
            }
            // texte brut
            $brut = preg_replace(',[\\n\\r]+,', ' ', textebrut($brut));
            $lien = cs_propre(couper($brut, _sommaire_NB_CARACTERES));
            $lien = preg_replace('/(&nbsp;|\\s)*[!?,;.:]+$/', '', $lien);
            // eviter une ponctuation a la fin
            $titre = attribut_html(couper($brut, 100));
            // si la decoupe en page est active...
            $artpage = function_exists('decoupe_url') && (strlen(_request('artpage')) || $page > 1) ? decoupe_url($self, $page, $num_pages) : $self;
            $sommaire .= "<dd><a {$st} title=\"{$titre}\" href=\"{$artpage}#sommaire_{$index}\">{$lien}</a>{$p}</dd>";
            // modif cld
        }
    }
    return $sommaire;
}
예제 #3
0
/**
 * Detecter les demande d'acces aux pages restreintes
 * et re-orienter vers une 401 si necessaire
 *
 * @param array $contexte
 * @return array
 */
function accesrestreint_page_indisponible($contexte)
{
    if ($contexte['status'] == '404') {
        $objet = "";
        if (isset($contexte['type'])) {
            $objet = $contexte['type'];
        } elseif (isset($contexte['type-page'])) {
            $objet = $contexte['type-page'];
        } elseif (isset($contexte['fond_erreur'])) {
            include_spip('inc/urls');
            define('_DEFINIR_CONTEXTE_TYPE_PAGE', true);
            $c2 = $contexte;
            list($fond2, $c2, $url_redirect) = urls_decoder_url(nettoyer_uri(), $contexte['fond_erreur'], $c2, true);
            $objet = $c2['type-page'];
        }
        if ($objet) {
            $table_sql = table_objet_sql($objet);
            $id_table_objet = id_table_objet($objet);
            if ($id = intval($contexte[$id_table_objet])) {
                $publie = true;
                if (include_spip("base/objets") and function_exists("objet_test_si_publie")) {
                    $publie = objet_test_si_publie($objet, $id);
                } else {
                    $trouver_table = charger_fonction('trouver_table', 'base');
                    $desc = $trouver_table($table_sql);
                    if (isset($desc['field']['statut'])) {
                        $statut = sql_getfetsel('statut', $table_sql, "{$id_table_objet}=" . intval($id));
                        if ($statut != 'publie') {
                            $publie = false;
                        }
                    }
                }
                include_spip('inc/autoriser');
                if ($publie and !autoriser('voir', $objet, $id)) {
                    // c'est un contenu restreint
                    $contexte['status'] = '401';
                    $contexte['code'] = '401 Unauthorized';
                    $contexte['fond'] = '401';
                    $contexte['erreur'] = _T('accesrestreint:info_acces_restreint');
                    $contexte['cible'] = self();
                    if (!isset($contexte['objet'])) {
                        $contexte['objet'] = $objet;
                        $contexte['id_objet'] = $id;
                    }
                }
            }
        }
    }
    return $contexte;
}
예제 #4
0
/**
 * Donner l'URL de base d'un lien vers "soi-meme", modulo les trucs inutiles
 *
 * @param string $amp
 *    Style des esperluettes
 * @param bool $root
 * @return string
 *    URL vers soi-même
**/
function self($amp = '&amp;', $root = false)
{
    $url = nettoyer_uri();
    if (!$root and ($GLOBALS['profondeur_url'] < (_DIR_RESTREINT ? 1 : 2) or defined('_SET_HTML_BASE') and !_SET_HTML_BASE)) {
        $url = preg_replace(',^[^?]*/,', '', $url);
    }
    // ajouter le cas echeant les variables _POST['id_...']
    foreach ($_POST as $v => $c) {
        if (substr($v, 0, 3) == 'id_') {
            $url = parametre_url($url, $v, $c, '&');
        }
    }
    // supprimer les variables sans interet
    if (test_espace_prive()) {
        $url = preg_replace(',([?&])(' . 'lang|show_docs|' . 'changer_lang|var_lang|action)=[^&]*,i', '\\1', $url);
        $url = preg_replace(',([?&])[&]+,', '\\1', $url);
        $url = preg_replace(',[&]$,', '\\1', $url);
    }
    // eviter les hacks
    include_spip('inc/filtres_mini');
    $url = spip_htmlspecialchars($url);
    // &amp; ?
    if ($amp != '&amp;') {
        $url = str_replace('&amp;', $amp, $url);
    }
    // Si ca demarre par ? ou vide, donner './'
    $url = preg_replace(',^([?].*)?$,', './\\1', $url);
    return $url;
}
예제 #5
0
/**
 * Décoder une URL en utilisant les fonctions inverses
 *
 * Gère les URLs transformées par le htaccess.
 *
 * @note
 *   `$renommer = 'urls_propres_dist';`
 *   renvoie `array($contexte, $type, $url_redirect, $nfond)`
 *
 *   `$nfond` n'est retourné que si l'URL est définie apres le `?`
 *   et risque d'être effacée par un form en get.
 *   Elle est utilisée par form_hidden exclusivement.
 *
 *   Compat ascendante si le retour est NULL en gérant une sauvegarde/restauration
 *   des globales modifiées par les anciennes fonctions
 *
 * @param string $url
 *   URL à décoder
 * @param string $fond
 *   Fond initial par défaut
 * @param array $contexte
 *   Contexte initial à prendre en compte
 * @param bool $assembler
 *   `true` si l'URL correspond à l'URL principale de la page qu'on est en train d'assembler
 *   dans ce cas la fonction redirigera automatiquement si besoin
 *   et utilisera les eventuelles globales `$_SERVER['REDIRECT_url_propre']` et `$_ENV['url_propre']`
 *   provenant du htaccess
 * @return array
 *   Liste `$fond, $contexte, $url_redirect`.
 *
 *   Si l'url n'est pas valide, $fond restera à la valeur initiale passée.
 *   Il suffit d'appeler la fonction sans $fond et de vérifier qu'à son retour celui-ci
 *   est non vide pour vérifier une URL
 *
 */
function urls_decoder_url($url, $fond = '', $contexte = array(), $assembler = false)
{
    static $current_base = null;
    // les anciennes fonctions modifient directement les globales
    // on les sauve avant l'appel, et on les retablit apres !
    $save = array(isset($GLOBALS['fond']) ? $GLOBALS['fond'] : null, isset($GLOBALS['contexte']) ? $GLOBALS['contexte'] : null, isset($_SERVER['REDIRECT_url_propre']) ? $_SERVER['REDIRECT_url_propre'] : null, isset($_ENV['url_propre']) ? $_ENV['url_propre'] : null, $GLOBALS['profondeur_url']);
    if (is_null($current_base)) {
        include_spip('inc/filtres_mini');
        // le decodage des urls se fait toujours par rapport au site public
        $current_base = url_absolue(_DIR_RACINE ? _DIR_RACINE : './');
    }
    if (strncmp($url, $current_base, strlen($current_base)) == 0) {
        $url = substr($url, strlen($current_base));
    }
    // si on est en train d'assembler la page principale,
    // recuperer l'url depuis les globales url propres si fournies
    // sinon extraire la bonne portion d'url
    if ($assembler) {
        if (isset($_SERVER['REDIRECT_url_propre'])) {
            $url = $_SERVER['REDIRECT_url_propre'];
        } elseif (isset($_ENV['url_propre'])) {
            $url = $_ENV['url_propre'];
        } else {
            $qs = explode("?", $url);
            // ne prendre que le segment d'url qui correspond, en fonction de la profondeur calculee
            $url = ltrim($qs[0], '/');
            $url = explode('/', $url);
            while (count($url) > $GLOBALS['profondeur_url'] + 1) {
                array_shift($url);
            }
            $qs[0] = implode('/', $url);
            $url = implode("?", $qs);
        }
    }
    unset($_SERVER['REDIRECT_url_propre']);
    unset($_ENV['url_propre']);
    include_spip('inc/filtres_mini');
    if (strpos($url, "://") === false) {
        $GLOBALS['profondeur_url'] = substr_count(ltrim(resolve_path("/{$url}"), '/'), '/');
    } else {
        $GLOBALS['profondeur_url'] = max(0, substr_count($url, "/") - substr_count($current_base, "/"));
    }
    $url_redirect = "";
    $renommer = generer_url_entite('', '', '', '', true);
    if (!$renommer and !function_exists('recuperer_parametres_url')) {
        $renommer = charger_fonction('page', 'urls');
    }
    // fallback pour decoder l'url
    if ($renommer) {
        $a = $renommer($url, $fond, $contexte);
        if (is_array($a)) {
            list($ncontexte, $type, $url_redirect, $nfond) = array_pad($a, 4, null);
            if ($url_redirect == $url) {
                $url_redirect = "";
            }
            // securite pour eviter une redirection infinie
            if ($assembler and strlen($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') {
                    $fond = $type;
                }
            }
            if (isset($ncontexte)) {
                $contexte = $ncontexte;
            }
            if (defined('_DEFINIR_CONTEXTE_TYPE') and _DEFINIR_CONTEXTE_TYPE) {
                $contexte['type'] = $type;
            }
            if (defined('_DEFINIR_CONTEXTE_TYPE_PAGE') and _DEFINIR_CONTEXTE_TYPE_PAGE) {
                $contexte['type-page'] = $type;
            }
        }
    } elseif (function_exists('recuperer_parametres_url')) {
        $GLOBALS['fond'] = $fond;
        $GLOBALS['contexte'] = $contexte;
        recuperer_parametres_url($fond, nettoyer_uri());
        // fond est en principe modifiee directement
        $contexte = $GLOBALS['contexte'];
    }
    // retablir les globales
    list($GLOBALS['fond'], $GLOBALS['contexte'], $_SERVER['REDIRECT_url_propre'], $_ENV['url_propre'], $GLOBALS['profondeur_url']) = $save;
    // vider les globales url propres qui ne doivent plus etre utilisees en cas
    // d'inversion url => objet
    // maintenir pour compat ?
    #if ($assembler) {
    #	unset($_SERVER['REDIRECT_url_propre']);
    #	unset($_ENV['url_propre']);
    #}
    return array($fond, $contexte, $url_redirect);
}
예제 #6
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;
}
/**
 * Retourne une URL vers un validateur
 *
 * @return string
 **/
function admin_valider()
{
    return (!isset($GLOBALS['xhtml']) or $GLOBALS['xhtml'] !== 'true') ? parametre_url(self(), 'var_mode', 'debug', '&') . '&var_mode_affiche=validation' : 'http://validator.w3.org/check?uri=' . rawurlencode("http://" . $_SERVER['HTTP_HOST'] . nettoyer_uri());
}
예제 #8
0
파일: assembler.php 프로젝트: rhertzog/lcs
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;
}
예제 #9
0
function decouper_en_pages_rempl($texte, $pagination_seule=false) {
	// un seul id par page...
	static $id_decoupe = '';
	
	// si pas de separateur, on sort
	if (strpos($texte, _decoupe_SEPARATEUR)===false) return $pagination_seule?'':$texte;

	// au cas ou on ne veuille pas de decoupe, on remplace les '++++' par un filet.
	if (defined('_CS_PRINT') && !$pagination_seule) {
		@define(_decoupe_FILET, '<p style="border-bottom:1px dashed #666; padding:0; margin:1em 20%; font-size:4pt;" >&nbsp; &nbsp;</p>');
		return str_replace(_decoupe_SEPARATEUR, _decoupe_FILET, $texte);
	}
	// recherche du sommaire s'il existe
	if (defined('_sommaire_REM') && (substr_count($texte, _sommaire_REM)==2)) {
		$pages = explode(_sommaire_REM, $texte);
		$sommaire = $pages[0].$pages[1];
		$texte = $pages[2];
	} else $sommaire = ''; 

	// traitement des pages
	$pages = explode(_decoupe_SEPARATEUR, $texte);
	$num_pages = count($pages);
	if ($num_pages == 1) return $pagination_seule?'':$texte;
	$artpage = max(intval(artpage()), 1);
	$artpage = min($artpage, $num_pages);
/*
	// si numero illegal ou si var_recherche existe, alors renvoyer toutes les pages, separees par une ligne <hr/>.
	// la surbrillance pourra alors fonctionner correctement.
	if (strlen($_GET['var_recherche']) || $artpage < 1 || $artpage > $num_pages)
		return join("<hr/>", $pages);
*/

	// si la balise #CS_DECOUPE est utilisee on renvoie le texte sans pagination
	if (!$pagination_seule) {
		// page demandee
		$page = cs_safebalises($pages[$artpage-1]);
		if (isset($_GET['decoupe_recherche'])) {
			include_spip('inc/surligne');
			$page = surligner_mots($page, $_GET['decoupe_recherche']);
		}
		if (defined('_decoupe_BALISE')) return $sommaire.$page;
	}

	$self = nettoyer_uri();//self();//$GLOBALS['REQUEST_URI'];

	// liens des differentes pages sous forme : 1 2 3 4
	$milieu = '';
	for ($i = 1; $i <= $num_pages; $i++) {
		$page_ = supprimer_tags(cs_safebalises(cs_introduire(echappe_retour($pages[$i-1],'CS'))));
		$title = preg_split("/[\r\n]+/", trim($page_), 2);
		$title = attribut_html(/*propre*/(couper($title[0], _decoupe_NB_CARACTERES)));//.' (...)';
		$milieu .= recuperer_fond('fonds/decoupe_item', array(
			'page'=>$i, 'artpage'=>$artpage, 'derniere_page'=>$num_pages,
			'title_page'=>_T('couteau:page_lien', array('page' => $i, 'title' => $title)), 
			'self' =>$self,
		));
	}

	// pagination finale
	$pagination = recuperer_fond('fonds/decoupe', array(
		'artpage'=>$artpage, 'derniere_page'=>$num_pages,
		'items'=>$milieu,
		'self' =>$self,
	));
	if ($pagination_seule) {
		if(trim($pagination)=="") return "";
		$pagination = "<div id='decoupe_balise$id_decoupe' class='pagination decoupe_balise'>\n$pagination\n</div>\n";
		return $pagination;
	}
	// ici $pagination_seule est false, $page est definie
	$pagination1 = "<div id='decoupe_haut$id_decoupe' class='pagination decoupe_haut'>\n$pagination\n</div>\n";
	$pagination2 = "<div id='decoupe_bas$id_decoupe' class='pagination decoupe_bas'>\n$pagination\n</div>\n";
	$id_decoupe++;
	return $sommaire.$pagination1.$page.$pagination2;
}
예제 #10
0
파일: urls.php 프로젝트: nursit/SPIP
/**
 * Decoder une url en utilisant les fonctions inverse
 * 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 en gerant une sauvegarde/restauration
 * des globales modifiees par les anciennes fonctions
 *
 * @param string $url
 *  url a decoder
 * @param string $fond
 *  fond initial par defaut
 * @param array $contexte
 *  contexte initial a prendre en compte
 * @param bool $assembler
 *	true si l'url correspond a l'url principale de la page qu'on est en train d'assembler
 *  dans ce cas la fonction redirigera automatiquement si besoin
 *  et utilisera les eventuelles globales $_SERVER['REDIRECT_url_propre'] et $_ENV['url_propre']
 *  provenant du htaccess
 * @return array
 *  ($fond,$contexte,$url_redirect)
 *  si l'url n'est pas valide, $fond restera a la valeur initiale passee
 *  il suffit d'appeler la fonction sans $fond et de verifier qu'a son retour celui-ci
 *  est non vide pour verifier une url
 *
 */
function urls_decoder_url($url, $fond = '', $contexte = array(), $assembler = false)
{
    static $current_base = null;
    // les anciennes fonctions modifient directement les globales
    // on les sauve avant l'appel, et on les retablit apres !
    $save = array(@$GLOBALS['fond'], @$GLOBALS['contexte'], @$_SERVER['REDIRECT_url_propre'], @$_ENV['url_propre']);
    if (is_null($current_base)) {
        include_spip('inc/filtres_mini');
        // le decodage des urls se fait toujours par rapport au site public
        $current_base = url_absolue(_DIR_RACINE ? _DIR_RACINE : './');
    }
    if (strncmp($url, $current_base, strlen($current_base)) == 0) {
        $url = substr($url, strlen($current_base));
    }
    // si on est pas en train d'assembler la page principale,
    // vider les globales url propres qui ne doivent pas etre utilisees en cas
    // d'inversion url => objet
    if (!$assembler) {
        unset($_SERVER['REDIRECT_url_propre']);
        unset($_ENV['url_propre']);
    }
    $url_redirect = "";
    $renommer = generer_url_entite();
    if (!$renommer and !function_exists('recuperer_parametres_url')) {
        $renommer = charger_fonction('page', 'urls');
    }
    // fallback pour decoder l'url
    if ($renommer) {
        $a = $renommer($url, $fond, $contexte);
        if (is_array($a)) {
            list($ncontexte, $type, $url_redirect, $nfond) = array_pad($a, 4, null);
            if ($url_redirect == $url) {
                $url_redirect = "";
            }
            // securite pour eviter une redirection infinie
            if ($assembler and strlen($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') {
                    $fond = $type;
                }
            }
            if (isset($ncontexte)) {
                $contexte = $ncontexte;
            }
            if (defined('_DEFINIR_CONTEXTE_TYPE') and _DEFINIR_CONTEXTE_TYPE) {
                $contexte['type'] = $type;
            }
            if (defined('_DEFINIR_CONTEXTE_TYPE_PAGE') and _DEFINIR_CONTEXTE_TYPE_PAGE) {
                $contexte['type-page'] = $type;
            }
        }
    } elseif (function_exists('recuperer_parametres_url')) {
        $GLOBALS['fond'] = $fond;
        $GLOBALS['contexte'] = $contexte;
        recuperer_parametres_url($fond, nettoyer_uri());
        // fond est en principe modifiee directement
        $contexte = $GLOBALS['contexte'];
    }
    // retablir les globales
    list($GLOBALS['fond'], $GLOBALS['contexte'], $_SERVER['REDIRECT_url_propre'], $_ENV['url_propre']) = $save;
    // vider les globales url propres qui ne doivent plus etre utilisees en cas
    // d'inversion url => objet
    // maintenir pour compat ?
    #if ($assembler) {
    #	unset($_SERVER['REDIRECT_url_propre']);
    #	unset($_ENV['url_propre']);
    #}
    return array($fond, $contexte, $url_redirect);
}
예제 #11
0
function admin_valider()
{
    global $xhtml;
    return @$xhtml !== 'true' ? parametre_url(self(), 'var_mode', 'debug', '&') . '&var_mode_affiche=validation' : 'http://validator.w3.org/check?uri=' . rawurlencode("http://" . $_SERVER['HTTP_HOST'] . nettoyer_uri());
}