source: spip-zone/_plugins_/_amelioration_admin_/mots_partout/exec/mots_partout.php @ 4558

Last change on this file since 4558 was 4558, checked in by bill@…, 13 years ago

tout baser sur la definition des choses possibles

File size: 16.5 KB
Line 
1<?php 
2
3
4//        exec/mots_partout.php
5//    Fichier créé pour SPIP avec un bout de code emprunté à celui ci.
6//    Distribué sans garantie sous licence GPL./
7//    Copyright (C) 2006  Pierre ANDREWS
8//
9//    This program is free software; you can redistribute it and/or modify
10//    it under the terms of the GNU General Public License as published by
11//    the Free Software Foundation; either version 2 of the License, or any later version.
12//
13//    This program is distributed in the hope that it will be useful,
14//    but WITHOUT ANY WARRANTY; without even the implied warranty of
15//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16//    GNU General Public License for more details.
17//
18//    You should have received a copy of the GNU General Public License
19//    along with this program; if not, write to the Free Software
20//    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21
22
23$p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(dirname(__FILE__)))));
24define('_DIR_PLUGIN_MOTS_PARTOUT',(_DIR_PLUGINS.end($p)));
25
26/***********************************************************************/
27/* function*/
28/***********************************************************************/
29
30
31function verifier_admin() {
32  global $connect_statut, $connect_toutes_rubriques;
33  return (($connect_statut == '0minirezo') AND $connect_toutes_rubriques);
34}
35
36function verifier_auteur($table, $id_objet, $id) {
37  global $connect_id_auteur;
38  $select = array('id_auteur');
39 
40  $from =  array($table);
41 
42  $where = array("id_auteur = $connect_id_auteur", "$id_objet = $id");
43 
44  $result = spip_abstract_select($select,$from,$where);
45 
46  if (spip_abstract_count($result) > 0) {
47        spip_abstract_free($result);
48        return true;
49  }
50  spip_abstract_free($result);
51  return false;
52}
53
54
55//on calcul le style pour ce mot. I.E. on regarde si il est attache à tout ou seulement une partie
56function calcul_numeros($array, $search, $total) {
57  if(is_array($array))
58        $tt = count(array_keys($array,$search));
59  else
60        return 0;
61
62  if($tt == 0) return 0;
63  if($tt < $total) return 1;
64  return 2;
65}
66
67//liste des mots a droite
68function md_afficher_liste($largeurs, $table, $styles = '') {
69  global $couleur_claire;
70  global $browser_name;
71  global $spip_display;
72  global $spip_lang_left;
73
74  if (!is_array($table)) return;
75  reset($table);
76  echo "\n";
77  while (list(,$t) = each($table)) {
78        if (eregi("msie", $browser_name)) $msover = " onMouseOver=\"changeclass(this,'tr_liste_over');\" onMouseOut=\"changeclass(this,'tr_liste');\"";
79        reset($largeurs);
80        if ($styles) reset($styles);
81        list($texte, $sel) = each($t);
82        $style = $largeur = "";
83        list(, $largeur) = each($largeurs);
84        if ($styles) list(,$style) = each($styles);
85        if (!trim($texte)) $texte .= "&nbsp;";
86        echo "<ul class='".$style[$sel]."'$msover>";
87        echo "<li";
88        if ($style)  echo ' class="'.$style[$sel].'"';
89        echo ">$texte</li>";
90       
91        while (list($texte, $sel) = each($t)) {
92          $style = $largeur = "";
93          if ($styles) list(,$style) = each($styles);
94          if (!trim($texte)) $texte .= "&nbsp;";
95          echo "<li";
96          if ($largeur) echo " width=\"$largeur\"";
97          if ($style)  echo ' class="'.$style[$sel].'"';
98          echo ">$texte</li>";
99        }
100        echo "</ul>\n";
101        echo "\n";
102  }
103}
104
105function find_tables($nom, $tables) {
106  $toret = array();
107  foreach($tables as $t => $dec) {
108        if(ereg($nom,$t)) {
109          $toret[] = $t;
110        }
111  }
112  return $toret;
113}
114
115//genere la liste de IN a partir d'un tableau
116function calcul_in($mots) {
117  for($i=0; $i < count($mots); $i++) {
118        if($i > 0) $to_ret .= ',';
119        $to_ret .= $mots[$i];
120  }
121  return $to_ret;
122}
123
124//force a un tableau de int
125function secureIntArray($array) {
126  $to_return = Array();
127  if(is_array($array)) {
128        foreach($array as $id) {
129          $to_return[] = intval($id);
130        }
131  }
132  return $to_return;
133}
134
135// transfert la variable POST d'un tableau (19 => 'avec', 20=>'voir') en 4 tableaux avec=(19) voir=(20)
136function splitArrayIds($array) {
137  $voir = Array();
138  $cacher = Array();
139  $ajouter = Array();
140  $enlever = Array();
141  if(is_array($array)) {
142    foreach($array as $id_mot => $action) {
143      $id_mot = intval($id_mot);
144      if($id_mot > 0) {
145        switch(addslashes($action)) {
146                  case 'avec':
147                        $ajouter[] = $id_mot;
148                  case 'voir':
149                        $voir[] = $id_mot;
150                        break;
151                  case 'sans':
152                        $enlever[] = $id_mot;
153                        break;
154                  case 'cacher':
155                        $cacher[] = $id_mot;
156            break;
157
158        }
159      }
160    }
161  }
162  return array($voir, $cacher, $ajouter, $enlever);
163}
164
165//====================l'affichage par defaut======================================
166
167function afficher_liste_defaut($choses) {
168  echo '<table>';
169  $i = 0;
170  foreach($choses as $id_chose) {
171        $i++;
172        echo "<td><tr><input type='checkbox' name='choses[]' value='$id_chose' id='id_chose$i'/></tr><tr> <label for='id_chose$i'>$id_chose</label></tr></td>";
173  }
174  echo '</table>';
175}
176
177//------------------------la fonction qui fait tout-----------------------------------
178
179function exec_mots_partout() {
180global $choses_possibles;
181  include(_DIR_PLUGIN_MOTS_PARTOUT."/mots_partout_choses.php");
182  include_spip("inc/choses");
183  include_spip ("inc/presentation");
184  include_spip ("inc/documents");
185  include_spip ("base/abstract_sql");
186  include_spip("inc/objet");
187
188  /***********************************************************************/
189/* PREFIXE*/
190  /***********************************************************************/
191  $table_pref = 'spip';
192  if ($GLOBALS['table_prefix']) $table_pref = $GLOBALS['table_prefix'];
193 
194 
195  /***********************************************************************/
196  /* récuperation de la chose sur laquelle on travaille*/
197  /***********************************************************************/
198
199  $nom_chose = addslashes(_request('nom_chose'));
200  if(!isset($choses_possibles[$nom_chose])) {
201        list($nom_chose,) = each($choses_possibles);
202        reset($choses_possibles);
203  }
204  $id_chose = $choses_possibles[$nom_chose]['id_chose'];
205  $table_principale = $choses_possibles[$nom_chose]['table_principale'];
206  $table_auth = $choses_possibles[$nom_chose]['table_auth'];
207  $tables_limite = $choses_possibles[$nom_chose]['tables_limite'];
208
209  list($mots_voir, $mots_cacher, $mots_ajouter, $mots_enlever) = splitArrayIds(_request('mots'));
210  $choses = secureIntArray(_request('choses'));
211
212  $limit =  addslashes(_request('limit'));
213  if($limit == '') $limit = 'rien';
214  $id_limit =  intval(_request('identifiant_limit'));
215  if($id_limit < 1) $id_limit = 0;
216  $nb_aff = intval(_request('nb_aff'));
217  if($nb_aff < 1) $nb_aff = 20;
218  $switch = addslashes(_request('switch'));
219  if($switch == '') $switch = 'voir';
220  $strict = intval(_request('strict'));
221
222  /**********************************************************************/
223  /* recherche des choses.*/
224  /***********************************************************************/
225 
226  if(count($choses) == 0) {
227        $select = array();
228        $select[] = "DISTINCT main.$id_chose";
229       
230        $from = array();
231        $where = array();
232        $group = '';
233        $order = array();
234       
235        if(isset($limit) && $limit != 'rien') {
236          $table_lim = $tables_limite[$limit]['table'];
237          $nom_id_lim = $tables_limite[$limit]['nom_id'];
238         
239          $from[0] = "$table_lim as main";
240          $where[0] = "main.$nom_id_lim IN ($id_limit)";
241          if(count($mots_voir) > 0) {
242                $from[1] = "spip_mots_$nom_chose as table_temp";
243                $where[1] = "table_temp.$id_chose = main.$id_chose";
244                $where[] = "table_temp.id_mot IN (".calcul_in($mots_voir).')';
245                if($strict) {
246                  $select[] = 'count(id_mot) as tot';
247                  $group = "main.$id_chose";
248                  $order = array('tot DESC');
249                }
250          }
251          if(count($mots_cacher) > 0) {
252                $from[1] = "spip_mots_$nom_chose as table_temp";
253                $where[1] = "table_temp.$id_chose = main.$id_chose";
254                $where[] = "table_temp.id_mot not IN (".calcul_in($mots_cacher).')';
255                if($strict) {
256                  $select[] = 'count(id_mot) as tot';
257                  $group = "main.$id_chose";
258                  $order = array('tot DESC');
259                }
260          }     
261        } else if((count($mots_voir) > 0)||(count($mots_cacher) > 0)){
262          if(count($mots_voir) > 0) {
263                $from[0] = "spip_mots_$nom_chose as main";
264                $where[] = "main.id_mot IN (".calcul_in($mots_voir).')';
265                if($strict) {
266                  $select[] = 'count(id_mot) as tot';
267                  $group = "main.$id_chose";
268                  $order = array('tot DESC');
269                }
270          }
271          if(count($mots_cacher) > 0) {
272                $from[0] = "spip_mots_$nom_chose as main";
273                $where[] = "main.id_mot not IN (".calcul_in($mots_cacher).')';
274                if($strict) {
275                  $select[] = 'count(id_mot) as tot';
276                  $group = "main.$id_chose";
277                  $order = array('tot DESC');
278                }
279          }
280        } else {
281          $from[] = "$table_principale as main";
282        }
283
284        $res=spip_abstract_select($select,$from,$where,$group,$order);
285       
286        $choses = array();
287        $avec_sans = (count($mots_cacher) > 0);
288        if($avec_sans) $in_sans = calcul_in($mots_cacher);
289        while ($row = spip_abstract_fetch($res)) {
290          if(!isset($table_auth) ||
291                 (isset($table_auth) &&
292                  (verifier_admin() ||
293                   verifier_auteur($table_auth,$id_chose,$row[$id_chose])
294                   )
295                  )
296                 ) {
297                if($avec_sans) {
298                  $test = spip_abstract_select(array($id_chose),array("spip_mots_$nom_chose"),array("id_mot IN ($in_sans)","$id_chose = ".$row[$id_chose]));
299                  if(spip_abstract_count($test) > 0) {
300                        continue;
301                  }
302                  spip_abstract_free($test);
303                }
304                if(count($mots_voir) > 0 && $strict) {
305                  if($row['tot'] >= count($mots_voir)) {
306                        $choses[] = $row[$id_chose];
307                  } else {
308                        break;
309                  }
310                } else {
311                  $choses[] = $row[$id_chose];
312                }
313          }
314        }
315        spip_abstract_free($res);
316  }
317
318  if(count($choses) > 0) {
319        $debut_aff = _request('t_debut');
320
321        $query = "SELECT spip_mots_$nom_chose.id_mot FROM spip_mots_$nom_chose WHERE spip_mots_$nom_chose.$id_chose".((count($choses))?(' IN('.calcul_in(array_slice($choses,$debut_aff,$nb_aff)).')'):'');
322
323        $res = spip_query($query);
324       
325        while ($row = spip_fetch_array($res)) {
326          $show_mots[] = $row['id_mot'];
327        }
328        spip_free_result($res);
329  }
330
331
332  /***********************************************************************/
333  /* affichage*/
334  /***********************************************************************/
335
336  debut_page('&laquo; '._T('motspartout:titre_page').' &raquo;', 'documents', 'mots', '', _DIR_PLUGIN_MOTS_PARTOUT."/mots_partout.css");
337  echo'</script>';
338
339          echo '<br><br><center>';
340  gros_titre(_T('motspartout:titre_page'));
341  echo '</center>';
342
343  //Colonne de gauche
344  debut_gauche();
345
346  echo '<form method="post" action="'.generer_url_ecrire('mots_partout','').'">';
347
348
349  // choix de la chose sur laquelle on veut ajouter des mots
350  debut_cadre_enfonce('',false,'',_T('motspartout:choses'));
351  echo '<div class=\'liste\'>
352<table border=0 cellspacing=0 cellpadding=3 width=\"100%\">
353<tr class=\'tr_liste\'>
354<td colspan=2><select name="nom_chose">';
355  $tables_installees = unserialize(lire_meta('MotsPartout:tables_installees'));
356  foreach($choses_possibles as $cho => $m) {
357          if($tables_installees[$cho]) {
358                echo "<option value=\"$cho\"".(($cho == $nom_chose)?'selected':'').'>'._T($m['titre_chose']).'</option>';
359          }
360  }
361  echo '</select></td>';
362
363  echo '</tr>
364<tr class=\'tr_liste\'><td colspan=2>'.
365        _T('motspartout:limite').
366        ':</td></tr>';
367  echo '<tr class=\'tr_liste\'><td><select name="limit">
368<option value="rien" selected="true">'.
369        _T('motspartout:aucune').
370        '</option>';
371 
372  foreach($tables_limite as $t => $m) {
373        echo "<option value=\"$t\"".(($t == $limit)?'selected':'').">$t</option>";
374  }
375 
376  echo '</select></td>';
377  echo "<td><input type='text' size='3' name='identifiant_limit' value='$id_limit'></td></tr>";
378  echo '<tr class=\'tr_liste\'>';
379  echo "
380        <td>
381        <button type='submit' name='switch' value='chose'>";
382  echo _T('motspartout:voir');
383  echo"    </button>
384        </td>";
385
386  if(count($choses)>0) {
387        echo '<td colspan=2><label for="nb_aff">'._T('motspartout:par').':</label><select name="nb_aff">';
388       
389        for($nb = 10;$nb<count($choses);$nb=$nb+10)
390          echo "<option value=\"$nb\"".(($nb == $nb_aff)?'selected="true"':'').">$nb</option>";
391       
392        echo '</select></td>';
393  } else {
394        echo '<td colspan=2></td>';
395  }
396
397        echo "  </table></div>";
398  fin_cadre_enfonce();
399
400  $redirect = generer_url_ecrire('mots_partout',"limit=$limit&identifiant_limit=$id_limit&nb_aff=$nb_aff");
401
402  echo "</form><form method='post' action='".generer_url_action('mots_partout',"redirect=$redirect")."'>";
403 
404  echo '<input type="hidden" name="nom_chose" value="'.$nom_chose.'">';
405 
406  // les actions et limitations possibles.
407  if(count($choses)) {
408        debut_cadre_enfonce('',false,'',_T('motspartout:action'));
409       
410       
411        echo '<div class=\'liste\'>
412                  <table border=0 cellspacing=0 cellpadding=3 width=\'100%\'>
413           <tr class=\'tr_liste\'>
414          <td colspan=2>';
415        echo _T('motspartout:action_help',array('chose' => $nom_chose));
416        echo "</td>
417                   </tr>
418           <tr class='tr_liste'>
419           <td><button type='submit' name='switch' value='action'>";
420        echo _T('bouton_valider');
421        echo "     </button></td>
422<td>
423(<input type='checkbox' id='strict' name='strict'/>
424<label for='strict'>selection".
425_T('motspartout:stricte').
426"?)</label></td>
427                   </tr>
428                   </table>
429                   </div>";
430        fin_cadre_enfonce();
431  }
432  creer_colonne_droite();
433  // affichage de mots clefs.
434  $select = array('*');
435  $from = array('spip_groupes_mots');
436  $order = array('titre');
437  $m_result_groupes = spip_abstract_select($select,$from,'','',$order);
438
439  while ($row_groupes = spip_abstract_fetch($m_result_groupes)) {
440        $id_groupe = $row_groupes['id_groupe'];
441        $titre_groupe = typo($row_groupes['titre']);
442        $unseul = $row_groupes['unseul'];
443        $acces_admin =  $row_groupes['minirezo'];
444        $acces_redacteur = $row_groupes['comite'];
445
446        if($row_groupes[$nom_chose] == 'oui' && (($GLOBALS['connect_statut'] == '1comite' AND $acces_redacteur == 'oui') OR ($GLOBALS['connect_statut'] == '0minirezo' AND $acces_admin == 'oui'))) {
447          // Afficher le titre du groupe
448          debut_cadre_enfonce("groupe-mot-24.gif", false, '', $titre_groupe);
449         
450          //
451          // Afficher les mots-cles du groupe
452          //
453          $result = spip_abstract_select(array('*'),
454                                                                         array('spip_mots'),
455                                                                         array("id_groupe = '$id_groupe'"),
456                                                                         '', array('titre'));
457          $table = '';
458         
459          if (spip_abstract_count($result) > 0) {
460                echo "<div class='liste'>";
461                $i =0;
462                while ($row = spip_abstract_fetch($result)) {
463                  $vals = '';
464                 
465                  $id_mot = $row['id_mot'];
466                  $titre_mot = $row['titre'];
467                 
468                  $s = typo($titre_mot);
469                 
470                  $vals["$s"] = calcul_numeros($show_mots,$id_mot,count($choses));
471
472                  $vals['<select id="id_mot'.$id_mot.'" name="mots['.$id_mot.']"><option value="">--'._T('motspartout:action').'--</option><option value="voir">'._T('motspartout:voir').'</option><option value="cacher">'._T('motspartout:cacher').'</option><option value="avec">'._T('motspartout:ajouter').'</option><option value="sans">'._T('motspartout:enlever').'</option></select>'] = calcul_numeros($show_mots,$id_mot,count($choses));
473                  $table[] = $vals;
474                }
475               
476          }
477          $largeurs = array(40, 10, 10);
478          $styles = array(
479                                          array('arial11',
480                                                        'partie arial11',
481                                                        'avec arial11'),
482                                          array('arial1',
483                                                        'partie arial1',
484                                                        'avec arial1'),
485                                          array('arial1',
486                                                        'partie arial1',
487                                                        'avec arial1'),
488                                          array('arial1',
489                                                        'partie arial1',
490                                                        'avec arial1'),
491                                          array('arial1',
492                                                        'partie arial1',
493                                                        'avec arial1'),
494                                          array('arial1',
495                                                        'partie arial1',
496                                                        'avec arial1')
497                                          );
498          md_afficher_liste($largeurs, $table, $styles);
499          echo "</div>";
500          spip_abstract_free($result);
501         
502          fin_cadre_enfonce();
503        }
504  }
505  spip_abstract_free($m_result_groupes);
506
507
508  //Milieu
509
510  debut_droite();
511
512  if(count($warnings) > 0) {
513        debut_cadre_relief('',false,'',_T('motspartout:ATTENTION'));
514        echo '<div class="liste"><table border=0 cellspacing=0 cellpadding=3 width=\"100%\">';
515        $largeurs = array('100%');
516        $styles = array( 'arial11');
517        afficher_liste($largeurs, $warnings, $styles);
518        echo '</table>';
519        echo '</div>';
520        fin_cadre_relief();
521  }
522
523  // Affichage de toutes les choses (on pourrait imaginer faire une pagination là)
524  debut_cadre_relief('',false,'document', _T('portfolio'));
525  if(count($choses) > 0) {
526        $function = "afficher_liste_$nom_chose";
527        if(function_exists($function))
528          $function($choses,$nb_aff);
529        else {
530          afficher_liste_defaut($choses,$nb_aff);
531        }       
532        echo "<!--
533<input type=\"radio\" name=\"selectall\" id=\"all\" onclick=\"selectAll(this.form, 'choses[]', 0);\"><label for=\"all\">Select All</label>
534<input  type=\"radio\" name=\"selectall\" id=\"inverse\"  onclick=\"selectAll(this.form, 'choses[]', 1);\"><label for=\"inverse\">Inverse All</label>
535-->";
536  } else {
537        echo _T('motspartout:pas_de_documents').'.';
538  }
539 
540  fin_cadre_relief();
541  echo '</form>
542<script>
543function selectAll(formObj, isInverse)
544{
545   for (var i=0;i < formObj.length;i++)
546   {
547      fldObj = formObj.elements[i];
548      if (fldObj.type == \'checkbox\')
549      {
550         if(isInverse)
551            fldObj.checked = (fldObj.checked) ? false : true;
552         else fldObj.checked = true;
553       }
554   }
555}
556</script>';
557 
558  fin_page();
559 
560}
561?>
Note: See TracBrowser for help on using the repository browser.