source: pmb4.2/trunk/fuentes/pmb/classes/bannette_facettes.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: 18.5 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: bannette_facettes.class.php,v 1.21.2.1 2015-12-09 10:48:07 jpermanne Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9require_once ($include_path."/templates/bannette_facettes.tpl.php");
10require_once($class_path."/notice_tpl_gen.class.php");
11require_once ("$class_path/mono_display.class.php") ; 
12require_once ("$class_path/serial_display.class.php") ;
13require_once($class_path."/notice_tpl_gen.class.php");
14
15class bannette_facettes{
16        var $id=0;// $id bannette
17        var $facettes=array(); // facettes associées à la bannette
18        var $environement=array(); // affichage des notices
19        var $noti_tpl_document=0; // template de notice
20        var $bannette_display_notice_in_every_group=0;
21        var $bannette_document_group=0;
22        var $sommaires=array(); // donnée du document à générer par un templatze
23       
24        function bannette_facettes($id) {  // $id bannette
25                $this->id=$id+0;               
26                $this->fields_array = $this->fields_array();
27                $this->fetch_data();
28        }
29       
30        //recuperation de champs_base.xml
31        function fields_array(){
32                global $include_path,$msg;
33                global $dbh, $champ_base;
34       
35                if(!count($champ_base)) {
36                        $file = $include_path."/indexation/notices/champs_base_subst.xml";
37                        if(!file_exists($file)){
38                                $file = $include_path."/indexation/notices/champs_base.xml";
39                        }
40                        $fp=fopen($file,"r");
41                        if ($fp) {
42                                $xml=fread($fp,filesize($file));
43                        }
44                        fclose($fp);
45                        $champ_base=_parser_text_no_function_($xml,"INDEXATION");
46                }
47                return $champ_base;
48        }
49       
50        function fetch_data() {         
51                global $msg,$dbh,$charset;
52                $this->facettes=array();
53                $req="select bannette_facettes.*,bannettes.display_notice_in_every_group,bannettes.document_group from bannette_facettes
54                JOIN bannettes ON id_bannette=num_ban_facette
55                where num_ban_facette=". $this->id." order by ban_facette_order";
56                $res = pmb_mysql_query($req,$dbh);
57                $i=0;
58                if (pmb_mysql_num_rows($res)) {
59                        while($r=pmb_mysql_fetch_object($res)){
60                                $this->facettes[$i] = new stdClass();
61                                $this->facettes[$i]->critere=$r->ban_facette_critere;
62                                $this->facettes[$i]->ss_critere= $r->ban_facette_ss_critere;
63                                $this->facettes[$i]->order_sort= $r->ban_facette_order;
64                               
65                                if(!$this->bannette_display_notice_in_every_group){
66                                        $this->bannette_display_notice_in_every_group=$r->display_notice_in_every_group;
67                                }
68                               
69                                if(!$this->bannette_document_group){
70                                        $this->bannette_document_group=$r->document_group;
71                                }
72                               
73                                $i++;
74                        }
75                }
76        }       
77       
78        function array_sort(){
79                global $msg;
80       
81                $array_sort = array();
82       
83                $nb = count($this->fields_array['FIELD']);
84                for($i=0;$i<$nb;$i++){
85                        if($tmp= $msg[$this->fields_array['FIELD'][$i]['NAME']]){
86                                $lib = $tmp;
87                        }else{
88                                $lib = $this->fields_array['FIELD'][$i]['NAME'];
89                        }
90                        $id2 = $this->fields_array['FIELD'][$i]['ID'] + 0;
91                        $array_sort[$id2] = $lib;
92                               
93                }
94                asort($array_sort);
95                return $array_sort;
96       
97        }
98       
99        function array_subfields($id){
100                global $msg,$charset;
101               
102                $array = $this->fields_array;
103                $array_subfields = array();
104                $bool_search = 0;
105                $i = 0;
106       
107                if($id!=100){
108                        while($bool_search==0){
109                                if($array['FIELD'][$i]['ID']==$id){
110                                        $isbd=$array['FIELD'][$i]['ISBD'];
111                                        $array = $array['FIELD'][$i]['TABLE'][0]['TABLEFIELD'];
112                                        $bool_search = 1;
113                                }
114                                $i++;
115                        }
116                        $size = count($array);
117                        for($i=0;$i<$size;$i++){
118                                if ($array[$i]['NAME']) $array_subfields[$array[$i]['ID']+0] = $msg[$array[$i]['NAME']];
119                        }
120                        if($isbd){
121                                $array_subfields[$isbd[0]['ID']+0]=$msg['facette_isbd'];
122                        }
123                }else{
124                        $req= pmb_mysql_query("select idchamp,titre from notices_custom order by titre asc");
125                        $j=0;
126                        while($rslt=pmb_mysql_fetch_object($req)){
127                                $array_subfields[$rslt->idchamp+0] = $rslt->titre;
128                                $j++;
129                        }
130                }
131                return $array_subfields;
132        }
133       
134        function delete(){
135                $del = "delete from bannette_facettes where num_ban_facette = '".$this->id."'";
136                pmb_mysql_query($del);
137        }
138       
139        function save(){
140                global $max_facette;
141               
142                $this->delete();
143               
144                $order=0;
145                for($i=0;$i<$max_facette;$i++){
146                        $critere = 'list_crit_'.$i;
147                        global $$critere;
148                        if($$critere > 0){
149                                $ss_critere = 'list_ss_champs_'.$i;
150                                global $$ss_critere;
151                                                               
152                                $rqt = "insert into bannette_facettes set num_ban_facette = '".$this->id."', ban_facette_critere = '".$$critere."', ban_facette_ss_critere='".$$ss_critere."', ban_facette_order='".$order."' ";
153                                pmb_mysql_query($rqt);
154                                $order++;                               
155                        }                       
156                }               
157        }
158       
159        function add_ss_crit($suffixe_id,$id,$id_ss_champs=0){
160               
161                global $msg,$charset;           
162               
163                $id+=0;
164                $id_ss_champs+=0;               
165               
166                $array = $this->array_subfields($id);
167                $tab_ss_champs = array();
168                if(isset($suffixe_id)){
169                        $name_ss_champs="list_ss_champs_".$suffixe_id;
170                }else{
171                        $name_ss_champs="list_ss_champs";
172                }
173                $select_ss_champs.="<select id='$name_ss_champs' name='$name_ss_champs'>";
174               
175                if((count($array)>1)){
176                        foreach($array as $j=>$val2){
177                                if($id_ss_champs == $j) $select_ss_champs.="<option value=".$j." selected='selected'>".htmlentities($val2,ENT_QUOTES,$charset)."</option>";
178                                else $select_ss_champs.="<option value=".$j.">".htmlentities($val2,ENT_QUOTES,$charset)."</option>";
179                        }
180               
181                        $select_ss_champs.="</select></br>";
182                        return $select_ss_champs;
183                }elseif(count($array)==1){
184                        foreach($array as $j=>$val2){
185                                $select_ss_champs = "<input type='hidden' name='$name_ss_champs' value='1'/>";
186                        }
187                        return $select_ss_champs;
188                }
189        }
190       
191        function add_facette($i_field){
192                global $tpl_facette_elt_ajax;
193               
194       
195                $array = $this->array_sort();
196                $tpl = $tpl_facette_elt_ajax;
197
198                $i=0;
199                foreach ($array as $id => $value) {
200                        if(!$i){
201                                $select.="<option value=".$id." selected='selected'>".$value."</option>";
202                        } else {
203                                $select.="<option value=".$id.">".$value."</option>";
204                        }
205                }
206                $tpl = str_replace('!!i_field!!', $i_field, $tpl);
207                $tpl = str_replace("!!liste1!!",$select,$tpl);
208                $tpl = str_replace("!!id_bannette!!",$this->id,$tpl);
209                return $tpl;
210        }       
211       
212        function gen_facette_selection(){
213                global $dsi_facette_tpl;
214                global $tpl_facette_elt;
215       
216                $array = $this->array_sort();
217                               
218                $tpls=$dsi_facette_tpl;         
219                $nb=count($this->facettes);
220                if(!$nb)$nb++;
221               
222                for ($i=0 ; $i<$nb; $i++){
223                        $tpl = $tpl_facette_elt;
224                       
225                        $tpl = str_replace('!!i_field!!', $i, $tpl);
226                        $tpl = str_replace('!!ss_crit!!', $this->facettes[$i]->ss_critere, $tpl);
227                        $select="";                                                             
228                        foreach ($array as $id => $value) {
229                                if( $id==$this->facettes[$i]->critere){
230                                        $select.="<option value=".$id." selected='selected'>".$value."</option>";
231                                } else {
232                                        $select.="<option value=".$id.">".$value."</option>";
233                                }
234                        }                               
235                        $tpl = str_replace("!!liste1!!",$select,$tpl);
236                        $facettes_tpl.=$tpl;
237                }
238                               
239                $tpls = str_replace("!!facettes!!",$facettes_tpl,$tpls);
240                $tpls = str_replace("!!max_facette!!",$nb,$tpls);
241                $tpls = str_replace("!!id_bannette!!",$this->id,$tpls);
242
243                return $tpls;
244        }
245       
246        function build_document($notice_ids,$notice_tpl="",$gen_summary=0,$gen_document=0){
247               
248                if($notice_tpl){
249                        $this->noti_tpl_document=new notice_tpl_gen($notice_tpl);
250                } else $this->noti_tpl_document="";
251                // paramétrage :
252                $this->environement["short"] = 6 ;
253                $this->environement["ex"] = 0 ;
254                $this->environement["exnum"] = 1 ;
255               
256                $facettes_list=$this->facettes;
257                $this->gen_summary=$gen_summary;
258                $this->summary="";
259                $this->index=0;
260               
261                $res_notice_ids=$this->filter_facettes_search($facettes_list,$notice_ids);
262                $resultat_aff=$this->filter_facettes_print($res_notice_ids,1,array(),$gen_document);
263               
264                if($this->gen_summary) $resultat_aff="<A NAME='SUMMARY'></A><div class='summary'><br />".$this->summary."</div>".$resultat_aff;
265               
266                return $resultat_aff;           
267        }
268       
269        function build_notice($notice_id){
270                global $deflt2docs_location,$url_base_opac;
271               
272                global $use_opac_url_base; $use_opac_url_base=1;
273                global $use_dsi_diff_mode; $use_dsi_diff_mode=1;
274                if($this->noti_tpl_document) {
275                        $tpl_document=$this->noti_tpl_document->build_notice($notice_id,$deflt2docs_location);
276                }
277                if(!$tpl_document) {
278                        $n=pmb_mysql_fetch_object(@pmb_mysql_query("select * from notices where notice_id=".$notice_id));
279                        if ($n->niveau_biblio == 'm'|| $n->niveau_biblio == 'b') {
280                                $mono=new mono_display($n,$this->environement["short"],"",$this->environement["ex"],"","","",0,1,$this->environement["exnum"],0,"",0,true,false);
281                                $tpl_document.= "<a href='".$url_base_opac.$n->notice_id."&code=!!code!!&emprlogin=!!login!!&date_conex=!!date_conex!!'><b>".$mono->header."</b></a><br /><br />\r\n";
282                                $tpl_document.= $mono->isbd;
283                        } elseif ($n->niveau_biblio == 's' || $n->niveau_biblio == 'a') {
284                                $serial = new serial_display($n, 6, "", "", "", "", "", 0,1,$this->environement["exnum"],0, false );
285                                $tpl_document.= "<a href='".$url_base_opac.$n->notice_id."&code=!!code!!&emprlogin=!!login!!&date_conex=!!date_conex!!'><b>".$serial->header."</b></a><br /><br />\r\n";
286                                $tpl_document.= $serial->isbd;
287                        }
288                        $tpl_document=str_replace('<!-- !!avis_notice!! -->', "", $tpl_document);
289                        global $notice_separator;
290                        if($notice_separator)$tpl_document.=$notice_separator;
291                        else $tpl_document.="<div class='hr'><hr /></div>";
292                }
293                 return $tpl_document."\r\n";
294        }
295               
296        function filter_facettes_search($facettes_list,$notice_ids){
297                global $dbh;
298                global $lang;
299                global $msg;
300                global $dsi_bannette_notices_order ;
301
302                $notices=implode(",",$notice_ids);
303                $res_notice_ids=array();
304                $res_notice_ids["values"]=array();
305                $res_notice_ids["notfound"]=array();
306                       
307                $critere= $facettes_list[0]->critere;
308                $ss_critere= $facettes_list[0]->ss_critere;
309       
310                if ($dsi_bannette_notices_order) {
311                        $req = "SELECT * FROM notices_fields_global_index LEFT JOIN notices on (id_notice=notice_id)
312                        WHERE id_notice IN (".$notices.")
313                        AND code_champ = ".$critere."   AND code_ss_champ = ".$ss_critere." AND lang in ('','".$lang."') order by value,".$dsi_bannette_notices_order;
314                } else {
315                        $req = "SELECT * FROM notices_fields_global_index
316                        WHERE id_notice IN (".$notices.")
317                        AND code_champ = ".$critere."   AND code_ss_champ = ".$ss_critere." AND lang in ('','".$lang."') order by value ";
318                }       
319               
320                //              print $req."<br>";
321                $res = pmb_mysql_query($req,$dbh);
322                if (pmb_mysql_num_rows($res)) {
323                        while($r=pmb_mysql_fetch_object($res)){
324                                $res_notice_ids["folder"][$r->value]["values"][]= $r->id_notice;
325                                $res_notice_ids["memo"][]= $r->id_notice;
326                        }
327                        foreach($notice_ids as $id_notice ){
328                                if(!in_array($id_notice,$res_notice_ids["memo"]))       $res_notice_ids["notfound"][]=$id_notice;
329                        }
330                        // Si encore une facette d'affinage, on fait du récursif       
331                        if(count($facettes_list)>1){   
332                                array_splice($facettes_list, 0,1);
333                                foreach($res_notice_ids["folder"] as $folder => $contens){
334                                        //printr($contens["values"]);
335                                        $res_notice_ids["folder"][$folder]= $this->filter_facettes_search($facettes_list, $contens["values"]);
336                                        //printr($res_notice_ids["folder"][$folder]);
337                                               
338                                        $res_notice_ids["folder"][$folder]["notfound_cumul"]=array();
339                                        foreach($res_notice_ids["folder"][$folder]["values"] as $value){
340                                                if(is_array($value["notfound"]))
341                                                        $res_notice_ids["folder"][$folder]["notfound_cumul"]=array_merge($res_notice_ids["folder"][$folder]["notfound_cumul"],$value["notfound"]);
342                                        }
343                                }
344                        }
345                }else{                         
346                        $res_notice_ids["notfound"]=$notice_ids;
347                }       
348                return $res_notice_ids;
349        }
350       
351        function filter_facettes_print($res_notice_ids, $rang=1,$notfound=array(),$gen_document=0,&$already_printed=array()){
352                global $dbh, $msg, $charset;
353                global $lang;
354               
355                if(count($res_notice_ids["notfound"])){
356                        $tpl.="<p$rang class='dsi_notices_no_class_rang_$rang'>";
357                        foreach($res_notice_ids["notfound"] as $notice_id){
358                                if( !in_array($notice_id, $notfound) )
359                                $tpl.="".$this->build_notice($notice_id)."<br />" ;
360                                $notfound[]=$notice_id;
361                        }
362                        $tpl.="</p$rang>";
363                }       
364               
365                if(is_array($res_notice_ids["folder"])){
366                       
367                        foreach($res_notice_ids["folder"] as $folder => $contens){
368                               
369                                if((!$gen_document && $this->bannette_display_notice_in_every_group) || ($gen_document && $this->bannette_display_notice_in_every_group  && $this->bannette_document_group)){
370                                        //on vide $already_printed pour afficher systèmatiquement la notice dans chaque groupe
371                                        $already_printed=array();
372                                }
373                               
374                                if(!sizeof($already_printed) || sizeof(array_diff($contens["values"],$already_printed))){
375
376                                        if($this->gen_summary && $rang==1){
377                                                $this->index++;
378                                                $this->summary.="<a href='#[".$this->index."]' class='summary_elt'>".htmlentities($this->index." - ".$folder,ENT_QUOTES,$charset)."</a><br />";
379                                                       
380                                                if(!$gen_document || ($gen_document && $this->bannette_document_group)){
381                                                        $tpl.="<a name='[".$this->index."]'></a><h1><h$rang class='dsi_rang_$rang'>".htmlentities($folder,ENT_QUOTES,$charset)."</h$rang>";
382                                                }
383                                        }else{
384                                                if(!$gen_document || ($gen_document && $this->bannette_document_group)){
385                                                        $tpl.="<h$rang class='dsi_rang_$rang'>".htmlentities($folder,ENT_QUOTES,$charset)."</h$rang>";
386                                                }
387                                        }
388                                       
389                                        $tpl.="<p$rang class='dsi_notices_rang_$rang'>";
390                                       
391                                        foreach($contens["values"] as $notice_id){
392                                                if(!in_array($notice_id,$already_printed)){
393                                                        $tpl.=$this->build_notice($notice_id)."<br />" ;
394                                                        if($gen_document && !$this->bannette_document_group){
395                                                                $tpl.="<div class='hr'><hr /></div>\r\n";
396                                                        }
397                                                        $already_printed[]=$notice_id;
398                                                }
399                                        }
400                                        if(count($contens["notfound"])){
401                                                foreach($contens["notfound"] as $notice_id){
402                                                        if( !in_array($notice_id, $notfound) )
403                                                                $tpl.=$this->build_notice($notice_id)."<br />" ;                                               
404                                                                $notfound[]=$notice_id;
405                                                }
406                                        }
407                                       
408                                        $tpl.="</p$rang>";
409                                       
410                                        //printr($contens["folder"]);
411                                        if(count($contens["folder"])){
412                                                $rang++;
413                                                // c'est une arborescence. Construction du titre
414                                                $tpl.=$this->filter_facettes_print($contens,$rang,$notfound,$gen_document,$already_printed);
415                                                $rang--;
416                                        }       
417                                }elseif(count($contens["folder"])){
418                                       
419                                        foreach($contens['folder'] as $folder2=>$values2){
420                                                if(!sizeof($already_printed) || sizeof(array_diff($values2["values"],$already_printed))){
421                                                        if($this->gen_summary && $rang==1){
422                                                                $this->index++;
423                                                                $this->summary.="<a href='#[".$this->index."]' class='summary_elt'>".htmlentities($this->index." - ".$folder,ENT_QUOTES,$charset)."</a><br />";
424                                                                       
425                                                                if(!$gen_document || ($gen_document && $this->bannette_document_group)){
426                                                                        $tpl.="<a name='[".$this->index."]'></a><h$rang class='dsi_rang_$rang'>".htmlentities($folder,ENT_QUOTES,$charset)."</h$rang>";
427                                                                }
428                                                        }else{
429                                                                if(!$gen_document || ($gen_document && $this->bannette_document_group)){
430                                                                        $tpl.="<h$rang class='dsi_rang_$rang'>".htmlentities($folder,ENT_QUOTES,$charset)."</h$rang>";
431                                                                }
432                                                        }
433                                                        break;
434                                                }
435                                        }
436                                       
437                                        $rang++;
438                                        // c'est une arborescence. Construction du titre
439                                        $tpl.=$this->filter_facettes_print($contens,$rang,$notfound,$gen_document,$already_printed);
440                                        $rang--;
441
442                                }       
443                        }       
444                }                       
445                //print $tpl;
446                return $tpl;
447        }
448       
449        function build_document_data($notice_ids,$notice_tpl=""){
450                $this->sommaires=array();
451                if($notice_tpl){
452                        $this->noti_tpl_document=new notice_tpl_gen($notice_tpl);
453                } else $this->noti_tpl_document="";
454                // paramétrage :
455                $this->environement["short"] = 6 ;
456                $this->environement["ex"] = 0 ;
457                $this->environement["exnum"] = 1 ;
458       
459                $facettes_list=$this->facettes;
460                $this->index=0;
461       
462                $res_notice_ids=$this->filter_facettes_search($facettes_list,$notice_ids);
463                $resultat_aff=$this->filter_facettes_data($res_notice_ids,1,array());
464                return $this->sommaires;
465        }
466       
467        function filter_facettes_data($res_notice_ids, $rang=1,$notfound=array(),$gen_document=0,&$already_printed=array()){
468                global $dbh, $msg, $charset;
469                global $lang;
470       
471                if(count($res_notice_ids["notfound"])){
472                        //$this->sommaires[$this->index]['level']=$rang;
473                        foreach($res_notice_ids["notfound"] as $notice_id){
474                                if( !in_array($notice_id, $notfound) )                                 
475                                        $this->sommaires[$this->index]['records'][]['render']=$charset!= "utf-8" ? utf8_encode($this->build_notice($notice_id)) : $this->build_notice($notice_id);                             
476                                $notfound[]=$notice_id;
477                        }
478                }       
479                if(is_array($res_notice_ids["folder"])){                               
480                        foreach($res_notice_ids["folder"] as $folder => $contens){
481       
482                                if((!$gen_document && $this->bannette_display_notice_in_every_group) || ($gen_document && $this->bannette_display_notice_in_every_group  && $this->bannette_document_group)){
483                                        //on vide $already_printed pour afficher systèmatiquement la notice dans chaque groupe
484                                        $already_printed=array();
485                                }       
486                                if(!sizeof($already_printed) || sizeof(array_diff($contens["values"],$already_printed))){                                       
487                                        $this->index++;
488                                        $this->sommaires[$this->index]['title']=$charset!= "utf-8" ? utf8_encode($folder) : $folder;
489                                        $this->sommaires[$this->index]['level']=$rang;                                                                                         
490                                        foreach($contens["values"] as $notice_id){
491                                                if(!in_array($notice_id,$already_printed)){
492                                                        $this->sommaires[$this->index]['records'][]['render']=$charset!= "utf-8" ? utf8_encode($this->build_notice($notice_id)) : $this->build_notice($notice_id);
493                                                        $already_printed[]=$notice_id;
494                                                }
495                                        }
496                                        if(count($contens["notfound"])){
497                                                foreach($contens["notfound"] as $notice_id){
498                                                        if( !in_array($notice_id, $notfound) )
499                                                        $this->sommaires[$this->index]['records'][]['render']=$charset!= "utf-8" ? utf8_encode($this->build_notice($notice_id)) : $this->build_notice($notice_id);
500                                                        $notfound[]=$notice_id;
501                                                }
502                                        }                                                                                       
503                                        //printr($contens["folder"]);
504                                        if(count($contens["folder"])){
505                                                $rang++;
506                                                // c'est une arborescence. Construction du titre
507                                                $this->filter_facettes_data($contens,$rang,$notfound,$gen_document,$already_printed);
508                                                $rang--;
509                                        }
510                                }elseif(count($contens["folder"])){
511                                               
512                                        foreach($contens['folder'] as $folder2=>$values2){
513                                                if(!sizeof($already_printed) || sizeof(array_diff($values2["values"],$already_printed))){
514                                                        $this->index++;
515                                                        $this->sommaires[$this->index]['title']=$charset!= "utf-8" ? utf8_encode($folder) : $folder;
516                                                        $this->sommaires[$this->index]['level']=$rang;                                         
517                                                        break;
518                                                }
519                                        }                                               
520                                        $rang++;
521                                        // c'est une arborescence. Construction du titre
522                                        $this->filter_facettes_data($contens,$rang,$notfound,$gen_document,$already_printed);
523                                        $rang--;
524       
525                                }
526                        }
527                }
528                return 0;
529        }       
530               
531}// end class
Note: See TracBrowser for help on using the repository browser.