[SPIP] ~2.1.12 -->2.1.25
[velocampus/web/www.git] / www / ecrire / inc / chercher_rubrique.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
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 define('_SPIP_SELECT_RUBRIQUES', 20); /* mettre 100000 pour desactiver ajax */
16
17 //
18 // Selecteur de rubriques pour l'espace prive
19 // En entree :
20 // - l'id_rubrique courante (0 si NEW)
21 // - le type d'objet a placer (une rubrique peut aller a la racine
22 // mais pas dans elle-meme, les articles et sites peuvent aller
23 // n'importe ou (defaut), et les breves dans les secteurs.
24 // $idem : en mode rubrique = la rubrique soi-meme
25 // http://doc.spip.org/@inc_chercher_rubrique_dist
26 function inc_chercher_rubrique_dist ($id_rubrique, $type, $restreint, $idem=0, $do='aff') {
27 $n = sql_countsel('spip_rubriques');
28 if ($n < 1)
29 return '';
30
31 // Mode sans Ajax :
32 // - soit parce que le cookie ajax n'est pas la
33 // - soit parce qu'il y a peu de rubriques
34 if (_SPIP_AJAX < 1
35 OR $type == 'breve'
36 OR $n < _SPIP_SELECT_RUBRIQUES)
37 return selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem);
38
39 else return selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem, $do);
40
41 }
42
43 // compatibilite pour extensions qui utilisaient l'ancien nom
44 $GLOBALS['selecteur_rubrique'] = 'inc_chercher_rubrique_dist';
45
46 // http://doc.spip.org/@style_menu_rubriques
47 function style_menu_rubriques($i) {
48 global $browser_name, $spip_lang_left;
49
50 $espace = '';
51 if (preg_match(",mozilla,i", $browser_name)) {
52 $style = "padding-$spip_lang_left: 16px; "
53 . "margin-$spip_lang_left: ".(($i-1)*16)."px;";
54 } else {
55 $style = '';
56 for ($count = 0; $count <= $i; $count ++)
57 $espace .= "&nbsp;&nbsp;&nbsp;&nbsp;";
58 }
59 if ($i ==1)
60 $espace= "";
61 $class = "niveau_$i";
62 return array($class,$style,$espace);
63 }
64
65 // http://doc.spip.org/@sous_menu_rubriques
66 function sous_menu_rubriques($id_rubrique, $root, $niv, &$data, &$enfants, $exclus, $restreint, $type) {
67 global $browser_name, $browser_version;
68 static $decalage_secteur;
69
70 // Si on a demande l'exclusion ne pas descendre dans la rubrique courante
71 if ($exclus > 0
72 AND $root == $exclus) return '';
73
74 // en fonction du niveau faire un affichage plus ou moins kikoo
75
76 // selected ?
77 $selected = ($root == $id_rubrique) ? ' selected="selected"' : '';
78
79 // le style en fonction de la profondeur
80 list($class, $style, $espace) = style_menu_rubriques($niv);
81
82 // class='selec_rub' sauf pour contourner le bug MSIE / MacOs 9.0
83 if (!($browser_name == "MSIE" AND floor($browser_version) == "5"))
84 $class .= " selec_rub";
85
86 // creer l'<option> pour la rubrique $root
87
88 if (isset($data[$root])) # pas de racine sauf pour les rubriques
89 {
90 $r = "<option$selected value='$root' class='$class' style='$style'>$espace"
91 .$data[$root]
92 .'</option>'."\n";
93 } else $r = '';
94
95 // et le sous-menu pour ses enfants
96 $sous = '';
97 if (isset($enfants[$root]))
98 foreach ($enfants[$root] as $sousrub)
99 $sous .= sous_menu_rubriques($id_rubrique, $sousrub,
100 $niv+1, $data, $enfants, $exclus, $restreint, $type);
101
102 // si l'objet a deplacer est publie, verifier qu'on a acces aux rubriques
103 if ($restreint AND !autoriser('publierdans','rubrique',$root))
104 return $sous;
105
106 // sauter un cran pour les secteurs (sauf premier)
107 if ($niv == 1
108 AND $decalage_secteur++
109 AND $type != 'breve')
110 $r = "<option value='$root'></option>\n".$r;
111
112 // et voila le travail
113 return $r.$sous;
114 }
115
116 // Le selecteur de rubriques en mode classique (menu)
117 // http://doc.spip.org/@selecteur_rubrique_html
118 function selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem=0) {
119 $data = array();
120 if ($type == 'rubrique')
121 $data[0] = _T('info_racine_site');
122 if ($type == 'auteur')
123 $data[0] = '&nbsp;'; # premier choix = neant (rubriques restreintes)
124
125 //
126 // creer une structure contenant toute l'arborescence
127 //
128
129 include_spip('base/abstract_sql');
130 $where = array();
131 if ($type == 'breve')
132 $where[]= ' id_parent=0 ';
133 if (is_array($restreint) AND $restreint)
134 $where[]= sql_in('id_rubrique', $restreint);
135
136 $q = sql_select("id_rubrique, id_parent, titre, statut, lang, langue_choisie", "spip_rubriques", join(' AND ', $where), '', "0+titre,titre");
137 while ($r = sql_fetch($q)) {
138 if (autoriser('voir','rubrique',$r['id_rubrique'])){
139 // titre largeur maxi a 50
140 $titre = couper(supprimer_tags(typo($r['titre']))." ", 50);
141 if ($GLOBALS['meta']['multi_rubriques'] == 'oui'
142 AND ($r['langue_choisie'] == "oui" OR $r['id_parent'] == 0))
143 $titre .= ' ['.traduire_nom_langue($r['lang']).']';
144 $data[$r['id_rubrique']] = $titre;
145 $enfants[$r['id_parent']][] = $r['id_rubrique'];
146 }
147 }
148
149
150 $opt = sous_menu_rubriques($id_rubrique,0, 0,$data,$enfants,$idem, $restreint, $type);
151 $att = " id='id_parent' name='id_parent'\nclass='selecteur_parent verdana1'";
152
153 if (preg_match(',^<option[^<>]*value=.(\d*).[^<>]*>([^<]*)</option>$,',$opt,$r))
154 $r = "<input$att type='hidden' value='" . $r[1] . "' />" . $r[2] ;
155 else
156 $r = "<select$att size='1'>\n$opt</select>\n";
157
158 # message pour neuneus (a supprimer ?)
159 # if ($type != 'auteur' AND $type != 'breve')
160 # $r .= "\n<br />"._T('texte_rappel_selection_champs');
161
162 return $r;
163 }
164
165 // http://doc.spip.org/@selecteur_rubrique_ajax
166 function selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem=0, $do) {
167
168 ## $restreint, si c'est un tableau, limite les rubriques selectionnables
169 ## Pour la version HTML c'est bon (cf. ci-dessus), mais pour l'ajax...
170 ## je laisse ca aux specialistes de l'ajax & des admins restreints
171 ## note : toutefois c'est juste un pb d'interface, car question securite
172 ## la verification est faite a l'arrivee des donnees (Fil)
173
174 if ($id_rubrique) {
175 $titre = sql_fetsel("titre", "spip_rubriques", "id_rubrique=$id_rubrique");
176 $titre = $titre['titre'];
177 } else if ($type == 'auteur')
178 $titre = '&nbsp;';
179 else
180 $titre = _T('info_racine_site');
181
182 $titre = str_replace('&amp;', '&', entites_html(textebrut(typo($titre))));
183 $init = " disabled='disabled' type='text' value=\"" . $titre . "\"\nstyle='width:300px;'";
184
185 $url = generer_url_ecrire('selectionner',"id=$id_rubrique&type=$type&do=$do"
186 . (!$idem ? '' : ("&exclus=$idem&racine=" . ($restreint ? 'non' : 'oui')))
187 . (isset($GLOBALS['var_profile']) ? '&var_profile=1' : ''));
188
189
190 return construire_selecteur($url, '', 'selection_rubrique', 'id_parent', $init, $id_rubrique);
191 }
192
193 // construit un bloc comportant une icone clicable avec image animee a cote
194 // pour charger en Ajax du code a mettre sous cette icone.
195 // Attention: changer le onclick si on change le code Html.
196 // (la fonction JS charger_node ignore l'attribut id qui ne sert en fait pas;
197 // getElement en mode Ajax est trop couteux).
198
199 // http://doc.spip.org/@construire_selecteur
200 function construire_selecteur($url, $js, $idom, $name, $init='', $id=0)
201 {
202 $icone = (strpos($idom, 'auteur')!==false) ? 'message.gif' : 'loupe.png';
203 return
204 "<div class='rubrique_actuelle'><a onclick=\""
205 . $js
206 . "return charger_node_url_si_vide('"
207 . $url
208 . "', this.parentNode.nextSibling, this.nextSibling,'',event)\"><img src='"
209 . chemin_image($icone)
210 . "'\nstyle='vertical-align: middle;' alt='"._T('titre_image_selecteur')."' /></a><img src='"
211 . chemin_image('searching.gif')
212 . "' id='img_"
213 . $idom
214 . "'\nstyle='visibility: hidden;' alt='*' />"
215 . "<input id='titreparent' name='titreparent'"
216 . $init
217 . " />"
218 . "<input type='hidden' id='$name' name='$name' value='"
219 . $id
220 . "' /><div class='nettoyeur'></div></div><div id='"
221 . $idom
222 . "'\nstyle='display: none;'></div>";
223 }
224 ?>