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

Last change on this file since 85738 was 85738, checked in by rastapopoulos@…, 5 years ago

1) Utiliser self(), car SPIP fait déjà beaucoup mieux le nettoyage que juste enlever var_mode. La fonction existe déjà autant l'utiliser. 2) Ne pas tester le mode d'URL, qui ne veut rien dire du tout, surtout qu'on peut insérer le comarquage où on veut, dans un squelette quelconque. On teste plutôt directement si l'URL contient le ? ou pas, et on adapte.

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