source: pmb4.1/trunk/fuentes/pmb/classes/bannette_facettes.class.php @ 478

Last change on this file since 478 was 478, checked in by mabarracus, 4 years ago

copy trusty code 4.1

  • Property svn:executable set to *
File size: 12.6 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.14.2.3 2014-09-26 09:11:40 mbertin 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       
21        function bannette_facettes($id) {  // $id bannette
22                $this->id=$id+0;               
23                $this->fields_array = $this->fields_array();
24                $this->fetch_data();
25        }
26       
27        //recuperation de champs_base.xml
28        function fields_array(){
29                global $include_path,$msg;
30                global $dbh, $champ_base;
31       
32                if(!count($champ_base)) {
33                        $file = $include_path."/indexation/notices/champs_base_subst.xml";
34                        if(!file_exists($file)){
35                                $file = $include_path."/indexation/notices/champs_base.xml";
36                        }
37                        $fp=fopen($file,"r");
38                        if ($fp) {
39                                $xml=fread($fp,filesize($file));
40                        }
41                        fclose($fp);
42                        $champ_base=_parser_text_no_function_($xml,"INDEXATION");
43                }
44                return $champ_base;
45        }
46       
47        function fetch_data() {         
48                global $msg,$dbh,$charset;
49                $this->facettes=array();
50                $req="select * from bannette_facettes where num_ban_facette=". $this->id." order by ban_facette_order";
51                $res = mysql_query($req,$dbh);
52                $i=0;
53                if (mysql_num_rows($res)) {
54                        while($r=mysql_fetch_object($res)){
55                                $this->facettes[$i] = new stdClass();
56                                $this->facettes[$i]->critere=$r->ban_facette_critere;
57                                $this->facettes[$i]->ss_critere= $r->ban_facette_ss_critere;
58                                $this->facettes[$i]->order_sort= $r->ban_facette_order;
59                                $i++;
60                        }
61                }
62        }       
63       
64        function array_sort(){
65                global $msg;
66       
67                $array_sort = array();
68       
69                $nb = count($this->fields_array['FIELD']);
70                for($i=0;$i<$nb;$i++){
71                        if($tmp= $msg[$this->fields_array['FIELD'][$i]['NAME']]){
72                                $lib = $tmp;
73                        }else{
74                                $lib = $this->fields_array['FIELD'][$i]['NAME'];
75                        }
76                        $id2 = $this->fields_array['FIELD'][$i]['ID'] + 0;
77                        $array_sort[$id2] = $lib;
78                               
79                }
80                asort($array_sort);
81                return $array_sort;
82       
83        }
84       
85        function array_subfields($id){
86                global $msg,$charset;
87               
88                $array = $this->fields_array;
89                $array_subfields = array();
90                $bool_search = 0;
91                $i = 0;
92       
93                if($id!=100){
94                        while($bool_search==0){
95                                if($array['FIELD'][$i]['ID']==$id){
96                                        $isbd=$array['FIELD'][$i]['ISBD'];
97                                        $array = $array['FIELD'][$i]['TABLE'][0]['TABLEFIELD'];
98                                        $bool_search = 1;
99                                }
100                                $i++;
101                        }
102                        $size = count($array);
103                        for($i=0;$i<$size;$i++){
104                                if ($array[$i]['NAME']) $array_subfields[$array[$i]['ID']+0] = $msg[$array[$i]['NAME']];
105                        }
106                        if($isbd){
107                                $array_subfields[$isbd[0]['ID']+0]=$msg['facette_isbd'];
108                        }
109                }else{
110                        $req= mysql_query("select idchamp,titre from notices_custom order by titre asc");
111                        $j=0;
112                        while($rslt=mysql_fetch_object($req)){
113                                $array_subfields[$rslt->idchamp+0] = $rslt->titre;
114                                $j++;
115                        }
116                }
117                return $array_subfields;
118        }
119       
120        function delete(){
121                $del = "delete from bannette_facettes where num_ban_facette = '".$this->id."'";
122                mysql_query($del);
123        }
124       
125        function save(){
126                global $max_facette;
127               
128                $this->delete();
129               
130                $order=0;
131                for($i=0;$i<$max_facette;$i++){
132                        $critere = 'list_crit_'.$i;
133                        global $$critere;
134                        if($$critere > 0){
135                                $ss_critere = 'list_ss_champs_'.$i;
136                                global $$ss_critere;
137                                                               
138                                $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."' ";
139                                mysql_query($rqt);
140                                $order++;                               
141                        }                       
142                }               
143        }
144       
145        function add_ss_crit($suffixe_id,$id,$id_ss_champs=0){
146               
147                global $msg,$charset;           
148               
149                $id+=0;
150                $id_ss_champs+=0;               
151               
152                $array = $this->array_subfields($id);
153                $tab_ss_champs = array();
154                if(isset($suffixe_id)){
155                        $name_ss_champs="list_ss_champs_".$suffixe_id;
156                }else{
157                        $name_ss_champs="list_ss_champs";
158                }
159                $select_ss_champs.="<select id='$name_ss_champs' name='$name_ss_champs'>";
160               
161                if((count($array)>1)){
162                        foreach($array as $j=>$val2){
163                                if($id_ss_champs == $j) $select_ss_champs.="<option value=".$j." selected='selected'>".htmlentities($val2,ENT_QUOTES,$charset)."</option>";
164                                else $select_ss_champs.="<option value=".$j.">".htmlentities($val2,ENT_QUOTES,$charset)."</option>";
165                        }
166               
167                        $select_ss_champs.="</select></br>";
168                        return $select_ss_champs;
169                }elseif(count($array)==1){
170                        foreach($array as $j=>$val2){
171                                $select_ss_champs = "<input type='hidden' name='$name_ss_champs' value='1'/>";
172                        }
173                        return $select_ss_champs;
174                }
175        }
176       
177        function add_facette($i_field){
178                global $tpl_facette_elt_ajax;
179               
180       
181                $array = $this->array_sort();
182                $tpl = $tpl_facette_elt_ajax;
183
184                $i=0;
185                foreach ($array as $id => $value) {
186                        if(!$i){
187                                $select.="<option value=".$id." selected='selected'>".$value."</option>";
188                        } else {
189                                $select.="<option value=".$id.">".$value."</option>";
190                        }
191                }
192                $tpl = str_replace('!!i_field!!', $i_field, $tpl);
193                $tpl = str_replace("!!liste1!!",$select,$tpl);
194                $tpl = str_replace("!!id_bannette!!",$this->id,$tpl);
195                return $tpl;
196        }       
197       
198        function gen_facette_selection(){
199                global $dsi_facette_tpl;
200                global $tpl_facette_elt;
201       
202                $array = $this->array_sort();
203                               
204                $tpls=$dsi_facette_tpl;         
205                $nb=count($this->facettes);
206                if(!$nb)$nb++;
207               
208                for ($i=0 ; $i<$nb; $i++){
209                        $tpl = $tpl_facette_elt;
210                       
211                        $tpl = str_replace('!!i_field!!', $i, $tpl);
212                        $tpl = str_replace('!!ss_crit!!', $this->facettes[$i]->ss_critere, $tpl);
213                        $select="";                                                             
214                        foreach ($array as $id => $value) {
215                                if( $id==$this->facettes[$i]->critere){
216                                        $select.="<option value=".$id." selected='selected'>".$value."</option>";
217                                } else {
218                                        $select.="<option value=".$id.">".$value."</option>";
219                                }
220                        }                               
221                        $tpl = str_replace("!!liste1!!",$select,$tpl);
222                        $facettes_tpl.=$tpl;
223                }
224                               
225                $tpls = str_replace("!!facettes!!",$facettes_tpl,$tpls);
226                $tpls = str_replace("!!max_facette!!",$nb,$tpls);
227                $tpls = str_replace("!!id_bannette!!",$this->id,$tpls);
228
229                return $tpls;
230        }
231       
232        function build_document($notice_ids,$notice_tpl="",$gen_summary=0){
233               
234                if($notice_tpl){
235                        $this->noti_tpl_document=new notice_tpl_gen($notice_tpl);
236                } else $this->noti_tpl_document="";
237                // paramétrage :
238                $this->environement["short"] = 6 ;
239                $this->environement["ex"] = 0 ;
240                $this->environement["exnum"] = 1 ;
241               
242                $facettes_list=$this->facettes;
243                $this->gen_summary=$gen_summary;
244                $this->summary="";
245                $this->index=0;
246               
247                $res_notice_ids=$this->filter_facettes_search($facettes_list,$notice_ids);
248                $resultat_aff=$this->filter_facettes_print($res_notice_ids);
249               
250                if($this->gen_summary) $resultat_aff="<A NAME='SUMMARY'></A><div class='summary'><br />".$this->summary."</div>".$resultat_aff;
251               
252                return $resultat_aff;           
253        }
254       
255        function build_notice($notice_id){
256                global $deflt2docs_location,$url_base_opac;
257               
258                global $use_opac_url_base; $use_opac_url_base=1;
259                global $use_dsi_diff_mode; $use_dsi_diff_mode=1;
260                if($this->noti_tpl_document) {
261                        $tpl_document=$this->noti_tpl_document->build_notice($notice_id,$deflt2docs_location);
262                }
263                if(!$tpl_document) {
264                        $n=mysql_fetch_object(@mysql_query("select * from notices where notice_id=".$notice_id));
265                        if ($n->niveau_biblio == 'm'|| $n->niveau_biblio == 'b') {
266                                $mono=new mono_display($n,$this->environement["short"],"",$this->environement["ex"],"","","",0,1,$this->environement["exnum"],0,"",0,true,false);
267                                $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";
268                                $tpl_document.= $mono->isbd;
269                        } elseif ($n->niveau_biblio == 's' || $n->niveau_biblio == 'a') {
270                                $serial = new serial_display($n, 6, "", "", "", "", "", 0,1,$this->environement["exnum"],0, false );
271                                $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";
272                                $tpl_document.= $serial->isbd;
273                        }
274                        $tpl_document=str_replace('<!-- !!avis_notice!! -->', "", $tpl_document);
275                        global $notice_separator;
276                        if($notice_separator)$tpl_document.=$notice_separator;
277                        else $tpl_document.="<div class='hr'><hr /></div>";
278                }
279                 return $tpl_document."\r\n";
280        }
281               
282        function filter_facettes_search($facettes_list,$notice_ids){
283                global $dbh;
284                global $lang;
285                global $msg;
286                global $dsi_bannette_notices_order ;
287
288                $notices=implode(",",$notice_ids);
289                $res_notice_ids=array();
290                $res_notice_ids["values"]=array();
291                $res_notice_ids["notfound"]=array();
292                       
293                $critere= $facettes_list[0]->critere;
294                $ss_critere= $facettes_list[0]->ss_critere;
295       
296                if ($dsi_bannette_notices_order) {
297                        $req = "SELECT * FROM notices_fields_global_index LEFT JOIN notices on (id_notice=notice_id)
298                        WHERE id_notice IN (".$notices.")
299                        AND code_champ = ".$critere."   AND code_ss_champ = ".$ss_critere." AND lang in ('','".$lang."') order by value,".$dsi_bannette_notices_order;
300                } else {
301                        $req = "SELECT * FROM notices_fields_global_index
302                        WHERE id_notice IN (".$notices.")
303                        AND code_champ = ".$critere."   AND code_ss_champ = ".$ss_critere." AND lang in ('','".$lang."') order by value ";
304                }       
305               
306                //              print $req."<br>";
307                $res = mysql_query($req,$dbh);
308                if (mysql_num_rows($res)) {
309                        while($r=mysql_fetch_object($res)){
310                                $res_notice_ids["folder"][$r->value]["values"][]= $r->id_notice;
311                                $res_notice_ids["memo"][]= $r->id_notice;
312                        }
313                        foreach($notice_ids as $id_notice ){
314                                if(!in_array($id_notice,$res_notice_ids["memo"]))       $res_notice_ids["notfound"][]=$id_notice;
315                        }
316                        // Si encore une facette d'affinage, on fait du récursif       
317                        if(count($facettes_list)>1){   
318                                array_splice($facettes_list, 0,1);
319                                foreach($res_notice_ids["folder"] as $folder => $contens){
320                                        //printr($contens["values"]);
321                                        $res_notice_ids["folder"][$folder]= $this->filter_facettes_search($facettes_list, $contens["values"]);
322                                        //printr($res_notice_ids["folder"][$folder]);
323                                               
324                                        $res_notice_ids["folder"][$folder]["notfound_cumul"]=array();
325                                        foreach($res_notice_ids["folder"][$folder]["values"] as $value){
326                                                if(is_array($value["notfound"]))
327                                                        $res_notice_ids["folder"][$folder]["notfound_cumul"]=array_merge($res_notice_ids["folder"][$folder]["notfound_cumul"],$value["notfound"]);
328                                        }
329                                }
330                        }
331                }else{                         
332                        $res_notice_ids["notfound"]=$notice_ids;
333                }       
334                return $res_notice_ids;
335        }
336       
337               
338        function filter_facettes_print($res_notice_ids, $rang=1,$notfound=array()){
339                global $dbh, $msg, $charset;
340                global $lang;
341                //$notfound=array();   
342                //printr($res_notice_ids);
343                if(count($res_notice_ids["notfound"])){
344                        $tpl.="<p$rang class='dsi_notices_no_class_rang_$rang'>";
345                        foreach($res_notice_ids["notfound"] as $notice_id){
346                                if( !in_array($notice_id, $notfound) )
347                                $tpl.="".$this->build_notice($notice_id)."<br />" ;
348                                $notfound[]=$notice_id;
349                        }
350                        $tpl.="</p$rang>";
351                }       
352               
353                if(is_array($res_notice_ids["folder"])){
354                        foreach($res_notice_ids["folder"] as $folder => $contens){                     
355                                        if($this->gen_summary && $rang==1){
356                                                $this->index++;
357                                                $this->summary.="<a href='#[".$this->index."]' class='summary_elt'>".htmlentities($this->index." - ".$folder,ENT_QUOTES,$charset)."</a><br />";
358                                                $tpl.="<a name='[".$this->index."]'></a><h$rang class='dsi_rang_$rang'>".htmlentities($folder,ENT_QUOTES,$charset)."</h$rang>
359                                                <p$rang class='dsi_notices_rang_$rang'>";
360                                        }else{
361                                                $tpl.="<h$rang class='dsi_rang_$rang'>".htmlentities($folder,ENT_QUOTES,$charset)."</h$rang>
362                                                <p$rang class='dsi_notices_rang_$rang'>";
363                                        }
364                                        foreach($contens["values"] as $notice_id){
365                                                $tpl.=$this->build_notice($notice_id)."<br />" ;
366                                        }
367                                        if(count($contens["notfound"]))
368                                        foreach($contens["notfound"] as $notice_id){
369                                                if( !in_array($notice_id, $notfound) )
370                                                        $tpl.=$this->build_notice($notice_id)."<br />" ;                                               
371                                                        $notfound[]=$notice_id;
372                                        }
373                                        $tpl.="</p$rang>";
374                                       
375                                        //printr($contens["folder"]);
376                                        if(count($contens["folder"])){
377                                                $rang++;
378                                                // c'est une arborescence. Construction du titre
379                                                $tpl.=$this->filter_facettes_print($contens,$rang,$notfound);
380                                                $rang--;
381                                        }       
382                        }       
383                }                       
384                //print $tpl;
385                return $tpl;
386        }
387       
388               
389}// end class
Note: See TracBrowser for help on using the repository browser.