source: spip-zone/_plugins_/_test_/mots_partout/1.9.1/exec/mots_partout.php @ 7855

Last change on this file since 7855 was 7855, checked in by pierre.andrews@…, 13 years ago

correction du bug du foreach qui tourne sur rien. Maintenant, a chaque fois qu'on essaie de lire tables_isntalles, s'il est vide, on l'initialise avec les tables par defaut

  • creation d'un fichier mes_options qui definit automatiquemenet les infos pour les tables de jointure etc... histoire de faire facilement des boucles.
File size: 16.7 KB
RevLine 
[177]1<?php 
2
3
[2120]4//        exec/mots_partout.php
[177]5//    Fichier créé pour SPIP avec un bout de code emprunté à celui ci.
[1893]6//    Distribué sans garantie sous licence GPL./
[2120]7//    Copyright (C) 2006  Pierre ANDREWS
[177]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
[3429]23$p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(dirname(__FILE__)))));
24define('_DIR_PLUGIN_MOTS_PARTOUT',(_DIR_PLUGINS.end($p)));
[1918]25
[1925]26/***********************************************************************/
27/* function*/
28/***********************************************************************/
[275]29
[1925]30
[177]31function verifier_admin() {
32  global $connect_statut, $connect_toutes_rubriques;
33  return (($connect_statut == '0minirezo') AND $connect_toutes_rubriques);
34}
35
[275]36function verifier_auteur($table, $id_objet, $id) {
37  global $connect_id_auteur;
[177]38  $select = array('id_auteur');
39 
40  $from =  array($table);
41 
[956]42  $where = array("id_auteur = $connect_id_auteur", "$id_objet = $id");
[177]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
[1928]55//on calcul le style pour ce mot. I.E. on regarde si il est attache à tout ou seulement une partie
[177]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
[1928]67//liste des mots a droite
[177]68function md_afficher_liste($largeurs, $table, $styles = '') {
[1925]69  global $couleur_claire;
70  global $browser_name;
71  global $spip_display;
72  global $spip_lang_left;
[177]73
[1925]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);
[1921]81        list($texte, $sel) = each($t);
[1925]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";
[177]101        echo "\n";
[1925]102  }
[177]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
[1928]115//genere la liste de IN a partir d'un tableau
[177]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
[1928]124//force a un tableau de int
[1900]125function secureIntArray($array) {
[1925]126  $to_return = Array();
[1903]127  if(is_array($array)) {
128        foreach($array as $id) {
129          $to_return[] = intval($id);
130        }
131  }
[1900]132  return $to_return;
133}
134
[1928]135// transfert la variable POST d'un tableau (19 => 'avec', 20=>'voir') en 4 tableaux avec=(19) voir=(20)
[1921]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)) {
[1925]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;
[1921]156            break;
157
158        }
159      }
160    }
161  }
162  return array($voir, $cacher, $ajouter, $enlever);
163}
164
[1928]165//====================l'affichage par defaut======================================
[177]166
167function afficher_liste_defaut($choses) {
168  echo '<table>';
169  $i = 0;
170  foreach($choses as $id_chose) {
171        $i++;
[2120]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>";
[177]173  }
174  echo '</table>';
175}
176
[1928]177//------------------------la fonction qui fait tout-----------------------------------
[1884]178
[2157]179function exec_mots_partout() {
[4558]180global $choses_possibles;
[2094]181  include(_DIR_PLUGIN_MOTS_PARTOUT."/mots_partout_choses.php");
[4558]182  include_spip("inc/choses");
[2304]183  include_spip ("inc/presentation");
184  include_spip ("inc/documents");
185  include_spip ("base/abstract_sql");
186  include_spip("inc/objet");
[177]187
[1935]188  /***********************************************************************/
189/* PREFIXE*/
190  /***********************************************************************/
[2123]191  $table_pref = 'spip';
192  if ($GLOBALS['table_prefix']) $table_pref = $GLOBALS['table_prefix'];
[1821]193 
[2123]194 
[1925]195  /***********************************************************************/
196  /* récuperation de la chose sur laquelle on travaille*/
197  /***********************************************************************/
[1821]198
[3847]199  $nom_chose = addslashes(_request('nom_chose'));
[1925]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'];
[1821]208
[3847]209  list($mots_voir, $mots_cacher, $mots_ajouter, $mots_enlever) = splitArrayIds(_request('mots'));
[3845]210  $choses = secureIntArray(_request('choses'));
[2126]211
[3847]212  $limit =  addslashes(_request('limit'));
[3845]213  if($limit == '') $limit = 'rien';
[3847]214  $id_limit =  intval(_request('identifiant_limit'));
[3845]215  if($id_limit < 1) $id_limit = 0;
[3847]216  $nb_aff = intval(_request('nb_aff'));
[3845]217  if($nb_aff < 1) $nb_aff = 20;
[3847]218  $switch = addslashes(_request('switch'));
[3845]219  if($switch == '') $switch = 'voir';
[3847]220  $strict = intval(_request('strict'));
[3845]221
222  /**********************************************************************/
223  /* recherche des choses.*/
[1925]224  /***********************************************************************/
[3845]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) {
[3846]319        $debut_aff = _request('t_debut');
[3845]320
[3846]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
[3845]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  /***********************************************************************/
[1925]333  /* affichage*/
334  /***********************************************************************/
[177]335
[1925]336  debut_page('&laquo; '._T('motspartout:titre_page').' &raquo;', 'documents', 'mots', '', _DIR_PLUGIN_MOTS_PARTOUT."/mots_partout.css");
[3860]337  echo'</script>';
[1921]338
[1925]339          echo '<br><br><center>';
340  gros_titre(_T('motspartout:titre_page'));
341  echo '</center>';
[177]342
[1925]343  //Colonne de gauche
344  debut_gauche();
[177]345
[1925]346  echo '<form method="post" action="'.generer_url_ecrire('mots_partout','').'">';
[177]347
348
[1925]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\'>
[254]352<table border=0 cellspacing=0 cellpadding=3 width=\"100%\">
353<tr class=\'tr_liste\'>
[1938]354<td colspan=2><select name="nom_chose">';
[2050]355  $tables_installees = unserialize(lire_meta('MotsPartout:tables_installees'));
[7855]356  if (!$tables_installees){
357        $tables_installees=array("articles"=>true,"rubriques"=>true,"breves"=>true,"forum"=>true,"syndic"=>true);
358        ecrire_meta('MotsPartout:tables_installees',serialize($tables_installees));
359        ecrire_metas();
360  }
[1925]361  foreach($choses_possibles as $cho => $m) {
[2041]362          if($tables_installees[$cho]) {
[2001]363                echo "<option value=\"$cho\"".(($cho == $nom_chose)?'selected':'').'>'._T($m['titre_chose']).'</option>';
364          }
[1925]365  }
366  echo '</select></td>';
[1898]367
[1925]368  echo '</tr>
[660]369<tr class=\'tr_liste\'><td colspan=2>'.
[1925]370        _T('motspartout:limite').
371        ':</td></tr>';
372  echo '<tr class=\'tr_liste\'><td><select name="limit">
[177]373<option value="rien" selected="true">'.
[1925]374        _T('motspartout:aucune').
375        '</option>';
376 
377  foreach($tables_limite as $t => $m) {
378        echo "<option value=\"$t\"".(($t == $limit)?'selected':'').">$t</option>";
379  }
380 
381  echo '</select></td>';
[2126]382  echo "<td><input type='text' size='3' name='identifiant_limit' value='$id_limit'></td></tr>";
[1925]383  echo '<tr class=\'tr_liste\'>';
384  echo "
[1938]385        <td>
[1925]386        <button type='submit' name='switch' value='chose'>";
387  echo _T('motspartout:voir');
388  echo"    </button>
[1938]389        </td>";
390
[3862]391  if(count($choses)>0) {
[1938]392        echo '<td colspan=2><label for="nb_aff">'._T('motspartout:par').':</label><select name="nb_aff">';
[3862]393       
394        for($nb = 10;$nb<count($choses);$nb=$nb+10)
395          echo "<option value=\"$nb\"".(($nb == $nb_aff)?'selected="true"':'').">$nb</option>";
396       
397        echo '</select></td>';
398  } else {
399        echo '<td colspan=2></td>';
400  }
[1938]401
[3862]402        echo "  </table></div>";
[1925]403  fin_cadre_enfonce();
[2120]404
[2126]405  $redirect = generer_url_ecrire('mots_partout',"limit=$limit&identifiant_limit=$id_limit&nb_aff=$nb_aff");
[2120]406
[2126]407  echo "</form><form method='post' action='".generer_url_action('mots_partout',"redirect=$redirect")."'>";
[1925]408 
[2120]409  echo '<input type="hidden" name="nom_chose" value="'.$nom_chose.'">';
[1883]410 
411  // les actions et limitations possibles.
[1925]412  if(count($choses)) {
413        debut_cadre_enfonce('',false,'',_T('motspartout:action'));
414       
415       
416        echo '<div class=\'liste\'>
417                  <table border=0 cellspacing=0 cellpadding=3 width=\'100%\'>
418           <tr class=\'tr_liste\'>
419          <td colspan=2>';
420        echo _T('motspartout:action_help',array('chose' => $nom_chose));
421        echo "</td>
[961]422                   </tr>
[275]423           <tr class='tr_liste'>
[1925]424           <td><button type='submit' name='switch' value='action'>";
425        echo _T('bouton_valider');
[1928]426        echo "     </button></td>
[1921]427<td>
[1927]428(<input type='checkbox' id='strict' name='strict'/>
429<label for='strict'>selection".
430_T('motspartout:stricte').
431"?)</label></td>
[275]432                   </tr>
433                   </table>
[1925]434                   </div>";
435        fin_cadre_enfonce();
436  }
437  creer_colonne_droite();
438  // affichage de mots clefs.
439  $select = array('*');
440  $from = array('spip_groupes_mots');
441  $order = array('titre');
442  $m_result_groupes = spip_abstract_select($select,$from,'','',$order);
[494]443
[1925]444  while ($row_groupes = spip_abstract_fetch($m_result_groupes)) {
445        $id_groupe = $row_groupes['id_groupe'];
446        $titre_groupe = typo($row_groupes['titre']);
447        $unseul = $row_groupes['unseul'];
448        $acces_admin =  $row_groupes['minirezo'];
449        $acces_redacteur = $row_groupes['comite'];
[494]450
[1925]451        if($row_groupes[$nom_chose] == 'oui' && (($GLOBALS['connect_statut'] == '1comite' AND $acces_redacteur == 'oui') OR ($GLOBALS['connect_statut'] == '0minirezo' AND $acces_admin == 'oui'))) {
452          // Afficher le titre du groupe
453          debut_cadre_enfonce("groupe-mot-24.gif", false, '', $titre_groupe);
454         
455          //
456          // Afficher les mots-cles du groupe
457          //
458          $result = spip_abstract_select(array('*'),
459                                                                         array('spip_mots'),
460                                                                         array("id_groupe = '$id_groupe'"),
461                                                                         '', array('titre'));
462          $table = '';
463         
464          if (spip_abstract_count($result) > 0) {
465                echo "<div class='liste'>";
466                $i =0;
467                while ($row = spip_abstract_fetch($result)) {
468                  $vals = '';
469                 
470                  $id_mot = $row['id_mot'];
471                  $titre_mot = $row['titre'];
472                 
473                  $s = typo($titre_mot);
474                 
475                  $vals["$s"] = calcul_numeros($show_mots,$id_mot,count($choses));
[3860]476
477                  $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));
[1925]478                  $table[] = $vals;
479                }
[494]480               
481          }
[1925]482          $largeurs = array(40, 10, 10);
483          $styles = array(
484                                          array('arial11',
485                                                        'partie arial11',
486                                                        'avec arial11'),
487                                          array('arial1',
488                                                        'partie arial1',
489                                                        'avec arial1'),
490                                          array('arial1',
491                                                        'partie arial1',
492                                                        'avec arial1'),
493                                          array('arial1',
494                                                        'partie arial1',
495                                                        'avec arial1'),
496                                          array('arial1',
497                                                        'partie arial1',
498                                                        'avec arial1'),
499                                          array('arial1',
500                                                        'partie arial1',
501                                                        'avec arial1')
502                                          );
503          md_afficher_liste($largeurs, $table, $styles);
504          echo "</div>";
505          spip_abstract_free($result);
[494]506         
[1925]507          fin_cadre_enfonce();
508        }
[494]509  }
[1925]510  spip_abstract_free($m_result_groupes);
[494]511
[660]512
[1925]513  //Milieu
[494]514
[1925]515  debut_droite();
[494]516
[1925]517  if(count($warnings) > 0) {
518        debut_cadre_relief('',false,'',_T('motspartout:ATTENTION'));
519        echo '<div class="liste"><table border=0 cellspacing=0 cellpadding=3 width=\"100%\">';
520        $largeurs = array('100%');
521        $styles = array( 'arial11');
522        afficher_liste($largeurs, $warnings, $styles);
523        echo '</table>';
524        echo '</div>';
525        fin_cadre_relief();
526  }
[494]527
[1925]528  // Affichage de toutes les choses (on pourrait imaginer faire une pagination là)
529  debut_cadre_relief('',false,'document', _T('portfolio'));
530  if(count($choses) > 0) {
531        $function = "afficher_liste_$nom_chose";
532        if(function_exists($function))
533          $function($choses,$nb_aff);
534        else {
535          afficher_liste_defaut($choses,$nb_aff);
[1904]536        }       
[1925]537        echo "<!--
[2120]538<input type=\"radio\" name=\"selectall\" id=\"all\" onclick=\"selectAll(this.form, 'choses[]', 0);\"><label for=\"all\">Select All</label>
539<input  type=\"radio\" name=\"selectall\" id=\"inverse\"  onclick=\"selectAll(this.form, 'choses[]', 1);\"><label for=\"inverse\">Inverse All</label>
[1925]540-->";
541  } else {
542        echo _T('motspartout:pas_de_documents').'.';
543  }
544 
545  fin_cadre_relief();
546  echo '</form>
[275]547<script>
548function selectAll(formObj, isInverse)
549{
550   for (var i=0;i < formObj.length;i++)
551   {
552      fldObj = formObj.elements[i];
[1925]553      if (fldObj.type == \'checkbox\')
[275]554      {
555         if(isInverse)
556            fldObj.checked = (fldObj.checked) ? false : true;
557         else fldObj.checked = true;
558       }
559   }
560}
[1925]561</script>';
562 
563  fin_page();
564 
[1821]565}
[765]566?>
Note: See TracBrowser for help on using the repository browser.