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

Last change on this file since 98217 was 98217, checked in by teddy.spip@…, 4 years ago

Les bons accents.

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