/**
 * Routage automatique de la 404 si le bloc de contenu est vide
 * Seul le bloc principal est pris en compte (le premier de la liste)
 * mais il est possible de personaliser le ou les blocs a prendre en compte pour detecter une 404 :
 * $GLOBALS['z_blocs_404'] = array('content','aside');
 * On ne declenchera alors une 404 que si content/xxx et aside/xxx sont vide tous les deux
 * (attention a ce que la page 404 ait bien un de ces blocs non vide pour eviter une boucle infinie)
 *
 * @param array $flux
 *
 * @return array
 */
function zcore_recuperer_fond($flux)
{
    static $empty_count = 0, $is_404 = false;
    static $z_blocs_404, $z_blocs_404_nlength, $z_blocs_404_ncount;
    if ($is_404) {
        if ($flux['args']['fond'] === "structure") {
            $is_404 = false;
            // pas de risque de reentrance
            $code = "404 Not Found";
            $contexte_inclus = array('erreur' => "", 'code' => $code, 'lang' => $GLOBALS['spip_lang']);
            $flux['data'] = evaluer_fond('404', $contexte_inclus);
            $flux['data']['status'] = intval($code);
            // pas remonte vers la page mais un jour peut etre...
            // du coup on envoie le status a la main
            include_spip("inc/headers");
            http_status(intval($code));
        }
    } elseif (!test_espace_prive()) {
        if (!isset($z_blocs_404)) {
            if (isset($GLOBALS['z_blocs_404'])) {
                $z_blocs_404 = $GLOBALS['z_blocs_404'];
                if (is_array($z_blocs_404) and count($z_blocs_404) == 1) {
                    $z_blocs_404 = reset($z_blocs_404);
                }
            } else {
                if (!function_exists("z_blocs")) {
                    $styliser_par_z = charger_fonction('styliser_par_z', 'public');
                }
                $z_blocs = z_blocs(test_espace_prive());
                $z_blocs_404 = reset($z_blocs);
                // contenu par defaut
            }
            if (is_array($z_blocs_404)) {
                $z_blocs_404_ncount = count($z_blocs_404);
                $z_blocs_404_nlength = array_map('strlen', $z_blocs_404);
            } else {
                $z_blocs_404_ncount = 1;
                $z_blocs_404_nlength = strlen($z_blocs_404);
            }
        }
        $fond = $flux['args']['fond'];
        // verifier rapidement que c'est un des fonds de reference pour la 404 :
        // le fond commende par nomdudossier/
        // le fond n'a pas de / suppelementaires (on est au bon niveau)
        $quick_match = false;
        if (strpos($fond, "/") !== false and $z_blocs_404_ncount) {
            if ($z_blocs_404_ncount == 1) {
                $quick_match = (strncmp($fond, "{$z_blocs_404}/", $z_blocs_404_nlength + 1) === 0 and strpos($fond, "/", $z_blocs_404_nlength + 1) === false);
            } else {
                foreach ($z_blocs_404 as $k => $zb) {
                    if (strncmp($fond, "{$zb}/", $z_blocs_404_nlength[$k] + 1) === 0 and strpos($fond, "/", $z_blocs_404_nlength[$k] + 1) === false) {
                        $quick_match = true;
                        break;
                    }
                }
            }
        }
        if ($quick_match and !strlen(trim($flux['data']['texte']))) {
            $empty_count++;
            if ($empty_count >= $z_blocs_404_ncount) {
                $is_404 = true;
            }
        }
    }
    return $flux;
}
Пример #2
0
/**
 * Calcule un squelette avec un contexte et retourne son contenu
 *
 * La fonction de base de SPIP : un squelette + un contexte => une page.
 * $fond peut etre un nom de squelette, ou une liste de squelette au format array.
 * Dans ce dernier cas, les squelettes sont tous evalues et mis bout a bout
 * $options permet de selectionner les options suivantes :
 *
 * - trim => true (valeur par defaut) permet de ne rien renvoyer si le fond ne produit que des espaces ;
 * - raw  => true permet de recuperer la strucure $page complete avec entetes et invalideurs
 *          pour chaque $fond fourni.
 *
 * @api
 * @param string/array $fond
 *     - Le ou les squelettes à utiliser, sans l'extension, {@example prive/liste/auteurs}
 *     - Le fichier sera retrouvé dans la liste des chemins connus de SPIP (squelettes, plugins, spip)
 * @param array $contexte
 *     - Informations de contexte envoyées au squelette, {@example array('id_rubrique' => 8)}
 *     - La langue est transmise automatiquement (sauf option étoile).
 * @param array $options
 *     Options complémentaires :
 *
 *     - trim   : applique un trim sur le résultat (true par défaut)
 *     - raw    : retourne un tableau d'information sur le squelette (false par défaut)
 *     - etoile : ne pas transmettre la langue au contexte automatiquement (false par défaut),
 *                équivalent de INCLURE*
 *     - ajax   : gere les liens internes du squelette en ajax (équivalent du paramètre {ajax})
 * @param string $connect
 *     Non du connecteur de bdd a utiliser
 * @return string|array
 *     - Contenu du squelette calculé
 *     - ou tableau d'information sur le squelette.
 */
