source: pmb4.2/trunk/fuentes/pmb/classes/categories.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: 16.0 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2005 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: categories.class.php,v 1.36 2015-06-05 13:04:00 dgoron Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9require_once($class_path."/noeuds.class.php");
10require_once($class_path."/thesaurus.class.php");
11require_once($class_path."/notice.class.php");
12require_once($class_path."/indexation.class.php");
13require_once($class_path."/vedette/vedette_composee.class.php");
14
15class categories{
16       
17       
18        var $num_noeud;                                 //Identifiant du noeud de rattachement
19        var $langue;
20        var $libelle_categorie = '';
21        var $note_application = '';
22        var $comment_public = '';
23        var     $comment_voir = '';
24        var $index_categorie = '';
25
26       
27        //Constructeur   
28        function categories($num_noeud, $langue) {
29
30                global $dbh;
31                $this->num_noeud = $num_noeud;                         
32                $this->langue = $langue;
33                $q = "select count(1) from categories where num_noeud = '".$this->num_noeud."' and langue = '".$this->langue."' ";
34                $r = pmb_mysql_query($q, $dbh);
35                if (pmb_mysql_result($r, 0, 0) != 0) {
36                        $this->load();
37                } else {
38                        $defaultLibelle="-";
39                        $q = "SELECT libelle_categorie FROM categories JOIN thesaurus ON id_thesaurus = num_thesaurus AND langue_defaut=langue AND num_noeud='".$this->num_noeud."'";
40                        $r = pmb_mysql_query($q, $dbh);
41                        if(pmb_mysql_num_rows($r)){
42                                $row=pmb_mysql_fetch_object($r);
43                                $defaultLibelle = $row->libelle_categorie;
44                        }
45                        $q = "insert into categories set num_noeud = '".$this->num_noeud."', langue = '".$langue."', ";
46                        $q.= "libelle_categorie = '".addslashes($defaultLibelle)."', note_application = '', comment_public = '', ";
47                        $q.= "comment_voir = '', index_categorie = '' ";
48                        $r = pmb_mysql_query($q, $dbh);
49                        //pour les appels en enregistrement de notice, la méthode save n'est pas appelée, donc on force
50                        $this->libelle_categorie = $defaultLibelle;
51                        $this->save();
52                } 
53        }
54
55
56        // charge la catégorie à partir de la base si elle existe.
57        function load(){
58       
59                global $dbh;
60
61                $q = "select * from categories where num_noeud = '".$this->num_noeud."' and langue = '".$this->langue."' limit 1";
62                $r = pmb_mysql_query($q, $dbh);
63                $obj = pmb_mysql_fetch_object($r);
64                $this->libelle_categorie = $obj->libelle_categorie;                             
65                $this->note_application = $obj->note_application;                               
66                $this->comment_public = $obj->comment_public;                           
67                $this->comment_voir = $obj->comment_voir;
68                $this->index_categorie = $obj->index_categorie;
69
70        }
71       
72        // enregistre la catégorie en base.
73        function save(){
74               
75                global $dbh;
76                global $msg;
77                global $include_path;
78               
79                $no = new noeuds($this->num_noeud);
80                $num_thesaurus = $no->num_thesaurus; 
81               
82                //On teste si la categorie existe à ce niveau
83                //$categ_exist = $this->searchLibelle($this->libelle_categorie,$num_thesaurus,$this->langue,$no->num_parent);
84                //if ($categ_exist != 0) {
85                        //require_once("$include_path/user_error.inc.php");
86                        //warning($msg['create_category'],$msg['create_category_double']);
87                        //on supprime les relations dans la base
88                        //$this->delete($this->num_noeud,$this->langue);
89                        //$no->delete($this->num_noeud);
90                        //return FALSE;
91                //} else {             
92                        $q = "update categories set ";
93                        $q.= "num_thesaurus = '".$num_thesaurus."', ";
94                        $q.= "libelle_categorie = '".addslashes($this->libelle_categorie)."', ";
95                        $q.= "note_application = '".addslashes($this->note_application)."', ";
96                        $q.= "comment_public = '".addslashes($this->comment_public)."', ";
97                        $q.= "comment_voir = '".addslashes($this->comment_voir)."', ";
98                        $q.= "index_categorie = ' ".addslashes(strip_empty_words($this->libelle_categorie,$this->langue))." ' ";
99                        $q.= "where num_noeud = '".$this->num_noeud."' and langue = '".$this->langue."' "; 
100                        $r = pmb_mysql_query($q, $dbh);
101                        categories::update_index($this->num_noeud);
102                        $this->update_index_path_word();
103
104                        // Mise à jour des vedettes composées contenant cette autorité
105                        vedette_composee::update_vedettes_built_with_element($this->num_noeud, "category");
106                //}
107        }
108       
109        function update_index_path_word(){
110                global $dbh;
111                global $msg;
112                global $include_path;   
113                global $thesaurus_auto_postage_search;
114                global $thesaurus_auto_postage_search_nb_descendant,$thesaurus_auto_postage_search_nb_montant; 
115
116                /*      auto_postage_descendant:
117                *               Soit categ : Europe:France:Sarthe
118                *               et une notice sous la categ Sarthe.
119                *       la recherche tous champs de Europe va sortir la notice sous la categ Sarthe
120                */                               
121                $no = new noeuds($this->num_noeud);
122                $num_thesaurus = $no->num_thesaurus;   
123                $path=$no->path;       
124                $liste_num_noeud=explode('/',$path);
125                // pour l'index coté gestion
126                $lib_list=array();     
127                if($thesaurus_auto_postage_search){     
128                        $limit=$thesaurus_auto_postage_search_nb_descendant;           
129                        if($limit){                             
130                                $liste_num_noeud=explode('/',$path);
131                                if($limit != '*') array_splice($liste_num_noeud,0,count($liste_num_noeud)-$limit-1);
132                                $select_num_noeud=implode(',',$liste_num_noeud);
133                                $q = "select libelle_categorie from categories where num_noeud in( $select_num_noeud ) and langue = '".$this->langue."' and num_thesaurus=$num_thesaurus";
134                                $r = pmb_mysql_query($q, $dbh);
135                                while ($row = pmb_mysql_fetch_object($r))       {
136                                        $lib_list[]= $row->libelle_categorie; 
137                                }
138                        }
139                }               
140               
141                /*      auto_postage_montant:
142                 *              Soit categ : Europe:France:Sarthe
143                 *              et une notice sous la categ Europe.
144                 *      la recherche tous champs de Sarthe va sortir la notice sous la categ Europe
145                 */ 
146                $liste_fils="";
147                if($thesaurus_auto_postage_search){     
148                        $limit=$thesaurus_auto_postage_search_nb_montant;               
149                        if($limit){     
150                                if( is_numeric($limit))
151                                        $liste_fils=" path regexp '^$path(\\/[0-9]*){0,$limit}$' ";
152                                elseif($limit == '*') 
153                                        $liste_fils=" (path like '$path/%' or  path = '$path') ";       
154                                if($liste_fils) {
155                                        $q = "select libelle_categorie from categories,noeuds where id_noeud=num_noeud
156                                        and $liste_fils and langue = '".$this->langue."' and categories.num_thesaurus=$num_thesaurus and noeuds.num_thesaurus=$num_thesaurus";
157                                        $r = pmb_mysql_query($q, $dbh);
158                                        while ($row = pmb_mysql_fetch_object($r))       {
159                                                $lib_list[]= $row->libelle_categorie; 
160                                        }
161                                }                       
162                        }                               
163                }
164                               
165                // Si rien, on ne met que le libelle de la categ
166                if(!count($lib_list))$lib_list[]=$this->libelle_categorie;
167                //$lib_list=array_unique  ($lib_list);
168                $index=implode(" ",$lib_list);         
169                $clean_index=strip_empty_words($index);
170               
171                $q = "update categories set ";
172                $q.= "path_word_categ = ' ".trim(addslashes($index))." ', ";           
173                $q.= "index_path_word_categ = ' ".trim(addslashes($clean_index))." ' ";
174                $q.= "where num_noeud = '".$this->num_noeud."' and langue = '".$this->langue."' and num_thesaurus=$num_thesaurus"; 
175                $r = pmb_mysql_query($q, $dbh);         
176        }
177       
178        //verifie si une categorie existe dans la langue concernée
179        static function exists($num_noeud, $langue) {
180       
181                global $dbh;
182               
183                $q = "select count(1) from categories where num_noeud = '".$num_noeud."' and langue = '".$langue."' ";
184                $r = pmb_mysql_query($q, $dbh);
185                if (pmb_mysql_result($r, 0, 0) == 0) return FALSE;
186                        else return TRUE;               
187        }
188       
189        //supprime une categorie en base.
190        function delete($num_noeud, $langue) {
191
192                global $dbh;
193               
194                $q = "delete from categories where num_noeud = '".$num_noeud."' and langue = '".$langue."' ";
195                $r = @pmb_mysql_query($q, $dbh);
196        }               
197
198
199        //Liste les libelles des ancetres d'une categorie dans la langue concernée
200        //a partir de la racine du thesaurus
201        static function listAncestorNames($num_noeud=0, $langue) {
202               
203                global $dbh;
204                       
205                /*if(!$num_noeud) {// Pas de $this dans une static
206                        $num_noeud = $this->num_noeud;
207                        $langue = $this->langue;
208                }*/
209                $thes = thesaurus::getByEltId($num_noeud);
210                $id_list = noeuds::listAncestors($num_noeud);
211                $id_list = array_reverse($id_list);
212                $lib_list = '';
213               
214                foreach($id_list as $dummykey=>$id) {
215                        if (categories::exists($id, $langue)) $lg=$langue; 
216                        else $lg=$thes->langue_defaut; 
217                        $q = "select libelle_categorie from categories where num_noeud = '".$id."' ";
218                        $q.= "and langue = '".$lg."' limit 1";
219                        $r = pmb_mysql_query($q, $dbh);
220                        if (pmb_mysql_num_rows($r))     {
221                                $lib_list.= pmb_mysql_result($r, 0, 0); 
222                                if ($id != $num_noeud) $lib_list.= ':';
223                        }
224                }
225                return $lib_list;
226       
227        }
228
229
230        //Retourne un tableau des ancetres d'une categorie dans la langue concernée
231        //a partir de la racine du thesaurus
232        static function listAncestors($num_noeud=0, $langue='') {
233               
234                global $dbh;
235                       
236                /*if(!$num_noeud) {// Pas de $this dans une static
237                        $num_noeud = $this->num_noeud;
238                        $langue = $this->langue;
239                }*/
240                $thes = thesaurus::getByEltId($num_noeud);
241                $id_list = noeuds::listAncestors($num_noeud);
242                $id_list = array_reverse($id_list);
243                $anc_list = array();
244
245                foreach($id_list as $key=>$id) {
246                        if (categories::exists($id, $langue)) $lg=$langue; 
247                        else $lg=$thes->langue_defaut; 
248                        $q = "select * from noeuds, categories ";
249                        $q.= "where categories.num_noeud = '".$id."' ";
250                        $q.= "and categories.langue = '".$lg."' ";
251                        $q.= "and categories.num_noeud = noeuds.id_noeud ";
252                        $q.= "limit 1";
253                        $r = pmb_mysql_query($q, $dbh);
254                       
255                        while ($row = pmb_mysql_fetch_object($r))       {
256                                $anc_list[$id]['num_noeud'] = $row->num_noeud;
257                                $anc_list[$id]['num_parent'] = $row->num_parent;
258                                $anc_list[$id]['num_renvoi_voir'] = $row->num_renvoi_voir;
259                                $anc_list[$id]['visible'] = $row->visible;
260                                $anc_list[$id]['num_thesaurus'] = $row->num_thesaurus;
261                                $anc_list[$id]['langue'] = $row->langue;
262                                $anc_list[$id]['libelle_categorie'] = $row->libelle_categorie;
263                                $anc_list[$id]['note_application'] = $row->note_application;
264                                $anc_list[$id]['comment_public'] = $row->comment_public;
265                                $anc_list[$id]['comment_voir'] = $row->comment_voir;
266                                $anc_list[$id]['index_categorie'] = $row->index_categorie;
267                                $anc_list[$id]['autorite'] = $row->autorite;
268                        }
269                }
270                return $anc_list;
271        }
272       
273
274        //Retourne un resultset des enfants d'une categorie dans la langue concernée
275        function listChilds($num_noeud=0, $langue, $keep_tilde=1, $ordered=0) {
276               
277                global $dbh;
278                       
279                if(!$num_noeud) {
280                        $num_noeud = $this->num_noeud;
281                        $langue = $this->langue;
282                }
283                $thes = thesaurus::getByEltId($num_noeud);
284                $list = array();
285
286                $q = "select ";
287                $q.= "catdef.num_noeud, noeuds.autorite, noeuds.num_parent, noeuds.num_renvoi_voir, noeuds.visible, noeuds.num_thesaurus, ";
288                $q.= "if (catlg.num_noeud is null, catdef.langue, catlg.langue ) as langue, ";
289                $q.= "if (catlg.num_noeud is null, catdef.libelle_categorie, catlg.libelle_categorie ) as libelle_categorie, ";
290                $q.= "if (catlg.num_noeud is null, catdef.note_application, catlg.note_application ) as note_application, ";
291                $q.= "if (catlg.num_noeud is null, catdef.comment_public, catlg.comment_public ) as comment_public, ";
292                $q.= "if (catlg.num_noeud is null, catdef.comment_voir, catlg.comment_voir ) as comment_voir, ";
293                $q.= "if (catlg.num_noeud is null, catdef.index_categorie, catlg.index_categorie ) as index_categorie ";
294                $q.= "from noeuds left join categories as catdef on noeuds.id_noeud=catdef.num_noeud and catdef.langue = '".$thes->langue_defaut."' "; 
295                $q.= "left join categories as catlg on catdef.num_noeud = catlg.num_noeud and catlg.langue = '".$langue."' "; 
296                $q.= "where ";
297                $q.= "noeuds.num_parent = '".$num_noeud."' ";
298                if (!$keep_tilde) $q.= "and catdef.libelle_categorie not like '~%' ";
299                if ($ordered !== 0) $q.= "order by ".$ordered." ";
300                $r = pmb_mysql_query($q, $dbh);
301
302                return $r;
303        }
304
305
306        //optimization de la table categories
307        function optimize() {
308               
309                global $dbh;
310               
311                $opt = pmb_mysql_query('OPTIMIZE TABLE categories', $dbh);
312                return $opt;
313               
314        }                       
315
316
317        //recherche $libelle dans les libellés de la table categories et retourne 0 si non trouvé
318        //sinon retourne identifiant de categorie
319        function searchLibelle($libelle, $id_thesaurus=0, $lg=0, $num_parent=0) {
320               
321                global $dbh;
322                global $lang;
323                global $thesaurus_defaut;
324               
325                if (!$lg) $lg = $lang;
326                if (!$id_thesaurus) $id_thesaurus = $thesaurus_defaut;
327               
328                $q = "select id_noeud from noeuds, categories where 1 ";
329                if ($id_thesaurus != -1) $q.= "and noeuds.num_thesaurus = '".$id_thesaurus."' ";
330                if ($num_parent) $q.= "and noeuds.num_parent = '".$num_parent."' ";
331                if ($lg != -1) $q.= "and categories.langue = '".$lg."' ";
332                $q.= "and categories.libelle_categorie = '".$libelle."' ";
333                $q.= "and noeuds.id_noeud = categories.num_noeud ";
334                $q.= "limit 1";
335                $r = pmb_mysql_query($q, $dbh); 
336                if (pmb_mysql_num_rows($r)) return pmb_mysql_result($r, 0, 0);
337                        else return 0;
338               
339        }
340
341               
342        //---------------------------------------------------------------
343        // update_index($id) : maj des n-uplets la table notice_global_index
344        // en rapport avec cette catégorie     
345        //---------------------------------------------------------------
346        static function update_index($id) {
347                global $dbh;
348               
349                //ajout des mots des termes dans la table words pour l autoindexation
350                $q = "select trim(index_categorie) as index_categorie, langue from categories where num_noeud=".$id;
351                $r = pmb_mysql_query($q,$dbh);
352                $i=0;
353                $t_words=array();
354                if(pmb_mysql_num_rows($r)) {
355                        while ($row =pmb_mysql_fetch_object($r)) {
356                                $t_row = explode(' ',$row->index_categorie);
357                                if( is_array($t_row) && count($t_row) ) {
358                                        $t_row = array_unique($t_row);
359                                        foreach($t_row as $w) {
360                                                if($w) {
361                                                        $t_words[$i]['word'] = $w;
362                                                        $t_words[$i]['lang'] = $row->langue;
363                                                        $i++;
364                                                }
365                                        }
366                                }
367                        }
368                }
369                if(count($t_words)) {
370                        //calcul de stem et double_metaphone
371                        foreach ($t_words as $i=>$w) {
372                                $q1 = "select id_word from words where word='".addslashes($w['word'])."' and lang='".addslashes($w['lang'])."' limit 1";
373                                $r1 = pmb_mysql_query($q1, $dbh);
374                                if(pmb_mysql_num_rows($r1)) {
375                                        //le mot existe
376                                        $t_words[$i]['allready_exists']=1;
377                                } else {
378                                        //le mot n'existe pas
379                                        $dmeta = new DoubleMetaPhone($w['word']);
380                                        if($dmeta->primary || $dmeta->secondary){
381                                                $t_words[$i]['double_metaphone'] = $dmeta->primary." ".$dmeta->secondary;
382                                        }
383                                        if($w['lang']=='fr_FR') {
384                                                $stemming = new stemming($w['word']);
385                                                $t_words[$i]['stem']=$stemming->stem;
386                                        } else {
387                                                $t_words[$i]['stem']='';
388                                        }
389                                }
390                        }
391                        foreach($t_words as $i=>$w) {
392                                if (!$w['allready_exists']) {
393                                        $q2 = "insert ignore into words (word, lang, double_metaphone, stem) values ('".$w['word']."', '".$w['lang']."', '".$w['double_metaphone']."', '".$w['stem']."') ";
394                                        pmb_mysql_query($q2,$dbh);
395                                }       
396                        }
397                }
398               
399                // On cherche tous les n-uplet de la table notice correspondant à cette catégorie.
400                $found = pmb_mysql_query("select distinct notcateg_notice from notices_categories where num_noeud='".$id ."' ",$dbh);
401                // Pour chaque n-uplet trouvés on met a jour la table notice_global_index avec l'auteur modifié :
402                $num = pmb_mysql_num_rows($found);
403                for($j=0;$j < $num; $j++) {
404                        $mesNotices = pmb_mysql_fetch_object($found);
405                        $notice_id = $mesNotices->notcateg_notice;
406                        notice::majNoticesGlobalIndex($notice_id);
407                        notice::majNoticesMotsGlobalIndex($notice_id,'subject');
408                }
409                //on cherche les questions correspondantes...
410                $query = "select num_faq_question from faq_questions_categories where num_categ = ".$id;
411                $result = pmb_mysql_query($query);
412                if(pmb_mysql_num_rows($result)){
413                        global $include_path;
414                        $index = new indexation($include_path."/indexation/faq/question.xml", "faq_questions");
415                        while($row = pmb_mysql_fetch_object($result)){
416                                $index->maj($row->num_faq_question,"categories");
417                        }
418                }
419        }
420       
421        function getlibelle($num_noeud=0, $langue=""){
422                global $dbh;
423                $lib="";
424                if(!$num_noeud) {
425                        $num_noeud = $this->num_noeud;
426                        $langue = $this->langue;
427                }
428                $thes = thesaurus::getByEltId($num_noeud);
429                if (categories::exists($num_noeud, $langue)) $lg=$langue; 
430                else $lg=$thes->langue_defaut; 
431                $q = "select libelle_categorie from categories where num_noeud = '".$num_noeud."' ";
432                $q.= "and langue = '".$lg."' limit 1";
433                $r = pmb_mysql_query($q, $dbh);
434                if (pmb_mysql_num_rows($r))     {
435                        $lib= pmb_mysql_result($r, 0, 0); 
436                }
437               
438                return $lib;
439        }
440
441        function process_categ_index() {
442        global $dbh;
443                       
444        $q = "select * from categories ";
445        $r = pmb_mysql_query($q, $dbh);
446        while ($obj = pmb_mysql_fetch_object($r)) {     
447                $thes = new categories($obj->num_noeud,$obj->langue);
448                $thes->update_index_path_word();               
449        }       
450}
451}
452?>
Note: See TracBrowser for help on using the repository browser.