source: spip-zone/_plugins_/acs/inc/acs_editer_admins.php @ 41711

Last change on this file since 41711 was 41711, checked in by webmaster@…, 11 years ago

remise a niveau des selecteurs d'admins

File size: 15.9 KB
Line 
1<?php
2#              ACS
3#          (Plugin Spip)
4#     http://acs.geomaticien.org
5#
6# Copyright Daniel FAIVRE, 2007-2008
7# Copyleft: licence GPL - Cf. LICENCES.txt
8
9// from spip 1.9.2.c, 1.9.2d
10
11if (!defined("_ECRIRE_INC_VERSION")) return;
12
13include_spip('inc/presentation');
14include_spip('inc/actions');
15include_spip('inc/acs_groups');
16
17// L'ajout d'un admin se fait par mini-navigateur dans la fourchette:
18define('_SPIP_SELECT_MIN_ADMINS', 10); // en dessous: balise Select
19define('_SPIP_SELECT_MAX_ADMINS', 100); // au-dessus: saisie + return
20
21if (!is_callable('sql_count')) { // spip < 1.9.3
22  function sql_count($res) {
23    return spip_num_rows($res);
24  }
25}
26if (!is_callable('sql_fetch')) { // spip < 1.9.3
27  function sql_fetch($res) {
28    return spip_fetch_array($res);
29  }
30}
31
32function acs_ajax_action_greffe($div, $id, $res) {
33  global $spip_version_code;
34
35  if($spip_version_code >= 1.93)
36    return ajax_action_greffe("acs_editer_admins", $id, $res);
37  else
38    return ajax_action_greffe("acs_editer_admins-$id", $res);
39}
40
41function acs_bloc_depliable($flag, $id, $contenu) {
42  if (is_callable('debut_block_depliable')) {
43    return debut_block_depliable($flag, $id).$contenu.fin_block();
44  }
45  else { // spip < 1.9.3
46    return ($flag === 'ajax' ? debut_block_visible("admins$type$id") : debut_block_invisible("admins$type$id")).
47    $contenu.
48    fin_block();
49  }
50}
51function acs_bouton_bloc_depliable($titre_boite, $flag, $id) {
52  if (is_callable('bouton_block_depliable')) {
53    $r = bouton_block_depliable($titre_boite, $flag ?($flag === 'ajax'):1, $id);
54  }
55  else { // spip < 1.9.3
56    $r = (!$flag
57       ? ''
58       : (($flag === 'ajax')
59      ? bouton_block_visible("admins$type$id")
60      : bouton_block_invisible("admins$type$id")))
61  . $titre_boite;
62  }
63  return '<div style="text-align:'.$GLOBALS['spip_lang_left'].'">'.$r.'</div>';
64}
65
66
67
68// doc: acs_editer_admins($type, $id, $flag_editable, $cherche_auteur, $ids, $titre_boite = NULL, $script_edit_objet = NULL)
69// (ça ressemble à http://doc.spip.org/@inc_editer_auteurs_dist)
70// $id est l'id de l'objet à éditer. pour ACS, c'est sans importance puisque l'objet est ACS lui-même
71// Cette usine à gaz spip-ajax sert seulement à affecter à ACS_ADMINS la liste des admins ACS autorisés ...
72function inc_acs_editer_admins($type, $id, $flag, $cherche_auteur, $ids, $titre_boite = NULL, $script_edit_objet = NULL,  $icon="auteur-24.gif") {
73        global $options;
74
75  acs_log("inc_acs_editer_admins($type, $id, $flag, $cherche_auteur, $ids, $titre_boite, $script_edit_objet)");
76
77        $arg_ajax = "&id_{$type}=$id";
78        if ($script_edit_objet===NULL) $script_edit_objet = $type.'s';
79        if ($titre_boite===NULL)
80                $titre_boite = _T('texte_auteurs'). aide("artauteurs");
81        else
82                $arg_ajax.= "&titre=".urlencode($titre_boite);
83        $aff_les_admins = afficher_admins_objet($type, $id, $flag, "", $script_edit_objet, $arg_ajax);
84
85        //if ($flag AND $options == 'avancees') {
86                $futurs = ajouter_admins_objet($type, $id, "",$script_edit_objet, $arg_ajax);
87        //} else $futurs = '';
88
89        return editer_admins_objet($type, $id, $flag, $cherche_auteur, $ids, $aff_les_admins, $futurs, $titre_boite,$script_edit_objet, $arg_ajax, $icon, $extras);
90}
91
92// http://doc.spip.org/@editer_admins_objet
93function editer_admins_objet($type, $id, $flag, $cherche_auteur, $ids, $les_auteurs, $futurs, $titre_boite, $script_edit_objet, $arg_ajax, $icon)
94{
95        global $spip_lang_left, $spip_lang_right, $options;
96
97  acs_log("inc_acs_editer_admins_objet($type, $id, $flag, cherche_auteur, $ids, les_auteurs, futurs, $titre_boite, $script_edit_objet, $arg_ajax)");
98
99//
100// Ajouter un admin
101
102        if ($flag)
103                $res = $futurs;
104        else
105                $res = '';
106
107  $bouton = acs_bouton_bloc_depliable($titre_boite, $flag, "admins$type$id");
108  if ($id > 0){
109    $formpages = '<form name="acs_pages_'.$id.'" action="?exec=acs" method="post"><input type="hidden" name="onglet" value="adm"><input type="hidden" name="changer_pages" value="oui"><input type="hidden" name="group" value="'.$id.'"><table style="width:100%;" cellpadding="2px"><tr style="vertical-align: top;"><td style="width: 20%; text-align:'.$GLOBALS['spip_lang_right'].'">'._T('acs:locked_pages').' : </td><td style="width:75%"> <input name="pages" type="text" class="formc" value="'.acs_pages($id).'" style="width:100%" /> </td><td style="text-align:'.$GLOBALS['spip_lang_right'].'"> <input type="submit"  name="'._T('bouton_valider').
110        '" value="'._T('bouton_valider').'" class="fondo"> </td></tr></table></form>';
111  }
112  else
113    $formpages = _T('acs:locked_pages').' : '.implode(', ', $GLOBALS['ACS_ENFER']);
114  $formpages = '<div>'.$formpages.'</div>';
115        $res = '<div style="text-align:'.$GLOBALS['spip_lang_left'].'"><div>&nbsp;</div>' // pour placer le gif patienteur
116        . debut_cadre_enfonce($icon, true, "", $bouton)
117        . $les_auteurs
118  . acs_bloc_depliable(($flag === 'ajax'), "admins$type$id", $formpages.$res)
119        . fin_cadre_enfonce(true)
120. '</div>';
121        return acs_ajax_action_greffe("acs_editer_admins", $id, $res);
122}
123
124// http://doc.spip.org/@determiner_admins_objet
125function determiner_admins_objet($type, $id, $cond='', $limit='')
126{
127        $les_auteurs = array();
128        if (!preg_match(',^[a-z]*$,',$type)) return $les_auteurs;
129
130  if ($id == 0) {
131    // Add author 1 as default ACS admin
132    if (!isset($GLOBALS['meta']['ACS_ADMINS']) || !$GLOBALS['meta']['ACS_ADMINS']) {
133      ecrire_meta('ACS_ADMINS', '1');
134      ecrire_metas();
135    }
136    $ids = $GLOBALS['meta']['ACS_ADMINS'];
137  }
138  else {
139    $ids = implode(',',acs_members(acs_grid($id)));
140  }
141
142        if ($ids) $result = spip_query("SELECT id_auteur FROM spip_auteurs WHERE id_auteur IN ($ids) and statut='0minirezo'"
143        . ($cond ? " AND $cond" : '')
144        . ($limit? " LIMIT $limit": '')
145        );
146
147        return $result;
148}
149// http://doc.spip.org/@determiner_non_auteurs
150function determiner_non_admins($type, $id, $cond_les_auteurs, $order)
151{
152        $cond = '';
153        $res = determiner_admins_objet($type, $id, $cond_les_auteurs);
154        if (sql_count($res)<200){ // probleme de performance au dela, on ne filtre plus
155                while ($row = sql_fetch($res))
156                        $cond .= ",".$row['id_auteur'];
157        }
158        if (strlen($cond))
159                $cond = "id_auteur NOT IN (" . substr($cond,1) . ') AND ';
160        return spip_query("SELECT id_auteur, nom, email, statut FROM spip_auteurs WHERE $cond statut='0minirezo'");
161}
162
163// http://doc.spip.org/@afficher_admins_objet
164function afficher_admins_objet($type, $id, $flag_editable, $cond_les_auteurs, $script_edit, $arg_ajax)
165{
166        global $connect_statut, $options,$connect_id_auteur, $spip_display;
167
168  acs_log("inc/acs_editer_admins: afficher_admins_objet(type=$type, id=$id, flag_editable=$flag_editable, cond_les_auteurs=$cond_les_auteurs, script_edit=$script_edit, arg_ajax=$arg_ajax)");
169
170        $les_auteurs = array();
171        if (!preg_match(',^[a-z]*$,',$type)) return $les_auteurs;
172
173        $result = determiner_admins_objet($type,$id,$cond_les_auteurs);
174        $cpt = sql_count($result);
175
176  if (!defined('_TRANCHES'))
177    define('_TRANCHES', 10); // Compat 2.0
178   
179        $tmp_var = "acs_editer_admins-$id";
180        $nb_aff = floor(1.5 * _TRANCHES);
181        if ($cpt > $nb_aff) {
182                $nb_aff = _TRANCHES;
183                $tranches = afficher_tranches_requete($cpt, $tmp_var, generer_url_ecrire('acs_editer_admins',$arg_ajax), $nb_aff);
184        } else $tranches = '';
185
186        $deb_aff = _request($tmp_var);
187        $deb_aff = ($deb_aff !== NULL ? intval($deb_aff) : 0);
188
189        $limit = (($deb_aff < 0) ? '' : "$deb_aff, $nb_aff");
190        $result = determiner_admins_objet($type,$id,$cond_les_auteurs,$limit);
191
192        // charger ici meme si ps d'auteurs
193        // car inc_formater_auteur peut aussi redefinir determiner_non_auteurs qui sert plus loin
194        if (!$formater_auteur = charger_fonction("formater_auteur_$type", 'inc',true))
195                $formater_auteur = charger_fonction('formater_auteur', 'inc');
196
197        if (!sql_count($result)) return '';
198
199        $table = array();
200
201        while ($row = sql_fetch($result)) {
202                $id_auteur = $row['id_auteur'];
203                $vals = $formater_auteur($id_auteur);
204
205    $gr = ($id == 0) ? _T('acs:acs') : acs_grid($id);
206                if ($flag_editable AND ($connect_id_auteur != $id_auteur OR $connect_statut == '0minirezo')) {
207                        $vals[] =  ajax_action_auteur('acs_editer_admins', "$id,$type,-$id_auteur", $script_edit, "id_{$type}=$id", ((($id_auteur != 1) || ($id > 0)) ? array(_T('acs:lien_retirer_admin')."&nbsp;".$gr."&nbsp;".http_img_pack('croix-rouge.gif', "X", " class='puce' style='vertical-align: bottom;'")): array() ),$arg_ajax);
208                } else  $vals[] = "";
209                $table[] = $vals;
210        }
211
212        $largeurs = array('14', '', '', '', '', '');
213        $styles = array('arial11', 'arial2', 'arial11', 'arial11', 'arial11', 'arial1');
214
215        $t = afficher_liste($largeurs, $table, $styles);
216        if ($spip_display != 4)
217          $t = $tranches
218                . "<table width='100%' cellpadding='3' cellspacing='0' border='0'>"
219            . $t
220            . "</table>";
221        return "<div class='liste'>$t</div>\n";
222}
223
224
225// http://doc.spip.org/@ajouter_auteurs_objet
226function ajouter_admins_objet($type, $id, $cond_les_auteurs,$script_edit, $arg_ajax)
227{
228        if (!$determiner_non_admins = charger_fonction('determiner_non_admins'.$type,'inc',true))
229                $determiner_non_admins = 'determiner_non_admins';
230        $query = $determiner_non_admins($type, $id, $cond_les_auteurs, "statut, nom");
231
232        if (!$num = sql_count($query)) return '';
233
234        $js = "findObj_forcer('valider_ajouter_admin_$id').style.visibility='visible';";
235
236        $text = "<span class='verdana1'><b>"
237        . _T('titre_cadre_ajouter_auteur')
238        . "</b></span>\n"; // spip translation : less to do ;-)
239
240  $sel = '';
241        if ($num <= _SPIP_SELECT_MIN_ADMINS){
242                $sel .= "$text<select name='nouv_admin_$id' size='1' style='width:150px;' class='fondl' onchange=\"$js\">" .
243                   objet_admin_select($query) .
244                   "</select>";
245                $clic = _T('bouton_ajouter');
246        } else if  ((_SPIP_AJAX < 1) OR ($num >= _SPIP_SELECT_MAX_ADMINS)) {
247      $sel .= "$text <input type='text' name='cherche_admin' onclick=\"$js\" class='fondl' value='' size='20' />";
248                  $clic = _T('bouton_chercher');
249        } else {
250            $sel .= selecteur_admin_ajax($type, $id, $js, $text);
251            $clic = _T('bouton_ajouter');
252        }
253
254        return ajax_action_post('acs_editer_admins', "$id,$type", $script_edit, "id_{$type}=$id", $sel, $clic, 'class="fondo visible_au_chargement" id="valider_ajouter_admin_'.$id.'" style="float:right"', "", $arg_ajax);
255}
256
257if (!is_callable('afficher_tranches_requete')) {
258  // http://doc.spip.org/@afficher_tranches_requete from Spip 1.9.2d (Deleted from 2.0)
259  function afficher_tranches_requete($num_rows, $tmp_var, $url='', $nb_aff = 10, $old_arg=NULL) {
260    static $ancre = 0;
261    global $browser_name, $spip_lang_right, $spip_display;
262    if ($old_arg!==NULL){ // eviter de casser la compat des vieux appels $cols_span ayant disparu ...
263      $tmp_var = $url;    $url = $nb_aff; $nb_aff=$old_arg;
264    }
265 
266    $deb_aff = intval(_request($tmp_var));
267    $ancre++;
268    $self = self();
269    $ie_style = ($browser_name == "MSIE") ? "height:1%" : '';
270 
271    $texte = "\n<div style='position: relative;$ie_style; background-color: #dddddd; border-bottom: 1px solid #444444; padding: 2px;' class='arial1' id='a$ancre'>";
272    $on ='';
273 
274    for ($i = 0; $i < $num_rows; $i += $nb_aff){
275      $deb = $i + 1;
276      $fin = $i + $nb_aff;
277      if ($fin > $num_rows) $fin = $num_rows;
278      if ($deb > 1) $texte .= " |\n";
279      if ($deb_aff + 1 >= $deb AND $deb_aff + 1 <= $fin) {
280        $texte .= "<b>$deb</b>";
281      }
282      else {
283        $script = parametre_url($self, $tmp_var, $deb-1);
284        if ($url) {
285          $on = "\nonclick=\"return charger_id_url('"
286          . $url
287          . "&amp;"
288          . $tmp_var
289          . '='
290          . ($deb-1)
291          . "','"
292          . $tmp_var
293          . '\');"';
294        }
295        $texte .= "<a href=\"$script#a$ancre\"$on>$deb</a>";
296      }
297    }
298 
299    $style = " class='arial2' style='border-bottom: 1px solid #444444; position: absolute; top: 1px; $spip_lang_right: 15px;'";
300 
301    $script = parametre_url($self, $tmp_var, -1);
302    if ($url) {
303          $on = "\nonclick=\"return charger_id_url('"
304          . $url
305          . "&amp;"
306          . $tmp_var
307          . "=-1','"
308          . $tmp_var
309          . '\');"';
310    }
311    $l = htmlentities(_T('lien_tout_afficher'));
312    $texte .= "<a$style\nhref=\"$script#a$ancre\"$on><img\nsrc='". _DIR_IMG_PACK . "plus.gif' title=\"$l\" alt=\"$l\" /></a>";
313 
314 
315    $texte .= "</div>\n";
316 
317    return $texte;
318  }
319  // http://doc.spip.org/@afficher_liste
320  function afficher_liste($largeurs, $table, $styles = '') {
321    global $spip_display;
322 
323    if (!is_array($table)) return "";
324 
325    if ($spip_display != 4) {
326      $res = '';
327      foreach ($table as $t) {
328        $res .= afficher_liste_display_neq4($largeurs, $t, $styles);
329      }
330    } else {
331      $res = "\n<ul style='text-align: $spip_lang_left; background-color: white;'>";
332      foreach ($table as $t) {
333        $res .= afficher_liste_display_eq4($largeurs, $t, $styles);
334      }
335      $res .= "\n</ul>";
336    }
337 
338    return $res;
339  }
340 
341  // http://doc.spip.org/@afficher_liste_display_neq4
342  function afficher_liste_display_neq4($largeurs, $t, $styles = '') {
343    global $spip_lang_left,$browser_name;
344    if (!is_array($t) or !count($t)) return "";
345 
346    $evt = (preg_match(",msie,i", $browser_name) ? " onmouseover=\"changeclass(this,'tr_liste_over');\" onmouseout=\"changeclass(this,'tr_liste');\"" :'');
347 
348    reset($largeurs);
349    if ($styles) reset($styles);
350    $res ='';
351    while (list(, $texte) = each($t)) {
352      $style = $largeur = "";
353      list(, $largeur) = each($largeurs);
354      if ($styles) list(, $style) = each($styles);
355      if (!trim($texte)) $texte .= "&nbsp;";
356      $res .= "\n<td" .
357        ($largeur ? (" style='width: $largeur" ."px;'") : '') .
358        ($style ? " class=\"$style\"" : '') .
359        ">" . lignes_longues($texte) . "\n</td>";
360    }
361 
362    return "\n<tr class='tr_liste'$evt>$res</tr>";
363  }
364 
365  // http://doc.spip.org/@afficher_liste_display_eq4
366  function afficher_liste_display_eq4($largeurs, $t, $styles = '') {
367    global $spip_lang_left;
368    if (!is_array($t) or !count($t)) return "";
369 
370    $res = "\n<li>";
371    reset($largeurs);
372    if ($styles) reset($styles);
373    while (list(, $texte) = each($t)) {
374      $style = $largeur = "";
375      list(, $largeur) = each($largeurs);
376      if (!$largeur) $res .= $texte." ";
377    }
378    $res .= "</li>\n";
379    return $res;
380  }
381}
382// http://doc.spip.org/@objet_auteur_select
383function objet_admin_select($result)
384{
385        global $couleur_claire, $connect_statut ;
386
387        $statut_old = $premiere_old = $res = '';
388
389        while ($row = spip_fetch_array($result)) {
390                $id_auteur = $row["id_auteur"];
391                $nom = $row["nom"];
392                $email = $row["email"];
393                $statut = $row["statut"];
394
395                $statut=str_replace("0minirezo", _T('info_administrateurs'), $statut);
396                $statut=str_replace("1comite", _T('info_redacteurs'), $statut);
397                $statut=str_replace("6visiteur", _T('info_visiteurs'), $statut);
398
399                $premiere = strtoupper(substr(trim($nom), 0, 1));
400
401                if ($connect_statut != '0minirezo')
402                        if ($p = strpos($email, '@'))
403                                  $email = substr($email, 0, $p).'@...';
404                if ($email)
405                        $email = " ($email)";
406
407                if ($statut != $statut_old) {
408                        $res .= "\n<option value=\"x\" />";
409                        $res .= "\n<option value=\"x\" style='background-color: $couleur_claire;'> $statut</option>";
410                }
411
412                if ($premiere != $premiere_old AND ($statut != _T('info_administrateurs') OR !$premiere_old))
413                        $res .= "\n<option value=\"x\" />";
414
415                $res .= "\n<option value=\"$id_auteur\">&nbsp;&nbsp;&nbsp;&nbsp;" . supprimer_tags(couper(typo("$nom$email"), 40)) . '</option>';
416                $statut_old = $statut;
417                $premiere_old = $premiere;
418        }
419
420        return $res;
421}
422
423// http://doc.spip.org/@selecteur_auteur_ajax
424function selecteur_admin_ajax($type, $id, $js, $text)
425{
426  include_spip('inc/chercher_rubrique');
427  $url = generer_url_ecrire('acs_selectionner_admin', "admid=$id");
428  acs_log("inc/acs_editer_admins selecteur_admin_ajax($type, $id, $js, $text)");
429 
430  // doc spip: construire_selecteur($url, $js, $idom, $name, $init='', $id=0)
431  // construit un bloc comportant une icone clicable avec image animee a cote
432  // pour charger en Ajax du code a mettre sous cette icone.
433  // Attention: changer le onclick si on change le code Html.
434  // (la fonction JS charger_node ignore l'attribut id qui ne sert en fait pas;
435  // getElement en mode Ajax est trop couteux).
436  return $text . construire_selecteur($url, $js, 'selection_admin_'.$id, 'nouv_admin_'.$id, ' type="hidden"', $id);
437}
438
439?>
Note: See TracBrowser for help on using the repository browser.