function recuperer_fond($fond, $contexte = array(), $options = array(), $connect = '')
{
    if (!function_exists('evaluer_fond')) {
        include_spip('public/assembler');
    }
    // assurer la compat avec l'ancienne syntaxe
    // (trim etait le 3eme argument, par defaut a true)
    if (!is_array($options)) {
        $options = array('trim' => $options);
    }
    if (!isset($options['trim'])) {
        $options['trim'] = true;
    }
    if (isset($contexte['connect'])) {
        $connect = $connect ? $connect : $contexte['connect'];
        unset($contexte['connect']);
    }
    $texte = "";
    $pages = array();
    $lang_select = '';
    if (!isset($options['etoile']) or !$options['etoile']) {
        // Si on a inclus sans fixer le critere de lang, on prend la langue courante
        if (!isset($contexte['lang'])) {
            $contexte['lang'] = $GLOBALS['spip_lang'];
        }
        if ($contexte['lang'] != $GLOBALS['meta']['langue_site']) {
            $lang_select = lang_select($contexte['lang']);
        }
    }
    if (!isset($GLOBALS['_INC_PUBLIC'])) {
        $GLOBALS['_INC_PUBLIC'] = 0;
    }
    $GLOBALS['_INC_PUBLIC']++;
    foreach (is_array($fond) ? $fond : array($fond) as $f) {
        $page = evaluer_fond($f, $contexte, $connect);
        if ($page === '') {
            $c = isset($options['compil']) ? $options['compil'] : '';
            $a = array('fichier' => $fond);
            $erreur = _T('info_erreur_squelette2', $a);
            // squelette introuvable
            erreur_squelette($erreur, $c);
            // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
            $page = array('texte' => '', 'erreur' => $erreur);
        }
        $page = pipeline('recuperer_fond', array('args' => array('fond' => $f, 'contexte' => $contexte, 'options' => $options, 'connect' => $connect), 'data' => $page));
        if (isset($options['ajax']) and $options['ajax']) {
            if (!function_exists('encoder_contexte_ajax')) {
                include_spip('inc/filtres');
            }
            $page['texte'] = encoder_contexte_ajax(array_merge($contexte, array('fond' => $f)), '', $page['texte'], $options['ajax']);
        }
        if (isset($options['raw']) and $options['raw']) {
            $pages[] = $page;
        } else {
            $texte .= $options['trim'] ? rtrim($page['texte']) : $page['texte'];
        }
    }
    $GLOBALS['_INC_PUBLIC']--;
    if ($lang_select) {
        lang_select();
    }
    if (isset($options['raw']) and $options['raw']) {
        return is_array($fond) ? $pages : reset($pages);
    } else {
        return $options['trim'] ? ltrim($texte) : $texte;
    }
}
Пример #3
0
function recuperer_fond($fond, $contexte=array(), $options = array(), $connect='') {
	include_spip('public/assembler');
	// assurer la compat avec l'ancienne syntaxe
	// (trim etait le 3eme argument, par defaut a true)
	if (!is_array($options)) $options = array('trim'=>$options);
	if (!isset($options['trim'])) $options['trim']=true;

	if (isset($contexte['connect'])){
		$connect = ($connect ? $connect : $contexte['connect']);
		unset($contexte['connect']);
	}

	if (isset($options['modele']))
		$contexte = creer_contexte_de_modele($contexte);

	$texte = "";
	$pages = array();
	if (isset($contexte['fond'])
	 // securite anti injection pour permettre aux plugins de faire
	 // des interfaces avec simplement recuperer_fond($fond,$_GET);
	 AND $contexte['fond']!==_request('fond'))
		$fond = $contexte['fond'];

	$lang_select = '';
	if (!isset($options['etoile']) OR !$options['etoile']){
		// Si on a inclus sans fixer le critere de lang, on prend la langue courante
		if (!isset($contexte['lang']))
			$contexte['lang'] = $GLOBALS['spip_lang'];

		if ($contexte['lang'] != $GLOBALS['meta']['langue_site']) {
			$lang_select = lang_select($contexte['lang']);
		}
	}

	@$GLOBALS['_INC_PUBLIC']++;

	foreach(is_array($fond) ? $fond : array($fond) as $f){
		$page = evaluer_fond($f, $contexte, $connect);
		if ($page === '') {
			$c = isset($options['compil']) ? $options['compil'] :'';
			$a = array('fichier'=>$fond.'.'._EXTENSION_SQUELETTES);
			$erreur = _T('info_erreur_squelette2', $a); // squelette introuvable
			erreur_squelette($erreur, $c);
			// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
			$page = array('texte' => '', 'erreur' => $erreur);
		}

		if (isset($options['ajax'])AND $options['ajax']){
			include_spip('inc/filtres');
			$page['texte'] = encoder_contexte_ajax(array_merge($contexte,array('fond'=>$f)),'',$page['texte']);
		}

		$page = pipeline('recuperer_fond',array(
			'args'=>array('fond'=>$fond,'contexte'=>$contexte,'options'=>$options,'connect'=>$connect),
			'data'=>$page
		));
		if (isset($options['raw']) AND $options['raw'])
			$pages[] = $page;
		else
			$texte .= $options['trim'] ? rtrim($page['texte']) : $page['texte'];
	}

	$GLOBALS['_INC_PUBLIC']--;

	if ($lang_select) lang_select();
	if (isset($options['raw']) AND $options['raw'])
		return is_array($fond)?$pages:reset($pages);
	else
		return $options['trim'] ? ltrim($texte) : $texte;
}