source: spip-zone/_plugins_/comarquage/trunk/inc/comarquage.php @ 74660

Last change on this file since 74660 was 74660, checked in by pierrekuhn82@…, 7 years ago

Correction d'un bogue signaler ici http://contrib.spip.net/Comarquage-Service-public-Flux-v2#forum469967
Incrément

File size: 12.4 KB
Line 
1<?php
2
3/* Plugin Comarquage -flux V2- pour SPIP 1.9
4 * Copyright (C) 2006 Cedric Morin
5 * Copyright (C) 2010 Vernalis Interactive
6 *
7 * Licence GPL
8 *
9 */
10if (!defined("_ECRIRE_INC_VERSION")) return;
11
12
13if (!defined('_DIR_PLUGIN_COMARQUAGE')){
14        $p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(dirname(__FILE__)))));
15        define('_DIR_PLUGIN_COMARQUAGE',(_DIR_PLUGINS.end($p)).'/');
16}
17
18define('_DIR_PLUGIN_COMARQUAGE_IMAGES',_DIR_PLUGIN_COMARQUAGE."images");
19// atention, ces 2 constantes ne sont pas utilisees partout
20// on utilise sous_repertoire(_DIR_CACHE,'cache') et sous_repertoire(_DIR_CACHE,'xml')
21// pour assurer la creation des repertoires
22define('_DIR_CACHE_COMARQUAGE_XML',"comarq_xml"); // sous repertoire de _DIR_CACHE
23define('_DIR_CACHE_COMARQUAGE_CACHE',"comarq_cache");// sous repertoire de _DIR_CACHE
24
25include_spip('inc/config');
26
27
28$local_refresh = lire_config('comarquage/local_refresh');
29if (!isset($local_refresh)) {
30        ecrire_config('comarquage/local_refresh','259200'); /* 60*60*24*3 */
31}
32$local_timeout = lire_config('comarquage/local_timeout');
33if (!isset($local_timeout)){
34        ecrire_config('comarquage/local_timeout','604800'); /* 60*60*24*7 */
35}
36
37$default_xml_file = lire_config('comarquage/default_xml_file');
38if (!isset($default_xml_file)){
39        ecrire_config('comarquage/default_xml_file','Themes.xml');
40}
41
42$default_xsl_file = lire_config('comarquage/default_xsl_file');
43if (!isset($default_xsl_file)){
44        ecrire_config('comarquage/default_xsl_file','spThemes.xsl');
45}
46
47
48// recuperer le contenu compile d'une page xml
49function & comarquage_compile_page_xml($parametres,$url_base){
50        global $type_urls;
51        // regarder si la page parsee est en cache et valide
52        comarquage_prepare_parametres_cache($parametres,$url_base);
53        if ($ma_page =& comarquage_lire_cache($parametres))
54          return $ma_page;
55
56        // sinon la parser
57
58        // s'assurer que la feuille de style est bien la
59        if (!file_exists($parametres['xsl_full_path'])) {
60                comarquage_error("la feuille de style XSL '$parametres[xsl]' n'existe pas");
61                return -10;
62        }
63
64        // rapatrier tous les fichiers xml necessaires au parsing
65        // fichier principal + dependances
66        if (!comarquage_prepare_fichiers_xml($parametres))  {
67                spip_log("Erreur du rapatriement des fichiers",'comarquage');
68                return -20;
69
70        }
71
72
73        /*----------------------------------------
74         *  definir les parametres xsl
75         */
76        $parametres_xsl = array();
77        $parametres_xsl['IMAGESURL'] = $parametres_xsl['SITEURL'].'/'._DIR_PLUGIN_COMARQUAGE_IMAGES;
78
79        if (isset($parametres['lettre']))       $parametres_xsl['LETTRE'] = $parametres['lettre'];
80        if (isset($parametres['motcle'])) $parametres_xsl['MOTCLE'] = $parametres['motcle'];
81
82        /* Réglage pour l'URL */
83        $parametres_xsl['REFERER'] = $GLOBALS['REQUEST_URI'];
84        // spip_log("REFERER 1 : ".$parametres_xsl['REFERER'],"comarquage");
85        $parametres_xsl['REFERER'] = parametre_url($parametres_xsl['REFERER'],"var_mode",'','&');
86        $parametres_xsl['REFERER'] = parametre_url($parametres_xsl['REFERER'],"xml",'','&'); // on enlève les paramètres d'url
87        // spip_log("REFERER 2 : ".$parametres_xsl['REFERER'],"comarquage");
88        $parametres_xsl['REFERER'] = parametre_url($parametres_xsl['REFERER'],"xsl",'','&');
89        // spip_log("REFERER 3 : ".$parametres_xsl['REFERER'],"comarquage");
90        //$parametres_xsl['REFERER'] = $GLOBALS['REQUEST_URI'].'?&' ; // url principale du comarquage
91
92        // Si un autre jeu d'URL est utilisé (propre), on ajoute l'esperluette
93        if ($type_urls == "page") $parametres_xsl['REFERER'] .= '&';
94        else $parametres_xsl['REFERER'] .= '?&';
95
96
97        // MODIF VI :  REFERER / PICTOS / SITEURL / IMAGES / PIVOTS / XMLURL / CATEGORIE
98        $parametres_xsl['SITEURL'] = lire_meta("adresse_site" );
99        $parametres_xsl['PICTOS'] = $parametres_xsl['SITEURL'].'/'._DIR_PLUGIN_COMARQUAGE_IMAGES; // url des picto (web, téléphone, ...)
100        $parametres_xsl['IMAGES'] = $parametres_xsl['SITEURL'].'/'._DIR_PLUGIN_COMARQUAGE_IMAGES.'/'; // URL des images
101        $parametres_xsl['PIVOTS'] = 'mairie'; // pivots locaux
102        $parametres_xsl['XMLURL'] = 'http://lecomarquage.service-public.fr/xml2v2/'; // url des données XML du comarquage
103        $parametres_xsl['CATEGORIE'] = $parametres['categorie']; // particuliers, associations ou entreprises
104
105        switch ($parametres_xsl['CATEGORIE']) {
106                case "particuliers":
107                        $parametres_xsl['XMLURL'] = "http://lecomarquage.service-public.fr/xml2v2/";
108                break;
109
110                case "associations":
111                        $parametres_xsl['XMLURL'] = "http://lecomarquage.service-public.fr/xmlassov2/";
112                break;
113
114                case 'entreprises':
115                        $parametres_xsl['XMLURL'] = "http://lecomarquage.service-public.fr/xmlpmev2/";
116                break;
117
118                default:
119                        $parametres_xsl['XMLURL'] = "http://lecomarquage.service-public.fr/xml2v2/";
120                break;
121        }
122
123        $ma_page =& comarquage_transforme_fichier_xml($parametres['xml_full_path'],$parametres['xsl_full_path'], $parametres_xsl);
124        if ($ma_page === FALSE) {
125                comarquage_error("le processeur XSLT a retourné une erreur fatale; l'action ne peut pas continuer");
126                return -40;
127        }
128
129        $ma_page = implode("\n", $ma_page)."\n";
130        // ecrire le fichier cache pour le prochain coup
131        ecrire_fichier ($parametres['cache_full_path'], $ma_page);
132
133        return $ma_page;
134}
135
136// rapatrier tout le contenu necessaire pour effectuer le rendu
137function comarquage_prepare_fichiers_xml($parametres, $profondeur = 2){
138        static $parsed=array();
139        if (isset($parsed[$parametres['xml_full_path']]))
140                return $parsed[$parametres['xml_full_path']];
141
142        $ma_page ="";
143        $mise_a_jour = comarquage_lire_xml($parametres, $ma_page);
144        if ($mise_a_jour == FALSE){
145                $parsed[$parametres['xml_full_path']] = FALSE;
146                return FALSE;
147        }
148        $parsed[$parametres['xml_full_path']] = TRUE;
149
150
151        if ($profondeur>0 && $mise_a_jour !==FALSE && $parametres['xml']{0} != 'M') {
152                $liste_ressources = comarquage_extraire_ressources($parametres['xml_full_path'], $ma_page);
153
154
155    if ($liste_ressources !== FALSE)
156                        foreach ($liste_ressources as $v){
157                                $pars = array_merge($parametres, array('xml' => $v,'xml_full_path' => dirname($parametres['xml_full_path']).'/'.$v));
158                                comarquage_prepare_fichiers_xml($pars, $profondeur-1);
159                        }
160
161                if ($liste_ressources === FALSE) {
162                        comarquage_error("impossible de recuperer les ressources associees au fichier $parametres[xml_full_path]");
163                        return FALSE;
164                }
165
166  }
167
168        return TRUE;
169}
170
171
172// recuperer toutes les ressouces associees a un fichier xml,  inutile pour les flux v2
173// dans un tableau
174function comarquage_extraire_ressources($fichier_xml, $ma_page){
175        $liste_ressources=array();
176        include_spip('inc/plugin');
177        include_spip('inc/filtres');
178        include_spip('inc/xml');
179        $arbre = spip_xml_parse($ma_page);
180        if (is_array($arbre)){
181                $arbre = reset($arbre); // prendre le noeud racine
182                $arbre = $arbre[0];
183                if (isset($arbre['Fils']))
184                        foreach($arbre['Fils'] as $subtree)
185                                foreach($subtree as $tag=>$val){
186                                        $f = extraire_attribut("<$tag>",'lien');
187                                        $f = basename($f,'.xml').'.xml';
188                                        $liste_ressources[]=$f;
189                                }
190        }
191        // spip_log("*********************** DEBUT liste ressource","comarquage");
192        // spip_log($liste_ressources,"comarquage");
193        // spip_log("*********************** FIN liste ressource","comarquage");
194        return $liste_ressources;
195}
196
197function & comarquage_transforme_fichier_xml($fichier_xml, $fichier_xsl = NULL, $parametres = NULL){
198        static $_executable = 'xsltproc';
199
200
201        $params = " --path "._DIR_CACHE._DIR_CACHE_COMARQUAGE_XML."/ ";
202        if (is_array($parametres))
203                foreach ($parametres as $k => $v) {
204                        $params .= '--stringparam '.escapeshellarg($k).' '.escapeshellarg($v).' ';
205                }
206//               spip_log("<br><br>\n\nPAR'AM : $params","comarquage");
207
208
209        $fichier_erreur = tempnam('/tmp', 'xsltprocErrors_');
210        $commande = $_executable . $params . ($fichier_xsl ? $fichier_xsl.' ' : '');
211        $commande .= $fichier_xml;
212        $commande .=  " 2> $fichier_erreur";
213
214        // spip_log("commande XSLTPROC : ".$commande,"comarquage");
215
216        exec($commande, $retour, $erreur_code);
217
218        comarquage_error($commande);
219
220        if (filesize($fichier_erreur)) {
221                lire_fichier($fichier_erreur,$message);
222                comarquage_error("la commande '$_executable $params' a retourné ($erreur_code) : $message");
223        }
224
225        unlink($fichier_erreur);
226        return $erreur_code ? FALSE : $retour;
227}
228
229// definir le nom du fichier de stockage de la page en cache
230function comarquage_prepare_parametres_cache(& $parametres,$url_base){
231        spip_log("Paramètre avant comarquage_prepare_parametres_cache","comarquage");
232        spip_log($parametres,"comarquage");
233
234        $cache_id = '';
235        if (isset($parametres['lettre'])) $cache_id .= 'l'.$parametres['lettre'];
236        if (isset($parametres['motcle'])) $cache_id .= 'm'.md5($parametres['motcle']);
237        $cache_id .= md5($url_base.$parametres['categorie']);
238
239        $parametres['cache_full_path'] = sous_repertoire(_DIR_CACHE,_DIR_CACHE_COMARQUAGE_CACHE).
240                basename($parametres['xml'], '.xml').
241                ($cache_id ? '.'.$cache_id : '').'.cache';
242
243                spip_log("Paramètre APRES comarquage_prepare_parametres_cache","comarquage");
244                spip_log($parametres,"comarquage");
245}
246
247// lire le fichier xml parse en cache
248function & comarquage_lire_cache($parametres) {
249        $fichier = $parametres['cache_full_path'];
250        if (file_exists($fichier)
251                && ($t = filemtime($fichier))
252                && (time()-$t < $GLOBALS['meta']['comarquage_local_timeout'])
253                && ($t > filemtime($parametres['xml_full_path']))
254                && ($t > filemtime(dirname($parametres['xsl_full_path'])))
255                ) {
256
257                $ma_page = "";
258                if (lire_fichier ($fichier, $ma_page))
259                        return $ma_page;
260        }
261
262        return FALSE;
263}
264
265function & comarquage_lire_xml($parametres, &$ma_page) {
266        $fichier = $parametres['xml_full_path'];
267        // on ne recharge pas la page ici du moment qu'elle n'est pas trop vieille
268        // la reactualisation des pages est réalisée preferentiellement par tache cron
269        if (($ok = file_exists($parametres['xml_full_path'])) &&
270                time() - filemtime($parametres['xml_full_path']) < $GLOBALS['meta']['comarquage_local_timeout']) {
271                $mise_a_jour = 10;
272        }
273        else if (!$mise_a_jour = comarquage_recuperer_page_xml($parametres)) {
274                comarquage_error("erreur de telechargement du fichier $parametres[xml]; ".
275                ($ok ? "l'action continue avec le fichier présent dans le cache ".
276                "mais la connexion au serveur externe doit être retablie" :
277                "l'action ne peut pas être poursuivie car le fichier n'existe pas ".
278                "dans le cache"));
279                if ($ok==FALSE) return FALSE;
280                $mise_a_jour = 10;
281        }
282        if (lire_fichier ($fichier, $ma_page))
283                return $mise_a_jour;
284        else
285                return FALSE;
286}
287
288// recuperer un fichier xml sur un serveur distant
289// retourne FALSE en cas d'echec
290// 20 en cas de telechargement correct
291function comarquage_recuperer_page_xml($parametres){
292
293                // En fonction de la catégorie (particulier / associations / professionnels) l'url cible n'est pas la même
294                switch ($parametres['categorie']) {
295                case "particuliers":
296                        $url = "http://lecomarquage.service-public.fr/xml2v2/";
297                break;
298
299                case "associations":
300                        $url = "http://lecomarquage.service-public.fr/xmlassov2/";
301                break;
302
303                case 'entreprises':
304                        $url = "http://lecomarquage.service-public.fr/xmlpmev2/";
305                break;
306
307                default:
308                        $url = "http://lecomarquage.service-public.fr/xml2v2/";
309                break;
310                }
311        //$url = $GLOBALS['meta']['comarquage_xml_server'];
312
313        $url = $url.$parametres['xml'];
314        spip_log("URL du flux : $url","comarquage");
315
316        include_spip('inc/distant');
317        $ma_page = recuperer_page($url);
318
319        if ($ma_page===FALSE || !strlen($ma_page)) return FALSE;
320
321        /* Return 20 if the file has been downloaded OK. */
322        ecrire_fichier($parametres['xml_full_path'],$ma_page);
323
324        /*
325        spip_log('************************** DEBUT paramètres recuperer_page_xml',"comarquage");
326        spip_log($parametres,"comarquage");
327        spip_log('************************** FIN paramètres recuperer_page_xml',"comarquage");
328        */
329
330        return 20;
331}
332
333// enregistrer les erreurs dans le spip log
334function comarquage_error($sError, $iType = E_USER_WARNING){
335  spip_log('[ServicePublic] '.$iType.' '.$sError,"comarquage");
336}
337
338// verifier la disponibilite d'un processeur xsl
339function comarquage_processeur_disponible(){
340        static $_available = NULL;
341        static $_executable = 'xsltproc';
342
343        // on ne verifie qu'une fois a chaque hit
344        if ($_available === NULL){
345                foreach (explode(':', getenv('PATH')) as $sPath) {
346                        //if (function_exists('is_executable'))
347                        //      if (is_executable($sPath.'/'.$_executable))
348                                        $_available = TRUE;
349                }
350
351                if ($_available !== TRUE){
352                        comarquage_error("l'executable $_executable n'a pas ete ".
353                        "trouvé dans le PATH ('".getenv('PATH')."')");
354                        $_available = FALSE;
355                }
356        }
357        return $_available;
358}
359
360?>
Note: See TracBrowser for help on using the repository browser.