source: pmb4.2/trunk/fuentes/pmb/classes/term_search.class.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 14.1 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: term_search.class.php,v 1.25 2015-04-03 11:16:20 jpermanne Exp $
6//
7// Gestion de la recherche des termes dans le thésaurus
8
9if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
10
11require_once($base_path."/classes/category.class.php");
12require_once($class_path."/analyse_query.class.php");
13require_once($class_path."/thesaurus.class.php");
14
15class term_search {
16        var $id_thes = 0;                               //Etendue de la recherche (identifiant thesaurus ou multi-thesaurus si 0)
17        var $thes;
18        var $search_term_name;                  //Nom de la variable contenant le terme recherché dans les catégories
19        var $search_term_origin_name;   //Nom de la variable contenant le terme recherché saisi par l'utilisateur
20    var $search_term;                           //Terme recherché dans les catégories
21        var $search_term_oigin;                 //Terme recherché saisi par l'utilisateur
22    var $n_per_page;                            //Nombre de résultats par page
23    var $base_query;                            //Paramètres supplémentaires à passer dans l'url
24    var $url_for_term_show;                     //Page à appeller pour l'affichage de la fiche du terme
25        var $url_for_term_search;               //Page à appeller pour l'affichage de la liste des termes correspondants à la recherche
26        var $offset;                                    //offset en fonction de la page courante
27        var $page;                                      //Page courante (récupérée du formulaire)
28        var $n_total;                                   //Nombre de termes total correspondants à la recherche
29    var $keep_tilde;                            //Affichage ou non des catégories cachées
30    var $order;                                         //Stockage de la clause select de calcul de pertinence
31    var $error_message;                         //Erreur renvoyée par l'analyse de la chaine
32    var $where;                                         //Clause where après analyse de la chaine
33    var $aq;
34     
35    //Constructeur
36    function term_search($search_term_name,$search_term_origin_name,$n_per_page=500,$base_query,$url_for_term_show,$url_for_term_search,$keep_tilde=0,$id_thes=0) {
37
38        global $page;
39       
40                //recuperation du thesaurus session
41                if(!$id_thes) {
42                        $id_thes = thesaurus::getSessionThesaurusId();
43                } else {
44                        thesaurus::setSessionThesaurusId($id_thes);
45                }         
46                       
47        $this->search_term_name=$search_term_name;
48        $this->search_term_origin_name=$search_term_origin_name;
49       
50        global $$search_term_name;
51        global $$search_term_origin_name;
52       
53        $this->search_term=stripslashes($$search_term_name);
54        $this->search_term_origin=stripslashes($$search_term_origin_name);
55       
56        $this->n_per_page=$n_per_page;
57        $this->base_query=$base_query;
58        $this->url_for_term_show=$url_for_term_show;
59        $this->url_for_term_search=$url_for_term_search;
60        $this->keep_tilde=$keep_tilde;
61               
62                $this->id_thes = $id_thes;             
63                if ($id_thes != -1) $this->thes= new thesaurus($id_thes);
64       
65        if ($page=="") $page=0;
66        $this->page=$page;
67        $this->offset=$page*$this->n_per_page;
68       
69        //$this->get_term_count();
70    }
71   
72    //Affichage du navigateur de pages
73    function page_navigator() {
74        $url_page=$this->url_for_term_search."?".$this->search_term_name."=".rawurlencode($this->search_term)."&".$this->search_term_origin_name."=".rawurlencode($this->search_term_origin);
75       
76                if ($this->offset!=0) $navig="<a href=\"$url_page&page=".($this->page-1)."&".$this->base_query."&nbresultterme=".$this->n_total."\">&lt;</a>";
77                $navig.=" (".($this->offset+1)."-".min($this->offset+$this->n_per_page,$this->n_total).")/".$this->n_total." ";
78                if (($this->offset+$this->n_per_page+1)<$this->n_total) $navig.="<a href=\"$url_page&page=".($this->page+1)."&".$this->base_query."&nbresultterme=".$this->n_total."\">&gt;</a>";
79                return $navig; 
80    }
81   
82    //Récupération du terme where pour la recherche
83    function get_where_term() {
84       
85        global $msg;
86       
87        //Si il y a déjà un terme where calculé alors renvoi tout de suite
88        if ($this->where) return $this->where;
89       
90        //Si il y a un terme saisi alors close where
91                if ($this->search_term) {
92                        $this->error_message="";
93                        $aq=new analyse_query($this->search_term);
94                        if (!$aq->error) {
95                                $members=$aq->get_query_members("categories","libelle_categorie","index_categorie","num_noeud");
96                                $where_term = "and ".$members["where"];
97                                $this->order = $members["select"];
98                                $this->where = $where_term;
99                                $this->aq = $aq;
100                        } else {
101                                $this->error_message=sprintf($msg["searcher_syntax_error_desc"],$aq->current_car,$aq->input_html,$aq->error_message);
102                        }
103                }
104                return $where_term;
105    }
106   
107    //Récupération du nombre de termes correspondants à la recherche
108    //N'est plus appelé depuis le 3/08/2012
109    function get_term_count() {
110       
111        global $lang;
112        global $thesaurus_mode_pmb;
113        global $dbh;           
114       
115        //Comptage du nombre de termes
116        $where_term=$this->get_where_term();
117                if ($where_term) {
118                        $members_catdef = $this->aq->get_query_members("catdef", "catdef.libelle_categorie", "catdef.index_categorie", "catdef.num_noeud");
119                        $members_catlg = $this->aq->get_query_members("catlg", "catlg.libelle_categorie", "catlg.index_categorie", "catlg.num_noeud");
120                }
121
122                if ($this->id_thes != -1){      //1 seul thesaurus
123                               
124                        if ( ($thesaurus_mode_pmb!='1') || ($lang==$this->thes->langue_defaut) || (in_array($lang, thesaurus::getTranslationsList())===false) ) {       //Recherche dans la langue par défaut du thesaurus
125
126                                $q = "select count(distinct libelle_categorie) ";
127                                $q.= "from categories as catdef ";
128                                $q.= "where 1 ";
129                                if ($where_term) $q.= "and ".$members_catdef["where"]." ";
130                                $q.= "and catdef.num_thesaurus = '".$this->id_thes."' ";
131                                $q.= "and catdef.langue = '".$this->thes->langue_defaut."' "; 
132                                $q.= "and catdef.libelle_categorie not like '~%' ";
133                                $r = pmb_mysql_query($q);
134                                $this->n_total=pmb_mysql_result($r, 0, 0);
135                       
136                        } else {                //Recherche dans la langue de l'interface ou dans la langue par défaut du thesaurus
137
138                                $q = "drop table if exists cattmp ";
139                                $r = pmb_mysql_query($q, $dbh);
140       
141                                $q1 = "create temporary table cattmp engine=myisam select ";
142                                $q1.= "if(catlg.num_noeud is null, catdef.libelle_categorie, catlg.libelle_categorie) as categ_libelle ";
143                                $q1.= "from categories as catdef "; 
144                                $q1.= "left join categories as catlg on catdef.num_noeud = catlg.num_noeud and catlg.langue = '".$lang."' "; 
145                                $q1.= "where 1 ";
146                                if ($where_term) $q1.= "and if(catlg.num_noeud is null, ".$members_catdef["where"].", ".$members_catlg["where"].") ";
147                                $q1.= "and catdef.num_thesaurus = '".$this->id_thes."' ";
148                                $q1.= "and catdef.langue = '".$this->thes->langue_defaut."' "; 
149                                $q1.= "and catdef.libelle_categorie not like '~%' ";
150                                $r1 = pmb_mysql_query($q1, $dbh);
151                                $q2 = "select count(distinct categ_libelle) from cattmp ";
152                                $r2 = pmb_mysql_query($q2);
153                               
154                                $this->n_total=pmb_mysql_result($r2, 0, 0);
155                        }
156                       
157                } else {
158
159                        //tous les thesaurus
160                        //on recherche dans la langue de l'interface ou dans la langue par défaut du thesaurus
161                        $q = "drop table if exists cattmp ";
162                        $r = pmb_mysql_query($q, $dbh);
163
164                        $q1 = "create temporary table cattmp engine=myisam select ";
165                        $q1.= "id_thesaurus, ";
166                        $q1.= "if(catlg.num_noeud is null, catdef.libelle_categorie, catlg.libelle_categorie) as categ_libelle ";
167                        $q1.= "from thesaurus ";
168                        $q1.= "left join categories as catdef on id_thesaurus=catdef.num_thesaurus and catdef.langue=thesaurus.langue_defaut ";
169                        $q1.= "left join categories as catlg on catdef.num_noeud=catlg.num_noeud and catlg.langue = '".$lang."' ";
170                        $q1.= "where 1 ";
171                        if ($where_term) $q1.= "and (if(catlg.num_noeud is null, ".$members_catdef["where"].", ".$members_catlg["where"].") ) ";
172                        $q1.= "and catdef.libelle_categorie not like '~%' ";
173                        $resultat1 = pmb_mysql_query($q1, $dbh);
174                       
175                        $q2 = "select count(distinct id_thesaurus,categ_libelle) from cattmp ";                                 
176                        $r2=pmb_mysql_query($q2);
177                        $this->n_total=pmb_mysql_result($r2,0,0);
178                }
179
180}
181   
182   
183    //Affichage de la liste des résultats
184    function show_list_of_terms() {
185       
186        global $charset;
187        global $msg;
188        global $lang;
189        global $dbh;
190        global $thesaurus_mode_pmb;
191        global $nbresultterme;
192       
193        //Si il y a eu erreur lors de la première analyse...
194        if ($this->error_message) {
195                return $this->error_message;
196        }
197       
198                //Recherche des termes correspondants à la requête
199                $where_term=$this->get_where_term();
200                if($where_term) {
201                        $members_catdef = $this->aq->get_query_members("catdef", "catdef.libelle_categorie", "catdef.index_categorie", "catdef.num_noeud");
202                        $members_catlg = $this->aq->get_query_members("catlg", "catlg.libelle_categorie", "catlg.index_categorie", "catlg.num_noeud");
203                }else{
204                        echo $msg["term_search_info"];
205                        return;
206                }
207               
208                if($nbresultterme){
209                        $this->n_total=$nbresultterme;
210                        $requete = "select count(catdef.num_noeud) as nb, ";
211                }else{
212                        $requete = "select SQL_CALC_FOUND_ROWS count(catdef.num_noeud) as nb, ";
213                }
214               
215                if ($this->id_thes != -1){              //1 seul thesaurus
216                       
217                        if (($lang==$this->thes->langue_defaut) || (in_array($lang, thesaurus::getTranslationsList())===false) ) {      //Recherche dans la langue par défaut du thesaurus
218                                $requete.= "num_thesaurus, ";
219                                $requete.= "num_noeud as categ_id, ";
220                                $requete.= "libelle_categorie as categ_libelle, ";
221                                $requete.= "catdef.index_categorie as indexcat ";
222                                if ($where_term) $requete.= ", ".$members_catdef["select"]." as pert ";
223                                $requete.= "from categories as catdef "; 
224                                $requete.= "where 1 ";
225                                if ($where_term) $requete.= "and ".$members_catdef["where"]." ";
226                                $requete.= "and num_thesaurus = '".$this->id_thes."' ";
227                                $requete.= "and catdef.langue = '".$this->thes->langue_defaut."' ";
228                                $requete.= "and catdef.libelle_categorie not like '~%' ";
229                                $requete.= "group by categ_libelle ";
230                                $requete.= "order by ";
231                                if ($where_term) $requete.= "pert desc, ";
232                                $requete.= "indexcat asc ";
233                                $requete.= "limit ".$this->offset.",".$this->n_per_page;
234                       
235                        } else {                //Recherche dans la langue de l'interface ou dans la langue par défaut du thesaurus
236                                $requete.= "catdef.num_thesaurus, ";
237                                $requete.= "catdef.num_noeud as categ_id, ";
238                                $requete.= "if (catlg.num_noeud is null, catdef.libelle_categorie, catlg.libelle_categorie ) as categ_libelle, ";
239                                $requete.= "if (catlg.num_noeud is null, catdef.index_categorie , catlg.index_categorie ) as indexcat ";
240                                if ($where_term) $requete.= ", if (catlg.num_noeud is null, ".$members_catdef["select"].", ".$members_catlg["select"].") as pert ";
241                                $requete.= "from categories as catdef "; 
242                                $requete.= "left join categories as catlg on catdef.num_noeud = catlg.num_noeud and catlg.langue = '".$lang."' ";
243                                $requete.= "where 1 ";
244                                if ($where_term) $requete.= "and (if(catlg.num_noeud is null, ".$members_catdef["where"].", ".$members_catlg["where"].") ) ";
245                                $requete.= "and catdef.num_thesaurus = '".$this->id_thes."' ";
246                                $requete.= "and catdef.langue = '".$this->thes->langue_defaut."' ";
247                                $requete.= "and catdef.libelle_categorie not like '~%' ";
248                                $requete.= "group by categ_libelle ";
249                                $requete.= "order by ";
250                                if ($where_term) $requete.= "pert desc, ";
251                                $requete.= "indexcat asc ";
252                                $requete.= "limit ".$this->offset.",".$this->n_per_page;
253                               
254                        }
255                       
256                } else {
257                       
258                        //tous les thesaurus
259                        //on recherche dans la langue de l'interface ou dans la langue par défaut du thesaurus
260                        $requete.= "catdef.num_thesaurus, ";
261                        $requete.= "catdef.num_noeud as categ_id, ";
262                        $requete.= "if (catlg.num_noeud is null, catdef.libelle_categorie , catlg.libelle_categorie ) as categ_libelle, ";
263                        $requete.= "if (catlg.num_noeud is null, catdef.index_categorie , catlg.index_categorie ) as indexcat ";
264                        if ($where_term) $requete.= ", if (catlg.num_noeud is null, ".$members_catdef["select"].", ".$members_catlg["select"].") as pert ";
265                        $requete.= "from thesaurus ";
266                        $requete.= "left join categories as catdef on id_thesaurus=catdef.num_thesaurus and catdef.langue=thesaurus.langue_defaut ";
267                        $requete.= "left join categories as catlg on catdef.num_noeud=catlg.num_noeud and catlg.langue = '".$lang."' ";
268                        if ($where_term) $requete.= "where if(catlg.num_noeud is null, ".$members_catdef["where"].", ".$members_catlg["where"].") ";
269                        $requete.= "group by categ_libelle, catdef.num_thesaurus ";
270                        $requete.= "order by ";
271                        if ($where_term) $requete.= "pert desc, ";
272                        $requete.= "catdef.num_thesaurus, indexcat asc ";
273                        $requete.= "limit ".$this->offset.",".$this->n_per_page;
274                }
275
276                $resultat=pmb_mysql_query($requete, $dbh);
277               
278                //On récupère le nombre de résultat
279                if(!$this->n_total){
280                        $qry = "SELECT FOUND_ROWS() AS NbRows";
281                        if($resnum = pmb_mysql_query($qry)){
282                                $this->n_total=pmb_mysql_result($resnum,0,0);
283                        }
284                }
285               
286                $res="<div classtitle_term_search'>";
287                $res.='<b>';
288                if ($this->search_term!='') $res.=$msg['term_search_found_term'].'<i>'.htmlentities($this->search_term_origin,ENT_QUOTES,$charset); else $res.='<i>'.$msg['term_search_all_terms'];
289                $res.="</i></b>\n";
290
291                //Navigateur de page
292                $res.=$this->page_navigator();
293
294                $res.="</div>";
295                $res.="<div class='row'>";
296                $res.="</div>";
297                //Affichage des termes trouvés
298                $class='colonne2';
299                while ($r=pmb_mysql_fetch_object($resultat)) {
300                        $show=1;
301                       
302                        //S'il n'y a qu'un seul résultat, vérification que ce n'est pas un terme masqué
303                        if (($r->nb == 1) && (!$this->keep_tilde)) {
304                                $t_test = new category($r->categ_id);
305                                if (($t_test->is_under_tilde)&&(!$t_test->voir_id)) $show=0;
306                        }
307
308                        if ($show) {
309                                $res.="<div class='".$class."' >";
310                                if ($r->nb>1) $nbre_termes ='('.$r->nb.') ';
311                                        else  $nbre_termes ='' ;
312                               
313                                $res.= $nbre_termes."<a href=\"".$this->url_for_term_show.'?term='.rawurlencode($r->categ_libelle).'&id_thes='.$r->num_thesaurus.'&'.$this->base_query."\" target=\"term_show\" >";
314                                if ($this->id_thes == -1) {      //le nom du thesaurus n'est pas affiché si 1 seul thesaurus
315                                        $res.= '['.htmlentities(addslashes(thesaurus::getLibelle($r->num_thesaurus)),ENT_QUOTES,$charset).'] ';
316                                }
317                                $res.= htmlentities($r->categ_libelle,ENT_QUOTES,$charset)."</a>\n";
318                                $res.="<br />\n";
319                                $res.='</div>';
320                                if ($class=='colonne2') $class='colonne_suite'; else $class='colonne2';
321                        }
322                }
323                if ($class=='colonne_suite') $res.="<div class=\"colonne_suite\"></div>\n";
324                return $res;
325    }
326}
327?>
Note: See TracBrowser for help on using the repository browser.