3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
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 \***************************************************************************/
13 if (!defined('_ECRIRE_INC_VERSION')) return;
15 define('_SPIP_SELECT_RUBRIQUES', 20); /* mettre 100000 pour desactiver ajax */
18 // Selecteur de rubriques pour l'espace prive
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 if (sql_countsel('spip_rubriques')<1)
31 // - soit parce que le cookie ajax n'est pas la
32 // - soit parce qu'il y a peu de rubriques
35 OR sql_countsel('spip_rubriques') < _SPIP_SELECT_RUBRIQUES
)
36 return selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem);
38 else return selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem, $do);
42 // compatibilite pour extensions qui utilisaient l'ancien nom
43 $GLOBALS['selecteur_rubrique'] = 'inc_chercher_rubrique_dist';
45 // http://doc.spip.org/@style_menu_rubriques
46 function style_menu_rubriques($i) {
47 global $browser_name, $spip_lang_left;
50 if (preg_match(",mozilla,i", $browser_name)) {
51 $style = "padding-$spip_lang_left: 16px; "
52 . "margin-$spip_lang_left: ".(($i-1)*16)."px;";
55 for ($count = 0; $count <= $i; $count ++
)
56 $espace .= " ";
61 return array($class,$style,$espace);
64 // http://doc.spip.org/@sous_menu_rubriques
65 function sous_menu_rubriques($id_rubrique, $root, $niv, &$data, &$enfants, $exclus, $restreint, $type) {
66 static $decalage_secteur;
68 // Si on a demande l'exclusion ne pas descendre dans la rubrique courante
70 AND $root == $exclus) return '';
72 // en fonction du niveau faire un affichage plus ou moins kikoo
75 $selected = ($root == $id_rubrique) ?
' selected="selected"' : '';
77 // le style en fonction de la profondeur
78 list($class, $style, $espace) = style_menu_rubriques($niv);
80 $class .= " selec_rub";
82 // creer l'<option> pour la rubrique $root
84 if (isset($data[$root])) # pas de racine sauf pour les rubriques
86 $r = "<option$selected value='$root' class='$class' style='$style'>$espace"
91 // et le sous-menu pour ses enfants
93 if (isset($enfants[$root]))
94 foreach ($enfants[$root] as $sousrub)
95 $sous .= sous_menu_rubriques($id_rubrique, $sousrub,
96 $niv+
1, $data, $enfants, $exclus, $restreint, $type);
98 // si l'objet a deplacer est publie, verifier qu'on a acces aux rubriques
99 if ($restreint AND $root!=$id_rubrique AND !autoriser('publierdans','rubrique',$root))
102 // et voila le travail
106 // Le selecteur de rubriques en mode classique (menu)
107 // http://doc.spip.org/@selecteur_rubrique_html
108 function selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem=0) {
110 if ($type == 'rubrique' AND autoriser('publierdans','rubrique',0))
111 $data[0] = _T('info_racine_site');
112 # premier choix = neant
113 # si auteur (rubriques restreintes)
114 # ou si creation avec id_rubrique=0
115 elseif ($type == 'auteur' OR !$id_rubrique)
119 // creer une structure contenant toute l'arborescence
122 include_spip('base/abstract_sql');
123 $q = sql_select("id_rubrique, id_parent, titre, statut, lang, langue_choisie", "spip_rubriques", ($type == 'breve' ?
' id_parent=0 ' : ''), '', "0+titre,titre");
124 while ($r = sql_fetch($q)) {
125 if (autoriser('voir','rubrique',$r['id_rubrique'])){
126 // titre largeur maxi a 50
127 $titre = couper(supprimer_tags(typo($r['titre']))." ", 50);
128 if ($GLOBALS['meta']['multi_rubriques'] == 'oui'
129 AND ($r['langue_choisie'] == "oui" OR $r['id_parent'] == 0))
130 $titre .= ' ['.traduire_nom_langue($r['lang']).']';
131 $data[$r['id_rubrique']] = $titre;
132 $enfants[$r['id_parent']][] = $r['id_rubrique'];
133 if ($id_rubrique == $r['id_rubrique']) $id_parent = $r['id_parent'];
137 // si une seule rubrique comme choix possible,
138 // inutile de mettre le selecteur sur un choix vide par defaut
139 // sauf si le selecteur s'adresse a une rubrique puisque on peut la mettre a la racine dans ce cas
142 AND !in_array($type,array('auteur','rubrique'))
147 $opt = sous_menu_rubriques($id_rubrique,0, 0,$data,$enfants,$idem, $restreint, $type);
148 $att = " id='id_parent' name='id_parent'\nclass='selecteur_parent verdana1'";
150 if (preg_match(',^<option[^<>]*value=.(\d*).[^<>]*>([^<]*)</option>$,',$opt,$r))
151 $r = "<input$att type='hidden' value='" . $r[1] . "' />" . $r[2] ;
153 $r = "<select".$att." size='1'>\n$opt</select>\n";
155 # message pour neuneus (a supprimer ?)
156 # if ($type != 'auteur' AND $type != 'breve')
157 # $r .= "\n<br />"._T('texte_rappel_selection_champs');
163 * http://doc.spip.org/@selecteur_rubrique_ajax
165 * $restreint indique qu'il faut limiter les rubriques affichees
166 * aux rubriques editables par l'admin restreint... or, ca ne marche pas.
167 * Pour la version HTML c'est bon (cf. ci-dessus), mais pour l'ajax...
168 * je laisse ca aux specialistes de l'ajax & des admins restreints
169 * note : toutefois c'est juste un pb d'interface, car question securite
170 * la verification est faite a l'arrivee des donnees (Fil)
173 * @param int $id_rubrique
174 * @param string $type
175 * @param bool $restreint
180 function selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem=0, $do) {
183 $titre = sql_fetsel("titre", "spip_rubriques", "id_rubrique=$id_rubrique");
184 $titre = $titre['titre'];
185 } else if ($type == 'auteur')
188 $titre = _T('info_racine_site');
190 $titre = str_replace('&', '&', entites_html(textebrut(typo($titre))));
191 $init = " disabled='disabled' type='text' value=\"" . $titre . "\"\nstyle='width:300px;'";
193 $url = generer_url_ecrire('selectionner',"id=$id_rubrique&type=$type&do=$do"
194 . (!$idem ?
'' : "&exclus=$idem")
195 . ($restreint ?
"" : "&racine=oui")
196 . (isset($GLOBALS['var_profile']) ?
'&var_profile=1' : ''));
199 return construire_selecteur($url, '', 'selection_rubrique', 'id_parent', $init, $id_rubrique);
202 // construit un bloc comportant une icone clicable avec image animee a cote
203 // pour charger en Ajax du code a mettre sous cette icone.
204 // Attention: changer le onclick si on change le code Html.
205 // (la fonction JS charger_node ignore l'attribut id qui ne sert en fait pas;
206 // getElement en mode Ajax est trop couteux).
208 // http://doc.spip.org/@construire_selecteur
209 function construire_selecteur($url, $js, $idom, $name, $init='', $id=0)
211 $icone = (strpos($idom, 'auteur')!==false) ?
'auteur-24.png' : 'rechercher-20.png';
213 "<div class='rubrique_actuelle'><a onclick=\""
215 . "return charger_node_url_si_vide('"
217 . "', this.parentNode.nextSibling, this.nextSibling,'',event)\"><img src='"
218 . chemin_image($icone)
219 . "'\nstyle='vertical-align: middle;' alt='"._T('titre_image_selecteur')."' /></a><img src='"
220 . chemin_image('searching.gif')
223 . "'\nstyle='visibility: hidden;' alt='*' />"
224 . "<input id='titreparent' name='titreparent'"
227 . "<input type='hidden' id='$name' name='$name' value='"
229 . "' /><div class='nettoyeur'></div></div><div id='"
231 . "'\nstyle='display: none;'></div>";