source: pmb4.2/trunk/fuentes/pmb/classes/XMLlist.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: 10.0 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.32 2015-06-12 15:40:22 apetithomme 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        public $analyseur;
17        public $fichierXml;
18        public $fichierXmlSubst; // nom du fichier XML de substitution au cas où.
19        public $current;
20        public $table;
21        public $table_js;
22        public $tablefav;
23        public $flag_fav;
24        public $s;
25        public $flag_elt ; // pour traitement des entrées supprimées
26        public $flag_order;
27        public $order;
28        public $js_group;
29
30        // constructeur
31        function XMLlist($fichier, $s=1) {
32                $this->fichierXml = $fichier;
33                $this->fichierXmlSubst = str_replace(".xml", "", $fichier)."_subst.xml" ;
34                $this->s = $s;
35                $this->flag_order = false;             
36        }
37                               
38
39        //Méthodes
40        function debutBalise($parser, $nom, $attributs) {
41                global $_starttag; $_starttag=true;
42                if($nom == 'ENTRY' && $attributs['CODE'])
43                        $this->current = $attributs['CODE'];
44                if($nom == 'ENTRY' && $attributs['ORDER']) {
45                        $this->flag_order = true;
46                        $this->order[$attributs['CODE']] =  $attributs['ORDER'];
47                }       
48                if($nom == 'ENTRY' && $attributs['JS']){
49                        $this->js_group = $attributs['JS'];
50                }
51                if($nom == 'XMLlist') {
52                        $this->table = array();
53                        $this->fav = array();
54                }
55        }
56       
57        //Méthodes
58        function debutBaliseSubst($parser, $nom, $attributs) {
59                global $_starttag; $_starttag=true;
60                if($nom == 'ENTRY' && $attributs['CODE']) {
61                        $this->flag_elt = false ;
62                        $this->current = $attributs['CODE'];
63                }
64                if($nom == 'ENTRY' && $attributs['ORDER']) {
65                        $this->flag_order = true;
66                        $this->order[$attributs['CODE']] =  $attributs['ORDER'];
67                }
68                if($nom == 'ENTRY' && $attributs['JS']){
69                        $this->js_group = $attributs['JS'];
70                }
71                if($nom == 'ENTRY' && $attributs['FAV']) {
72                        $this->flag_fav =  $attributs['FAV'];
73                }
74        }
75       
76        function finBalise($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                $this->current = '';
82                $this->js_group = "";
83                }
84
85        function finBaliseSubst($parser, $nom) {
86                // ICI pour affichage des codes des messages en dur
87                if ($_COOKIE[SESSname."-CHECK-MESSAGES"]==1 && strpos($this->fichierXml, "messages")) {
88                        $this->table[$this->current] = "__".$this->current."**".$this->table[$this->current];
89                } 
90                if ((!$this->flag_elt) && ($nom=='ENTRY')) unset($this->table[$this->current]) ;
91                $this->current = '';
92                $this->js_group = "";
93                $this->flag_fav =  false;
94                }
95       
96        function texte($parser, $data) {
97                global $_starttag; 
98                if($this->current)
99                        if ($_starttag) {
100                                if($this->js_group){
101                                        $this->table_js[$this->js_group][$this->current] = $data;
102                                }else{
103                                        $this->table[$this->current] = $data;
104                                }
105                                $_starttag=false;
106                        } else {
107                                if($this->js_group){
108                                        $this->table_js[$this->js_group][$this->current].= $data;
109                                }else{
110                                        $this->table[$this->current] .= $data;
111                                }
112                        }
113                }
114
115        function texteSubst($parser, $data) {
116                global $_starttag; 
117                $this->flag_elt = true ;
118                if ($this->current) {
119                        if ($_starttag) {
120                                if($this->js_group){
121                                        $this->table_js[$this->js_group][$this->current] = $data;
122                                }else{
123                                        $this->table[$this->current] = $data;
124                                }
125                                $_starttag=false;
126                        } else {
127                                if($this->js_group){
128                                        $this->table_js[$this->js_group][$this->current].= $data;
129                                }else{
130                                        $this->table[$this->current] .= $data;
131                                }
132                        }
133                        if ($this->flag_fav) $this->tablefav[$this->current] = $this->flag_fav;
134                }
135        }
136       
137
138 // Modif Armelle Nedelec recherche de l'encodage du fichier xml et transformation en charset'
139        function analyser() 
140        {
141                global $charset;
142                global $base_path;
143                if (!($fp = @fopen($this->fichierXml, "r"))) {
144                        die("impossible d'ouvrir le fichier XML $this->fichierXml");
145                }
146                //vérification fichier pseudo-cache dans les temporaires
147                $fileInfo = pathinfo($this->fichierXml);
148                if($this->fichierXmlSubst && file_exists($this->fichierXmlSubst)){
149                        $tempFile = $base_path."/temp/XMLWithSubst".preg_replace("/[^a-z0-9]/i","",$fileInfo['dirname'].$fileInfo['filename'].$charset).".tmp";
150                        $with_subst=true;
151                }else{
152                        $tempFile = $base_path."/temp/XML".preg_replace("/[^a-z0-9]/i","",$fileInfo['dirname'].$fileInfo['filename'].$charset).".tmp";
153                        $with_subst=false;
154                }
155               
156                $dejaParse = false;
157                if(file_exists($tempFile)){
158                        //Le fichier XML original a-t-il été modifié ultérieurement ?
159                        if(filemtime($this->fichierXml)>filemtime($tempFile)){
160                                //on va re-générer le pseudo-cache
161                                unlink($tempFile);
162                        } else {
163                                //On regarde aussi si le fichier subst à été modifié après le fichier temp
164                                if($with_subst){
165                                        if(filemtime($this->fichierXmlSubst)>filemtime($tempFile)){
166                                                //on va re-générer le pseudo-cache
167                                                unlink($tempFile);
168                                        } else {
169                                                $dejaParse = true;
170                                        }
171                                }else{
172                                        $dejaParse = true;
173                                }
174                        }
175                }
176                if($dejaParse){
177                        fclose($fp);
178                        $tmp = fopen($tempFile, "r");
179                        $tables = unserialize(fread($tmp,filesize($tempFile)));
180                        if(count($tables)!= 3){
181                                unlink($tempFile);
182                                $this->analyser();
183                                return;
184                        }
185                        $this->table = $tables[0];
186                        $this->table_js = $tables[1];
187                        $this->tablefav = $tables[2];
188                        fclose($tmp);
189                } else {
190                        $this->table = array();
191                        $this->table_js = array();
192                        $this->tablefav = array();
193                        $file_size=filesize ($this->fichierXml);
194                        $data = fread ($fp, $file_size);
195       
196                        $rx = "/<?xml.*encoding=[\'\"](.*?)[\'\"].*?>/m";
197                        if (preg_match($rx, $data, $m)) $encoding = strtoupper($m[1]);
198                                else $encoding = "ISO-8859-1";
199                       
200                        $this->analyseur = xml_parser_create($encoding);
201                        xml_parser_set_option($this->analyseur, XML_OPTION_TARGET_ENCODING, $charset);         
202                        xml_parser_set_option($this->analyseur, XML_OPTION_CASE_FOLDING, true);
203                        xml_set_object($this->analyseur, $this);
204                        xml_set_element_handler($this->analyseur, "debutBalise", "finBalise");
205                        xml_set_character_data_handler($this->analyseur, "texte");
206               
207                        fclose($fp);
208       
209                        if ( !xml_parse( $this->analyseur, $data, TRUE ) ) {
210                                die( sprintf( "erreur XML %s à la ligne: %d ( $this->fichierXml )\n\n",
211                                xml_error_string(xml_get_error_code( $this->analyseur ) ),
212                                xml_get_current_line_number( $this->analyseur) ) );
213                        }
214       
215                        xml_parser_free($this->analyseur);
216       
217                        if ($fp = @fopen($this->fichierXmlSubst, "r")) {
218                                $file_sizeSubst=filesize ($this->fichierXmlSubst);
219                                if($file_sizeSubst) {
220                                        $data = fread ($fp, $file_sizeSubst);
221                                        fclose($fp);
222                                        $rx = "/<?xml.*encoding=[\'\"](.*?)[\'\"].*?>/m";
223                                        if (preg_match($rx, $data, $m)) $encoding = strtoupper($m[1]);
224                                                else $encoding = "ISO-8859-1";
225                                        $this->analyseur = xml_parser_create($encoding);
226                                        xml_parser_set_option($this->analyseur, XML_OPTION_TARGET_ENCODING, $charset);         
227                                        xml_parser_set_option($this->analyseur, XML_OPTION_CASE_FOLDING, true);
228                                        xml_set_object($this->analyseur, $this);
229                                        xml_set_element_handler($this->analyseur, "debutBaliseSubst", "finBaliseSubst");
230                                        xml_set_character_data_handler($this->analyseur, "texteSubst");
231                                        if ( !xml_parse( $this->analyseur, $data, TRUE ) ) {
232                                                die( sprintf( "erreur XML %s à la ligne: %d ( $this->fichierXmlSubst )\n\n",
233                                                xml_error_string(xml_get_error_code( $this->analyseur ) ),
234                                                xml_get_current_line_number( $this->analyseur) ) );
235                                                }
236                                        xml_parser_free($this->analyseur);
237                                }       
238                        }
239                        if ($this->s && is_array($this->table)) {
240                                reset($this->table);
241                                $tmp=array();
242                                $tmp=array_map("convert_diacrit",$this->table);//On enlève les accents
243                                $tmp=array_map("strtoupper",$tmp);//On met en majuscule
244                                asort($tmp);//Tri sur les valeurs en majuscule sans accent
245                                foreach ( $tmp as $key => $value ) {
246                                $tmp[$key]=$this->table[$key];//On reprend les bons couples clé / libellé
247                                }
248                                $this->table=$tmp;
249                        }
250                        if ($this->s && is_array($this->table_js)) {
251                                reset($this->table_js);
252                                $tmp=array();
253                                $tmp=array_map("convert_diacrit",$this->table_js);//On enlève les accents
254                                $tmp=array_map("strtoupper",$tmp);//On met en majuscule
255                                asort($tmp);//Tri sur les valeurs en majuscule sans accent
256                                foreach ( $tmp as $key => $value ) {
257                                        $tmp[$key]=$this->table_js[$key];//On reprend les bons couples clé / libellé
258                                }
259                                $this->table_js=$tmp;
260                        }
261                        if ($this->s && is_array($this->tablefav) && count($this->tablefav)) {
262                                reset($this->tablefav);
263                                $tmp=array();
264                                $tmp=array_map("convert_diacrit",$this->tablefav);//On enlève les accents
265                                $tmp=array_map("strtoupper",$tmp);//On met en majuscule
266                                asort($tmp);//Tri sur les valeurs en majuscule sans accent
267                                foreach ( $tmp as $key => $value ) {
268                                        $tmp[$key]=$this->tablefav[$key];//On reprend les bons couples clé / libellé
269                                }
270                                $this->tablefav=$tmp;
271                        }
272                        if($this->flag_order == true){
273                                $table_tmp = array();
274                                asort($this->order);
275                                foreach ($this->order as $key =>$value){
276                                        $table_tmp[$key] = $this->table[$key];
277                                        unset($this->table[$key]);
278                                }
279                                $this->table = $table_tmp + $this->table;//array_merge réécrivait les clés numériques donc problème.
280                                $table_tmp = array();
281                                asort($this->order);
282                                foreach ($this->order as $key =>$value){
283                                        $table_tmp[$key] = $this->table_js[$key];
284                                        unset($this->table_js[$key]);
285                                }
286                                $this->table_js = $table_tmp + $this->table_js;//array_merge réécrivait les clés numériques donc problème.
287                                if (count($this->tablefav)) {
288                                        $table_tmp = array();
289                                        asort($this->order);
290                                        foreach ($this->order as $key =>$value){
291                                                if (isset($this->tablefav[$key])) {
292                                                        $table_tmp[$key] = $this->tablefav[$key];
293                                                        unset($this->tablefav[$key]);
294                                                }
295                                        }
296                                        $this->tablefav = $table_tmp + $this->tablefav;//array_merge réécrivait les clés numériques donc problème.
297                                }
298                        }
299                       
300                        //on écrit le temporaire
301                        $tmp = fopen($tempFile, "wb");
302                        fwrite($tmp,serialize(array($this->table,$this->table_js,$this->tablefav)));
303                        fclose($tmp);
304                }
305        }
306}
307
308} # fin de définition
Note: See TracBrowser for help on using the repository browser.