232 lines
6.5 KiB
PHP
232 lines
6.5 KiB
PHP
<?php
|
|
|
|
/***************************************************************************\
|
|
* SPIP, Systeme de publication pour l'internet *
|
|
* *
|
|
* Copyright (c) 2001-2019 *
|
|
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
|
|
* *
|
|
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
|
|
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
|
|
\***************************************************************************/
|
|
|
|
/**
|
|
* Gestion de l'action d'affichage du navigateur de rubrique du bandeau
|
|
*
|
|
* @package SPIP\Core\Rubriques
|
|
**/
|
|
|
|
if (!defined('_ECRIRE_INC_VERSION')) {
|
|
return;
|
|
}
|
|
|
|
include_spip('inc/autoriser');
|
|
include_spip('inc/texte');
|
|
include_spip('inc/filtres');
|
|
|
|
/**
|
|
* Action d'affichage en ajax du navigateur de rubrique du bandeau
|
|
*
|
|
* @uses gen_liste_rubriques()
|
|
* @uses menu_rubriques()
|
|
*
|
|
* @return string
|
|
* Code HTML présentant la liste des rubriques
|
|
**/
|
|
function action_menu_rubriques_dist() {
|
|
|
|
// si pas acces a ecrire, pas acces au menu
|
|
// on renvoi un 401 qui fait echouer la requete ajax silencieusement
|
|
if (!autoriser('ecrire')) {
|
|
$retour = "<ul class='cols_1'><li class='toutsite'><a href='" . generer_url_ecrire('accueil') . "'>" . _T('public:lien_connecter') . "</a></li></ul>";
|
|
include_spip('inc/actions');
|
|
ajax_retour($retour);
|
|
exit;
|
|
}
|
|
|
|
if ($date = intval(_request('date'))) {
|
|
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $date) . " GMT");
|
|
}
|
|
|
|
$r = gen_liste_rubriques();
|
|
if (!$r
|
|
and isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
|
|
and !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
|
|
) {
|
|
include_spip('inc/headers');
|
|
header('Content-Type: text/html; charset=' . $GLOBALS['meta']['charset']);
|
|
http_status(304);
|
|
exit;
|
|
} else {
|
|
include_spip('inc/actions');
|
|
$ret = menu_rubriques();
|
|
ajax_retour($ret);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retourne une liste HTML des rubriques et rubriques enfants
|
|
*
|
|
* @param bool $complet
|
|
* - false pour n'avoir que le bouton racine «plan du site»
|
|
* - true pour avoir l'ensemble des rubriques en plus
|
|
*
|
|
* @return string
|
|
* Code HTML présentant la liste des rubriques
|
|
**/
|
|
function menu_rubriques($complet = true) {
|
|
$ret = "<li class='toutsite'><a href='" . generer_url_ecrire('plan') . "'>" . _T('info_tout_site') . "</a></li>";
|
|
|
|
if (!$complet) {
|
|
return "<ul class='cols_1'>$ret\n</ul>\n";
|
|
}
|
|
|
|
if (!isset($GLOBALS['db_art_cache'])) {
|
|
gen_liste_rubriques();
|
|
}
|
|
$arr_low = extraire_article(0, $GLOBALS['db_art_cache']);
|
|
|
|
$total_lignes = $i = sizeof($arr_low);
|
|
|
|
if ($i > 0) {
|
|
$nb_col = min(8, ceil($total_lignes / 30));
|
|
if ($nb_col <= 1) {
|
|
$nb_col = ceil($total_lignes / 10);
|
|
}
|
|
foreach ($arr_low as $id_rubrique => $titre_rubrique) {
|
|
if (autoriser('voir', 'rubrique', $id_rubrique)) {
|
|
$ret .= bandeau_rubrique($id_rubrique, $titre_rubrique, $i);
|
|
$i++;
|
|
}
|
|
}
|
|
|
|
$ret = "<ul class='cols_$nb_col'>"
|
|
. $ret
|
|
. "\n</ul>\n";
|
|
} else {
|
|
$ret = "<ul class='cols_1'>$ret\n</ul>\n";
|
|
}
|
|
|
|
return $ret;
|
|
}
|
|
|
|
/**
|
|
* Retourne une liste HTML des rubriques enfants d'une rubrique
|
|
*
|
|
* @uses extraire_article()
|
|
*
|
|
* @param int $id_rubrique
|
|
* Identifiant de la rubrique parente
|
|
* @param string $titre_rubrique
|
|
* Titre de cette rubrique
|
|
* @param int $zdecal
|
|
* Décalage vertical, en nombre d'élément
|
|
*
|
|
* @return string
|
|
* Code HTML présentant la liste des rubriques
|
|
**/
|
|
function bandeau_rubrique($id_rubrique, $titre_rubrique, $zdecal) {
|
|
static $zmax = 6;
|
|
|
|
$nav = "<a href='"
|
|
. generer_url_entite($id_rubrique, 'rubrique', '', '', false)
|
|
. "'>"
|
|
. supprimer_tags(preg_replace(',[\x00-\x1f]+,', ' ', $titre_rubrique))
|
|
. "</a>\n";
|
|
|
|
// Limiter volontairement le nombre de sous-menus
|
|
if (!(--$zmax)) {
|
|
$zmax++;
|
|
|
|
return "\n<li>$nav</li>";
|
|
}
|
|
|
|
$arr_rub = extraire_article($id_rubrique, $GLOBALS['db_art_cache']);
|
|
$i = sizeof($arr_rub);
|
|
if (!$i) {
|
|
$zmax++;
|
|
|
|
return "\n<li>$nav</li>";
|
|
}
|
|
|
|
|
|
$nb_col = 1;
|
|
if ($nb_rub = count($arr_rub)) {
|
|
$nb_col = min(10, max(1, ceil($nb_rub / 10)));
|
|
}
|
|
$ret = "<li class='haschild'>$nav<ul class='cols_$nb_col'>";
|
|
foreach ($arr_rub as $id_rub => $titre_rub) {
|
|
if (autoriser('voir', 'rubrique', $id_rub)) {
|
|
$titre = supprimer_numero(typo($titre_rub));
|
|
$ret .= bandeau_rubrique($id_rub, $titre, $zdecal + $i);
|
|
$i++;
|
|
}
|
|
}
|
|
$ret .= "</ul></li>\n";
|
|
$zmax++;
|
|
|
|
return $ret;
|
|
}
|
|
|
|
|
|
/**
|
|
* Obtient la liste des rubriques enfants d'une rubrique, prise dans le cache
|
|
* du navigateur de rubrique
|
|
*
|
|
* @see gen_liste_rubriques() pour le calcul du cache
|
|
*
|
|
* @param int $id_p
|
|
* Identifiant de la rubrique parente des articles
|
|
* @param array $t
|
|
* Cache des rubriques
|
|
* @return array
|
|
* Liste des rubriques enfants de la rubrique (et leur titre)
|
|
**/
|
|
function extraire_article($id_p, $t) {
|
|
return array_key_exists($id_p, $t) ? $t[$id_p] : array();
|
|
}
|
|
|
|
/**
|
|
* Génère le cache de la liste des rubriques pour la navigation du bandeau
|
|
*
|
|
* Le cache, qui comprend pour chaque rubrique ses rubriques enfants et leur titre, est :
|
|
*
|
|
* - réactualisé en fonction de la meta `date_calcul_rubriques`
|
|
* - mis en cache dans le fichier défini par la constante `_CACHE_RUBRIQUES`
|
|
* - stocké également dans la globale `db_art_cache`
|
|
*
|
|
* @return bool true.
|
|
**/
|
|
function gen_liste_rubriques() {
|
|
|
|
include_spip('inc/config');
|
|
// ici, un petit fichier cache ne fait pas de mal
|
|
$last = lire_config('date_calcul_rubriques', 0);
|
|
if (lire_fichier(_CACHE_RUBRIQUES, $cache)) {
|
|
list($date, $GLOBALS['db_art_cache']) = @unserialize($cache);
|
|
if ($date == $last) {
|
|
return false;
|
|
} // c'etait en cache :-)
|
|
}
|
|
// se restreindre aux rubriques utilisees recemment +secteurs
|
|
|
|
$where = sql_in_select("id_rubrique", "id_rubrique", "spip_rubriques", "", "", "id_parent=0 DESC, date DESC",
|
|
_CACHE_RUBRIQUES_MAX);
|
|
|
|
// puis refaire la requete pour avoir l'ordre alphabetique
|
|
|
|
$res = sql_select("id_rubrique, titre, id_parent", "spip_rubriques", $where, '', 'id_parent, 0+titre, titre');
|
|
|
|
// il ne faut pas filtrer le autoriser voir ici
|
|
// car on met le resultat en cache, commun a tout le monde
|
|
$GLOBALS['db_art_cache'] = array();
|
|
while ($r = sql_fetch($res)) {
|
|
$t = sinon($r['titre'], _T('ecrire:info_sans_titre'));
|
|
$GLOBALS['db_art_cache'][$r['id_parent']][$r['id_rubrique']] = supprimer_numero(typo($t));
|
|
}
|
|
|
|
$t = array($last ? $last : time(), $GLOBALS['db_art_cache']);
|
|
ecrire_fichier(_CACHE_RUBRIQUES, serialize($t));
|
|
|
|
return true;
|
|
}
|