/** * 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; }
/** * 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; } }
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; }