source: pmb4.1/trunk/fuentes/pmb/classes/XMLlist.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: 7.4 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: XMLlist.class.php,v 1.26 2014-01-29 15:47:53 mbertin Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9// classe de gestion des documents XML
10
11if ( ! defined( 'XML_LIST_CLASS' ) ) {
12  define( 'XML_LIST_CLASS', 1 );
13
14class XMLlist {
15       
16        var $analyseur;
17        var $fichierXml;
18        var $fichierXmlSubst; // nom du fichier XML de substitution au cas où.
19        var $current;
20        var $table;
21        var $tablefav;
22        var $flag_fav;
23        var $s;
24        var $flag_elt ; // pour traitement des entrées supprimées
25        var $flag_order;
26        var $order;
27
28        // constructeur
29        function XMLlist($fichier, $s=1) {
30                $this->fichierXml = $fichier;
31                $this->fichierXmlSubst = str_replace(".xml", "", $fichier)."_subst.xml" ;
32                $this->s = $s;
33                $this->flag_order = false;             
34        }
35                               
36
37        //Méthodes
38        function debutBalise($parser, $nom, $attributs) {
39                global $_starttag; $_starttag=true;
40                if($nom == 'ENTRY' && $attributs['CODE'])
41                        $this->current = $attributs['CODE'];
42                if($nom == 'ENTRY' && $attributs['ORDER']) {
43                        $this->flag_order = true;
44                        $this->order[$attributs['CODE']] =  $attributs['ORDER'];
45                        }                       
46                if($nom == 'XMLlist') {
47                        $this->table = array();
48                        $this->fav = array();
49                }
50        }
51       
52        //Méthodes
53        function debutBaliseSubst($parser, $nom, $attributs) {
54                global $_starttag; $_starttag=true;
55                if($nom == 'ENTRY' && $attributs['CODE']) {
56                        $this->flag_elt = false ;
57                        $this->current = $attributs['CODE'];
58                        }
59                if($nom == 'ENTRY' && $attributs['ORDER']) {
60                        $this->flag_order = true;
61                        $this->order[$attributs['CODE']] =  $attributs['ORDER'];
62                        }
63                if($nom == 'ENTRY' && $attributs['FAV']) {
64                        $this->flag_fav =  $attributs['FAV'];
65                        }
66        }
67       
68        function finBalise($parser, $nom) {
69                // ICI pour affichage des codes des messages en dur
70                if ($_COOKIE[SESSname."-CHECK-MESSAGES"]==1 && strpos($this->fichierXml, "messages")) {
71                        $this->table[$this->current] = "__".$this->current."**".$this->table[$this->current];
72                } 
73                $this->current = '';
74                }
75
76        function finBaliseSubst($parser, $nom) {
77                // ICI pour affichage des codes des messages en dur
78                if ($_COOKIE[SESSname."-CHECK-MESSAGES"]==1 && strpos($this->fichierXml, "messages")) {
79                        $this->table[$this->current] = "__".$this->current."**".$this->table[$this->current];
80                } 
81                if ((!$this->flag_elt) && ($nom=='ENTRY')) unset($this->table[$this->current]) ;
82                $this->current = '';
83                $this->flag_fav =  false;
84                }
85       
86        function texte($parser, $data) {
87                global $_starttag; 
88                if($this->current)
89                        if ($_starttag) {
90                                $this->table[$this->current] = $data;
91                                $_starttag=false;
92                        } else $this->table[$this->current] .= $data;
93                }
94
95        function texteSubst($parser, $data) {
96                global $_starttag; 
97                $this->flag_elt = true ;
98                if ($this->current) {
99                        if ($_starttag) {
100                                $this->table[$this->current] = $data;
101                                $_starttag=false;
102                        } else $this->table[$this->current] .= $data;
103                        $this->tablefav[$this->current] = $this->flag_fav;
104                }
105        }
106       
107
108 // Modif Armelle Nedelec recherche de l'encodage du fichier xml et transformation en charset'
109        function analyser() 
110        {
111                global $charset;
112                global $base_path;
113                if (!($fp = @fopen($this->fichierXml, "r"))) {
114                        die("impossible d'ouvrir le fichier XML $this->fichierXml");
115                }
116                //vérification fichier pseudo-cache dans les temporaires
117                $fileInfo = pathinfo($this->fichierXml);
118                if($this->fichierXmlSubst && file_exists($this->fichierXmlSubst)){
119                        $tempFile = $base_path."/temp/XMLWithSubst".preg_replace("/[^a-z0-9]/i","",$fileInfo['dirname'].$fileInfo['filename'].$charset).".tmp";
120                        $with_subst=true;
121                }else{
122                        $tempFile = $base_path."/temp/XML".preg_replace("/[^a-z0-9]/i","",$fileInfo['dirname'].$fileInfo['filename'].$charset).".tmp";
123                        $with_subst=false;
124                }
125               
126                $dejaParse = false;
127                if(file_exists($tempFile)){
128                        //Le fichier XML original a-t-il été modifié ultérieurement ?
129                        if(filemtime($this->fichierXml)>filemtime($tempFile)){
130                                //on va re-générer le pseudo-cache
131                                unlink($tempFile);
132                        } else {
133                                //On regarde aussi si le fichier subst à été modifié après le fichier temp
134                                if($with_subst){
135                                        if(filemtime($this->fichierXmlSubst)>filemtime($tempFile)){
136                                                //on va re-générer le pseudo-cache
137                                                unlink($tempFile);
138                                        } else {
139                                                $dejaParse = true;
140                                        }
141                                }else{
142                                        $dejaParse = true;
143                                }
144                        }
145                }
146                if($dejaParse){
147                        fclose($fp);
148                        $tmp = fopen($tempFile, "r");
149                        $this->table = unserialize(fread($tmp,filesize($tempFile)));
150                        fclose($tmp);
151                } else {
152                        $file_size=filesize ($this->fichierXml);
153                        $data = fread ($fp, $file_size);
154       
155                        $rx = "/<?xml.*encoding=[\'\"](.*?)[\'\"].*?>/m";
156                        if (preg_match($rx, $data, $m)) $encoding = strtoupper($m[1]);
157                                else $encoding = "ISO-8859-1";
158                       
159                        $this->analyseur = xml_parser_create($encoding);
160                        xml_parser_set_option($this->analyseur, XML_OPTION_TARGET_ENCODING, $charset);         
161                        xml_parser_set_option($this->analyseur, XML_OPTION_CASE_FOLDING, true);
162                        xml_set_object($this->analyseur, $this);
163                        xml_set_element_handler($this->analyseur, "debutBalise", "finBalise");
164                        xml_set_character_data_handler($this->analyseur, "texte");
165               
166                        fclose($fp);
167       
168                        if ( !xml_parse( $this->analyseur, $data, TRUE ) ) {
169                                die( sprintf( "erreur XML %s à la ligne: %d ( $this->fichierXml )\n\n",
170                                xml_error_string(xml_get_error_code( $this->analyseur ) ),
171                                xml_get_current_line_number( $this->analyseur) ) );
172                        }
173       
174                        xml_parser_free($this->analyseur);
175       
176                        if ($fp = @fopen($this->fichierXmlSubst, "r")) {
177                                $file_sizeSubst=filesize ($this->fichierXmlSubst);
178                                if($file_sizeSubst) {
179                                        $data = fread ($fp, $file_sizeSubst);
180                                        fclose($fp);
181                                        $rx = "/<?xml.*encoding=[\'\"](.*?)[\'\"].*?>/m";
182                                        if (preg_match($rx, $data, $m)) $encoding = strtoupper($m[1]);
183                                                else $encoding = "ISO-8859-1";
184                                        $this->analyseur = xml_parser_create($encoding);
185                                        xml_parser_set_option($this->analyseur, XML_OPTION_TARGET_ENCODING, $charset);         
186                                        xml_parser_set_option($this->analyseur, XML_OPTION_CASE_FOLDING, true);
187                                        xml_set_object($this->analyseur, $this);
188                                        xml_set_element_handler($this->analyseur, "debutBaliseSubst", "finBaliseSubst");
189                                        xml_set_character_data_handler($this->analyseur, "texteSubst");
190                                        if ( !xml_parse( $this->analyseur, $data, TRUE ) ) {
191                                                die( sprintf( "erreur XML %s à la ligne: %d ( $this->fichierXmlSubst )\n\n",
192                                                xml_error_string(xml_get_error_code( $this->analyseur ) ),
193                                                xml_get_current_line_number( $this->analyseur) ) );
194                                                }
195                                        xml_parser_free($this->analyseur);
196                                }       
197                        }
198                        if ($this->s && is_array($this->table)) {
199                                reset($this->table);
200                                $tmp=array();
201                                $tmp=array_map("convert_diacrit",$this->table);//On enlève les accents
202                                $tmp=array_map("strtoupper",$tmp);//On met en majuscule
203                                asort($tmp);//Tri sur les valeurs en majuscule sans accent
204                                foreach ( $tmp as $key => $value ) {
205                                $tmp[$key]=$this->table[$key];//On reprend les bons couples clé / libellé
206                                }
207                                $this->table=$tmp;
208                        }
209                        if($this->flag_order == true){
210                                $table_tmp = array();
211                                asort($this->order);
212                                foreach ($this->order as $key =>$value){
213                                        $table_tmp[$key] = $this->table[$key];
214                                        unset($this->table[$key]);
215                                }
216                                $this->table = $table_tmp + $this->table;//array_merge réécrivait les clés numériques donc problème.
217                        }
218                        //on écrit le temporaire
219                        $tmp = fopen($tempFile, "wb");
220                        fwrite($tmp,serialize($this->table));
221                        fclose($tmp);
222                }
223        }
224}
225
226} # fin de définition
Note: See TracBrowser for help on using the repository browser.