router vers les /dist.html // ou scaffolding ou page automatique les contenus if (!$squelette) { // si on est sur un ?page=XX non trouve if ((isset($flux['args']['contexte'][$page]) and $flux['args']['contexte'][$page] == $fond) or (isset($flux['args']['contexte']['type-page']) and $flux['args']['contexte']['type-page'] == $fond) or ($fond == 'sommaire' and (!isset($flux['args']['contexte'][$page]) or !$flux['args']['contexte'][$page])) ) { // si on est sur un ?page=XX non trouve // se brancher sur contenu/xx si il existe // ou si c'est un objet spip, associe a une table, utiliser le fond homonyme if (!isset($disponible[$fond])) { $disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, $echafauder); } if ($disponible[$fond]) { $flux['data'] = substr(find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext")); } } // echafaudage : // si c'est un fond de contenu d'un objet en base // generer un fond automatique a la volee pour les webmestres elseif (strncmp($fond, "$z_contenu/", strlen($z_contenu) + 1) == 0) { $type = substr($fond, strlen($z_contenu) + 1); if (($type == 'page') and isset($flux['args']['contexte'][$page])) { $type = $flux['args']['contexte'][$page]; } if (!isset($disponible[$type])) { $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder); } if (is_string($disponible[$type])) { $flux['data'] = $disponible[$type]; } elseif ($echafauder and include_spip('inc/autoriser') and isset($GLOBALS['visiteur_session']['statut']) // performance and autoriser('echafauder', $type) and $is = $disponible[$type] and is_array($is) ) { $flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext); } else { $flux['data'] = ($disponible['404'] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, '404', $ext, $echafauder)); } } // sinon, si on demande un fond non trouve dans un des autres blocs // et si il y a bien un contenu correspondant ou echafaudable // se rabbatre sur le dist.html du bloc concerne else { if ($dir = explode('/', $fond) and $dir = reset($dir) and $dir !== $z_contenu and in_array($dir, $z_blocs) ) { $type = substr($fond, strlen("$dir/")); if (($type == 'page') and isset($flux['args']['contexte'][$page])) { $type = $flux['args']['contexte'][$page]; } if ($type !== 'page' and !isset($disponible[$type])) { $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder); } if ($type == 'page' or $disponible[$type]) { $flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext); } } } $squelette = $flux['data']; } // layout specifiques par type et compositions : // body-article.html // body-sommaire.html // pour des raisons de perfo, les declinaisons doivent etre dans le // meme dossier que body.html if ($fond == 'body' and substr($squelette, -strlen($fond)) == $fond) { if (isset($flux['args']['contexte']['type-page']) and ( (isset($flux['args']['contexte']['composition']) and file_exists(($f = $squelette . "-" . $flux['args']['contexte']['type-page'] . "-" . $flux['args']['contexte']['composition']) . ".$ext")) or file_exists(($f = $squelette . "-" . $flux['args']['contexte']['type-page']) . ".$ext") ) ) { $flux['data'] = $f; } } elseif ($fond == 'structure' and z_sanitize_var_zajax() and $f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext") ) { $flux['data'] = substr($f, 0, -strlen(".$ext")); } // chercher le fond correspondant a la composition elseif (isset($flux['args']['contexte']['composition']) and (basename($fond) == 'page' or ($squelette and substr($squelette, -strlen($fond)) == $fond)) and $dir = substr($fond, $prefix_length) and $dir = explode('/', $dir) and $dir = reset($dir) and in_array($dir, $z_blocs) and $f = find_in_path($prefix_path . $prepend . $fond . "-" . $flux['args']['contexte']['composition'] . ".$ext") ) { $flux['data'] = substr($f, 0, -strlen(".$ext")); } } return $flux; } /** * Lister les blocs de la page selon le contexte prive/public * * @param bool $espace_prive * @return array */ function z_blocs($espace_prive = false) { if ($espace_prive) { return (isset($GLOBALS['z_blocs_ecrire']) ? $GLOBALS['z_blocs_ecrire'] : array( 'contenu', 'navigation', 'extra', 'head', 'hierarchie', 'top' )); } return (isset($GLOBALS['z_blocs']) ? $GLOBALS['z_blocs'] : array('contenu')); } /** * Vérifie qu'un type à un contenu disponible, * soit parcequ'il a un fond, soit parce qu'il est echafaudable * * @param string $prefix_path * @param string $z_contenu * @param string $type * @param string $ext * @param bool $echafauder * @return mixed */ function z_contenu_disponible($prefix_path, $z_contenu, $type, $ext, $echafauder = true) { if ($d = z_trouver_bloc($prefix_path, $z_contenu, $type, $ext)) { return $d; } return $echafauder ? z_echafaudable($type) : false; } /** * Teste si le fond de squelette trouvé est autorisé * * Compare le chemin du squelette trouvé avec les chemins exclus connus. * * @param string $squelette * Un chemin de squelette * @return bool * `true` si on peut l'utiliser, `false` sinon. **/ function z_fond_valide($squelette) { if (!_ZCORE_EXCLURE_PATH or !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette) ) { return true; } return false; } /** * Trouve un bloc qui peut être sous le nom * `contenu/article.html` ou `contenu/contenu.article.html` * * @param string $prefix_path * chemin de base qui prefixe la recherche * @param string $bloc * nom du bloc cherche * @param string $fond * nom de la page (ou 'dist' pour le bloc par defaut) * @param string $ext * extension du squelette * @return string */ function z_trouver_bloc($prefix_path, $bloc, $fond, $ext) { if ( (defined('_ZCORE_BLOC_PREFIX_SKEL') and $f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext") and z_fond_valide($f)) or ($f = find_in_path("$prefix_path$bloc/$fond.$ext") and z_fond_valide($f)) ) { return substr($f, 0, -strlen(".$ext")); } return ""; } /** * Tester si un type est echafaudable * c'est à dire s'il correspond bien à un objet en base * * @staticvar array $echafaudable * @param string $type * @return bool */ function z_echafaudable($type) { static $pages = null; static $echafaudable = array(); if (isset($echafaudable[$type])) { return $echafaudable[$type]; } if (preg_match(',[^\w],', $type)) { return $echafaudable[$type] = false; } if (test_espace_prive()) { if (!function_exists('trouver_objet_exec')) { include_spip('inc/pipelines_ecrire'); } if ($e = trouver_objet_exec($type)) { return $echafaudable[$type] = array($e['table'], $e['table_objet_sql'], $e); } else { // peut etre c'est un exec=types qui liste tous les objets "type" if (($t = objet_type($type, false)) !== $type and $e = trouver_objet_exec($t) ) { return $echafaudable[$type] = array($e['table'], $e['table_objet_sql'], $t); } } } else { if (is_null($pages)) { $pages = array(); $liste = lister_tables_objets_sql(); foreach ($liste as $t => $d) { if ($d['page']) { $pages[$d['page']] = array($d['table_objet'], $t); } } } if (!isset($pages[$type])) { return $echafaudable[$type] = false; } if (count($pages[$type]) == 2) { $trouver_table = charger_fonction('trouver_table', 'base'); $pages[$type][] = $trouver_table(reset($pages[$type])); } return $echafaudable[$type] = $pages[$type]; } return $echafaudable[$type] = false; } /** * Generer a la volee un fond a partir d'un contenu connu * tous les squelettes d'echafaudage du prive sont en fait explicites dans prive/echafaudage * on ne fait qu'un mini squelette d'inclusion pour reecrire les variables d'env * * @param string $exec * @param string $table * @param string $table_sql * @param array $desc_exec * @param string $ext * @return string */ function prive_echafauder_dist($exec, $table, $table_sql, $desc_exec, $ext) { $scaffold = ""; // page objet ou objet_edit if (is_array($desc_exec)) { $type = $desc_exec['type']; $primary = $desc_exec['id_table_objet']; if ($desc_exec['edition'] === false) { $fond = "objet"; } else { $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); if (isset($desc['field']['id_rubrique'])) { $fond = 'objet_edit'; } else { $fond = 'objet_edit.sans_rubrique'; } } $dir = z_blocs(test_espace_prive()); $dir = reset($dir); $scaffold = ""; } // page objets elseif ($type = $desc_exec and strpos($type, "/") === false) { $dir = z_blocs(test_espace_prive()); $dir = reset($dir); $scaffold = ""; } // morceau d'objet : on fournit le fond de sibstitution dans $desc_exec // et objet et tire de $table elseif ($fond = $desc_exec) { $dir = md5(dirname($fond)); $scaffold = ""; } $base_dir = sous_repertoire(_DIR_CACHE, "scaffold", false); $base_dir = sous_repertoire($base_dir, $dir, false); $f = $base_dir . "$exec"; ecrire_fichier("$f.$ext", $scaffold); return $f; } /** * Recuperer et verifier var_zajax si demande dans l'url * * @return bool|string */ function z_sanitize_var_zajax() { $z_ajax = _request('var_zajax'); if (!$z_ajax) { return false; } if (!$z_blocs = z_blocs(test_espace_prive()) or !in_array($z_ajax, $z_blocs) ) { set_request('var_zajax'); // enlever cette demande incongrue $z_ajax = false; } return $z_ajax; }