[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / action / menu_rubriques.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 include_spip('inc/autoriser');
16 include_spip('inc/texte');
17 include_spip('inc/filtres');
18
19 function action_menu_rubriques_dist() {
20
21 // si pas acces a ecrire, pas acces au menu
22 // on renvoi un 401 qui fait echouer la requete ajax silencieusement
23 if (!autoriser('ecrire')){
24 $retour = "<ul class='cols_1'><li class='toutsite'><a href='".generer_url_ecrire('accueil')."'>"._T('public:lien_connecter')."</a></li></ul>";
25 include_spip('inc/actions');
26 ajax_retour($retour);
27 exit;
28 }
29
30 if ($date = intval(_request('date')))
31 header("Last-Modified: ".gmdate("D, d M Y H:i:s", $date)." GMT");
32
33 $r = gen_liste_rubriques();
34 if (!$r
35 AND isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
36 AND !strstr($_SERVER['SERVER_SOFTWARE'],'IIS/')) {
37 include_spip('inc/headers');
38 header('Content-Type: text/html; charset='. $GLOBALS['meta']['charset']);
39 http_status(304);
40 exit;
41 } else {
42 include_spip('inc/actions');
43 $ret = menu_rubriques();
44 ajax_retour($ret);
45 }
46 }
47
48 function menu_rubriques($complet = true){
49 $ret = "<li class='toutsite'><a href='".generer_url_ecrire('plan')."'>"._T('info_tout_site')."</a></li>";
50
51 if (!$complet) {
52 return "<ul class='cols_1'>$ret\n</ul>\n";
53 }
54
55 if (!isset($GLOBALS['db_art_cache'])){
56 gen_liste_rubriques();
57 }
58 $arr_low = extraire_article(0, $GLOBALS['db_art_cache']);
59
60 $total_lignes = $i = sizeof($arr_low);
61
62 if ($i > 0) {
63 $nb_col = min(8,ceil($total_lignes / 30));
64 if ($nb_col <= 1) $nb_col = ceil($total_lignes / 10);
65 foreach( $arr_low as $id_rubrique => $titre_rubrique) {
66 if (autoriser('voir','rubrique',$id_rubrique)){
67 $ret .= bandeau_rubrique($id_rubrique, $titre_rubrique, $i);
68 $i++;
69 }
70 }
71
72 $ret = "<ul class='cols_$nb_col'>"
73 . $ret
74 . "\n</ul>\n";
75 }
76 else
77 $ret = "<ul class='cols_1'>$ret\n</ul>\n";
78
79 return $ret;
80 }
81
82 // http://doc.spip.org/@bandeau_rubrique
83 function bandeau_rubrique($id_rubrique, $titre_rubrique, $zdecal) {
84 static $zmax = 6;
85
86 $nav = "<a href='"
87 . generer_url_entite($id_rubrique,'rubrique','','',false)
88 . "'>"
89 . supprimer_tags(preg_replace(',[\x00-\x1f]+,', ' ', $titre_rubrique))
90 . "</a>\n";
91
92 // Limiter volontairement le nombre de sous-menus
93 if (!(--$zmax)) {
94 $zmax++;
95 return "\n<li>$nav</li>";
96 }
97
98 $arr_rub = extraire_article($id_rubrique, $GLOBALS['db_art_cache']);
99 $i = sizeof($arr_rub);
100 if (!$i) {
101 $zmax++;
102 return "\n<li>$nav</li>";
103 }
104
105
106 $nb_col = 1;
107 if ($nb_rub = count($arr_rub)) {
108 $nb_col = min(10,max(1,ceil($nb_rub / 10)));
109 }
110 $ret = "<li class='haschild'>$nav<ul class='cols_$nb_col'>";
111 foreach( $arr_rub as $id_rub => $titre_rub) {
112 if (autoriser('voir','rubrique',$id_rub)){
113 $titre = supprimer_numero(typo($titre_rub));
114 $ret .= bandeau_rubrique($id_rub, $titre, $zdecal+$i);
115 $i++;
116 }
117 }
118 $ret .= "</ul></li>\n";
119 $zmax++;
120 return $ret;
121 }
122
123
124 // http://doc.spip.org/@extraire_article
125 function extraire_article($id_p, $t) {
126 return array_key_exists($id_p, $t) ? $t[$id_p]: array();
127 }
128
129 // http://doc.spip.org/@gen_liste_rubriques
130 function gen_liste_rubriques() {
131
132 include_spip('inc/config');
133 // ici, un petit fichier cache ne fait pas de mal
134 $last = lire_config('date_calcul_rubriques', 0);
135 if (lire_fichier(_CACHE_RUBRIQUES, $cache)) {
136 list($date,$GLOBALS['db_art_cache']) = @unserialize($cache);
137 if ($date == $last) return false; // c'etait en cache :-)
138 }
139 // se restreindre aux rubriques utilisees recemment +secteurs
140
141 $where = sql_in_select("id_rubrique", "id_rubrique", "spip_rubriques", "", "", "id_parent=0 DESC, date DESC", _CACHE_RUBRIQUES_MAX);
142
143 // puis refaire la requete pour avoir l'ordre alphabetique
144
145 $res = sql_select("id_rubrique, titre, id_parent", "spip_rubriques", $where, '', 'id_parent, 0+titre, titre');
146
147 // il ne faut pas filtrer le autoriser voir ici
148 // car on met le resultat en cache, commun a tout le monde
149 $GLOBALS['db_art_cache'] = array();
150 while ($r = sql_fetch($res)) {
151 $t = sinon($r['titre'], _T('ecrire:info_sans_titre'));
152 $GLOBALS['db_art_cache'][$r['id_parent']][$r['id_rubrique']] = supprimer_numero(typo($t));
153 }
154
155 $t = array($last ? $last : time(), $GLOBALS['db_art_cache']);
156 ecrire_fichier(_CACHE_RUBRIQUES, serialize($t));
157 return true;
158 }
159 ?>