source: spip-zone/_plugins_/gis/trunk/gis_pipelines.php

Last change on this file was 108467, checked in by kent1@…, 15 months ago

Invalider le cache lors de l'ajout ou dissociation d'un point à un objet, "Voir en ligne" ne suffit pas car le json est sur un autre hit

En fait lorsque l'on ajoute juste un point qui existe déjà, ou que l'on ne fait que dissocier un point, il n'y a pas d'invalidation de cache et le json ne se mettait pas à jour tout seul.

Il était nécessaire de modifier un autre objet.

Version 4.44.11

  • Property svn:executable set to *
File size: 12.8 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) {
4        return;
5}
6
7/**
8 * Insertion des css du plugin dans les pages publiques
9 *
10 * @param $flux
11 * @return mixed
12 */
13function gis_insert_head_css($flux) {
14        $flux .="\n".'<link rel="stylesheet" href="'. direction_css(sinon(find_in_path('css/leaflet.css'), find_in_path('lib/leaflet/dist/leaflet.css'))) .'" />';
15        $flux .="\n".'<link rel="stylesheet" href="'. direction_css(sinon(find_in_path('css/leaflet-plugins.css'), find_in_path('lib/leaflet/plugins/leaflet-plugins.css'))) .'" />';
16        $flux .="\n".'<link rel="stylesheet" href="'. direction_css(sinon(find_in_path('css/leaflet.markercluster.css'), find_in_path('lib/leaflet/plugins/leaflet.markercluster.css'))) .'" />';
17        $flux .="\n".'<link rel="stylesheet" href="'. sinon(find_in_path('css/leaflet_nodirection.css'), find_in_path('lib/leaflet/dist/leaflet_nodirection.css')) .'" />';
18        return $flux;
19}
20
21/**
22 * Insertion des scripts du plugin dans les pages publiques
23 *
24 * @param $flux
25 * @return mixed
26 */
27function gis_insert_head($flux) {
28
29        // initialisation des valeurs de config
30        $config = @unserialize($GLOBALS['meta']['gis']);
31        if (!isset($config['layers']) || !is_array($config['layers'])) {
32                $config['layers'] = array('openstreetmap_mapnik');
33        }
34
35        include_spip('gis_fonctions');
36        if (!in_array(gis_layer_defaut(), $config['layers'])) {
37                $config['layers'][] = gis_layer_defaut();
38        }
39
40        // insertion des scripts pour google si nécessaire
41        if (count(array_intersect(array('google_roadmap', 'google_satellite', 'google_terrain'), $config['layers'])) > 0) {
42                $flux .="\n".'<script type="text/javascript" src="//maps.google.com/maps/api/js?language='.$GLOBALS['spip_lang'].'&amp;key='.(isset($config['api_key_google']) ? $config['api_key_google'] : '').'"></script>';
43        }
44
45        return $flux;
46}
47
48/**
49 * Insertion des scripts et css du plugin dans les pages de l'espace privé
50 *
51 * @param $flux
52 * @return mixed
53 */
54function gis_header_prive($flux) {
55        $flux .= gis_insert_head_css('');
56        $flux .= gis_insert_head('');
57        return $flux;
58}
59
60/**
61 * Insertion du bloc GIS dans les pages des objets de l'espace privé
62 *
63 * @param $flux
64 * @return mixed
65 */
66function gis_afficher_contenu_objet($flux) {
67        if ($objet = $flux['args']['type']
68                and include_spip('inc/config')
69                and in_array(table_objet_sql($objet), lire_config('gis/gis_objets', array()))
70                and ($id = intval($flux['args']['id_objet']))
71        ) {
72                $texte = recuperer_fond(
73                        'prive/contenu/gis_objet',
74                        array(
75                                'table_source'=>'gis',
76                                'objet'=>$objet,
77                                'id_objet'=>$id
78                        )
79                );
80                $flux['data'] .= $texte;
81        }
82
83        return $flux;
84}
85
86/**
87 * Si la geolocalisation des documents est activée dans la config,
88 * création/suppression d'un point à partir des métadonnées du document ajouté (jpg, kml et kmz)
89 *
90 * @param $flux
91 * @return mixed
92 */
93function gis_post_edition($flux) {
94        if (is_array($flux) && isset($flux['args']['operation']) && ($flux['args']['operation'] == 'ajouter_document')
95                and ($document = sql_fetsel('*', 'spip_documents', 'id_document=' . intval($flux['args']['id_objet'])))
96                and (in_array(table_objet_sql('document'), lire_config('gis/gis_objets', array())))
97        ) {
98                if (in_array($document['extension'], array('jpg', 'kml', 'kmz'))) {
99                        $config = @unserialize($GLOBALS['meta']['gis']);
100                        if (!is_array($config)) {
101                                $config = array();
102                        }
103                        include_spip('inc/documents');
104                        $fichier = get_spip_doc($document['fichier']);
105                        $id_document = $document['id_document'];
106                }
107                if ($document['extension'] == 'jpg') {
108                        // on recupere les coords definies dans les exif du document s'il y en a
109                        if (function_exists('exif_read_data') and $exifs =  @exif_read_data($fichier, 'GPS')) {
110                                if (!function_exists('dms_to_dec')) {
111                                        include_spip('gis_fonctions');
112                                }
113                                spip_log("GIS EXIFS : Récuperation des coordonnees du fichier $fichier", 'gis');
114
115                                $LatDeg = explode('/', $exifs['GPSLatitude'][0]);
116                                $intLatDeg = $LatDeg[0] / ($LatDeg[1] ? $LatDeg[1] : 1);
117
118                                $LatMin = explode('/', $exifs['GPSLatitude'][1]);
119                                $intLatMin = $LatMin[0] / ($LatMin[1] ? $LatMin[1] : 1);
120
121                                $LatSec = explode('/', $exifs['GPSLatitude'][2]);
122                                $intLatSec = $LatSec[0] / ($LatSec[1] ? $LatSec[1] : 1);
123
124                                $LongDeg = explode('/', $exifs['GPSLongitude'][0]);
125                                $intLongDeg = $LongDeg[0] / ($LongDeg[1] ? $LongDeg[1] : 1);
126
127                                $LongMin = explode('/', $exifs['GPSLongitude'][1]);
128                                $intLongMin = $LongMin[0] / ($LongMin[1] ? $LongMin[1] : 1);
129
130                                $LongSec = explode('/', $exifs['GPSLongitude'][2]);
131                                $intLongSec = $LongSec[0] / ($LongSec[1] ? $LongSec[1] : 1);
132
133                                // round to 5 = approximately 1 meter accuracy
134                                if (is_numeric($intLatDeg) && is_numeric($intLatMin) && is_numeric($intLatSec)) {
135                                        $latitude = round(dms_to_dec($exifs['GPSLatitudeRef'], $intLatDeg, $intLatMin, $intLatSec), 5);
136                                }
137
138                                if (is_numeric($intLongDeg) && is_numeric($intLongMin) && is_numeric($intLongSec)) {
139                                        $longitude =  round(dms_to_dec($exifs['GPSLongitudeRef'], $intLongDeg, $intLongMin, $intLongSec), 5);
140                                }
141                                if ($config['geocoder'] == 'on') {
142                                        include_spip('inc/distant');
143                                        $url_geocoder = 'http://nominatim.openstreetmap.org/reverse/?format=xml&addressdetails=1&accept-language='.urlencode($GLOBALS['meta']['langue_site']).'&lat='.urlencode($latitude).'&lon='.urlencode($longitude);
144                                        $json = recuperer_page($url_geocoder);
145                                        $geocoder = json_decode($json, true);
146                                        if (is_array($geocoder)) {
147                                                $pays = $geocoder['address']['country'];
148                                                $code_pays = $geocoder['address']['country_code'];
149                                                $region = $geocoder['address']['state'];
150                                                if ($geocoder['address']['city']) {
151                                                        $ville = $geocoder['address']['city'];
152                                                } elseif ($geocoder['address']['town']) {
153                                                        $ville = $geocoder['address']['town'];
154                                                } elseif ($geocoder['address']['village']) {
155                                                        $ville = $geocoder['address']['village'];
156                                                }
157                                                $code_postal = $geocoder['address']['postcode'];
158                                                $adresse = $geocoder['address']['road'];
159                                        }
160                                }
161                        } elseif (file_exists($fichier)) {
162                                include_spip('inc/iptc');
163
164                                $er = new class_IPTC($fichier);
165                                $iptc = $er->fct_lireIPTC();
166                                $codesiptc = $er->h_codesIptc;
167                                $string_recherche = '';
168
169                                if ($iptc['city']) {
170                                        $string_recherche .= $iptc['city'].', ';
171                                }
172                                if ($iptc['provinceState']) {
173                                        $string_recherche .= $iptc['provinceState'].', ';
174                                }
175                                if ($iptc['country']) {
176                                        $string_recherche .= $iptc['country'];
177                                }
178                                if (strlen($string_recherche)) {
179                                        include_spip('inc/distant');
180                                        $url_geocoder = 'http://nominatim.openstreetmap.org/search/?format=json&addressdetails=1&limit=1&accept-language='.urlencode($GLOBALS['meta']['langue_site']).'&q='.urlencode($string_recherche);
181                                        $json = recuperer_page($url_geocoder);
182                                        $geocoder = json_decode($json, true);
183                                        if (is_array($geocoder[0])) {
184                                                $latitude = $geocoder[0]['lat'];
185                                                $longitude = $geocoder[0]['lon'];
186                                                if ($config['adresse'] == 'on') {
187                                                        $pays = $geocoder[0]['address']['country'];
188                                                        $code_pays = $geocoder[0]['address']['country_code'];
189                                                        $region = $geocoder[0]['address']['state'];
190                                                        if ($geocoder[0]['address']['city']) {
191                                                                $ville = $geocoder[0]['address']['city'];
192                                                        } elseif ($geocoder[0]['address']['town']) {
193                                                                $ville = $geocoder[0]['address']['town'];
194                                                        } elseif ($geocoder[0]['address']['village']) {
195                                                                $ville = $geocoder[0]['address']['village'];
196                                                        }
197                                                }
198                                        }
199                                }
200                        }
201                        if (is_numeric($latitude) && is_numeric($longitude)) {
202                                $c = array(
203                                        'titre' => basename($fichier),
204                                        'lat'=> $latitude,
205                                        'lon' => $longitude,
206                                        'zoom' => $config['zoom'] ? $config['zoom'] :'4',
207                                        'adresse' => $adresse,
208                                        'code_postal' => $code_postal,
209                                        'ville' => $ville,
210                                        'region' => $region,
211                                        'departement' => $departement,
212                                        'pays' => $pays,
213                                        'code_pays' => $code_pays
214                                );
215
216                                if (defined('_DIR_PLUGIN_GISGEOM')) {
217                                        $geojson = '{"type":"Point","coordinates":['.$longitude.','.$latitude.']}';
218                                        set_request('geojson', $geojson);
219                                }
220
221                                include_spip('action/editer_gis');
222
223                                if ($id_gis = sql_getfetsel('G.id_gis', 'spip_gis AS G LEFT  JOIN spip_gis_liens AS T ON T.id_gis=G.id_gis', 'T.id_objet=' . intval($id_document) . " AND T.objet='document'")) {
224                                        // Des coordonnées sont déjà définies pour ce document => on les update
225                                        revisions_gis($id_gis, $c);
226                                        spip_log("GIS EXIFS : Update des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis", 'gis');
227                                } else {
228                                        // Aucune coordonnée n'est définie pour ce document  => on les crées
229                                        $id_gis = insert_gis();
230                                        revisions_gis($id_gis, $c);
231                                        lier_gis($id_gis, 'document', $id_document);
232                                        spip_log("GIS EXIFS : Création des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis", 'gis');
233                                }
234                        }
235                } elseif (in_array($document['extension'], array('kml','kmz','gpx'))) {
236                        $recuperer_info = charger_fonction('kml_infos', 'inc');
237                        $infos = $recuperer_info($document['id_document']);
238                        if ($infos) {
239                                if (is_numeric($latitude = $infos['latitude']) && is_numeric($longitude = $infos['longitude'])) {
240                                        $c = array(
241                                                'titre' => $infos['titre'] ? $infos['titre'] : basename($fichier),
242                                                'descriptif' => $infos['descriptif'],
243                                                'lat'=> $latitude,
244                                                'lon' => $longitude,
245                                                'zoom' => $config['zoom'] ? $config['zoom'] :'4'
246                                        );
247
248                                        include_spip('action/editer_gis');
249
250                                        if ($id_gis = sql_getfetsel('G.id_gis', 'spip_gis AS G LEFT  JOIN spip_gis_liens AS T ON T.id_gis=G.id_gis', 'T.id_objet=' . intval($id_document) . " AND T.objet='document'")) {
251                                                // Des coordonnées sont déjà définies pour ce document => on les update
252                                                revisions_gis($id_gis, $c);
253                                                spip_log("GIS EXIFS : Update des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis", 'gis');
254                                        } else {
255                                                // Aucune coordonnée n'est définie pour ce document  => on les crées
256                                                $id_gis = insert_gis();
257                                                revisions_gis($id_gis, $c);
258                                                lier_gis($id_gis, 'document', $id_document);
259                                                spip_log("GIS EXIFS : Création des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis", 'gis');
260                                        }
261                                }
262                                unset($infos['longitude']);
263                                unset($infos['latitude']);
264                                if (count($infos) > 0) {
265                                        include_spip('action/editer_document');
266                                        document_modifier($id_document, $infos);
267                                }
268                        }
269                }
270        }
271        if (is_array($flux) && isset($flux['args']['operation']) && ($flux['args']['operation'] == 'supprimer_document')
272                and ($id_document = intval($flux['args']['id_objet'])
273                and ($id_gis = sql_getfetsel('G.id_gis', 'spip_gis AS G LEFT JOIN spip_gis_liens AS T ON T.id_gis=G.id_gis', 'T.id_objet=' . intval($id_document) . " AND T.objet='document'")))
274        ) {
275                include_spip('action/editer_gis');
276                supprimer_gis($id_gis);
277                spip_log("GIS EXIFS : Suppression des coordonnées pour le document $id_document => id_gis = $id_gis", 'gis');
278        }
279
280        return $flux;
281}
282
283
284/**
285 * Optimiser la base de données en supprimant les liens orphelins
286 *
287 * @param array $flux
288 * @return array
289 */
290function gis_optimiser_base_disparus($flux) {
291
292        include_spip('action/editer_liens');
293        // optimiser les liens morts :
294        // entre gis vers des objets effaces
295        // depuis des gis effaces
296        $flux['data'] += objet_optimiser_liens(array('gis' => '*'), '*');
297
298        return $flux;
299}
300
301function gis_saisies_autonomes($flux) {
302        $flux[] = 'carte';
303        return $flux;
304}
305
306/**
307 * Insertion dans le pipeline xmlrpc_methodes (xmlrpc)
308 * Ajout de méthodes xml-rpc spécifiques à GIS
309 *
310 * @param array $flux : un array des methodes déjà présentes, fonctionnant sous la forme :
311 * -* clé = nom de la méthode;
312 * -* valeur = le nom de la fonction à appeler;
313 * @return array $flux : l'array complété avec nos nouvelles méthodes
314 */
315function gis_xmlrpc_methodes($flux) {
316        $flux['spip.liste_gis'] = 'spip_liste_gis';
317        $flux['spip.lire_gis'] = 'spip_lire_gis';
318        return $flux;
319}
320
321/**
322 * Insertion dans le pipeline xmlrpc_server_class (xmlrpc)
323 * Ajout de fonctions spécifiques utilisés par le serveur xml-rpc
324 */
325function gis_xmlrpc_server_class($flux) {
326        include_spip('inc/gis_xmlrpc');
327        return $flux;
328}
329
330/**
331 * Insertion dans le traitement du formulaire de configuration
332 *
333 * Purger le répertoire js si on a une carte google dans les layers pour recalculer le js statique
334 * Peut être à améliorer
335 * Invalider le cache lors de l'ajout ou dissociation d'un point à un objet, "Voir en ligne" ne suffit pas
336 * car le json est sur un autre hit
337 *
338 * @param array $flux
339 *              Le contexte du pipeline
340 * @return array $flux
341 */
342function gis_formulaire_traiter($flux) {
343        if ($flux['args']['form'] == 'configurer_gis'
344                and count(array_intersect(array('google_roadmap', 'google_satellite', 'google_terrain'), _request('layers'))) > 0) {
345                include_spip('inc/invalideur');
346                purger_repertoire(_DIR_VAR . 'cache-js');
347                suivre_invalideur(1);
348        } else if ($flux['args']['form'] == 'editer_liens'
349                and isset($flux['args']['args'][0])
350                and $flux['args']['args'][0] == 'gis') {
351                include_spip('inc/invalideur');
352                suivre_invalideur(1);
353        }
354        return $flux;
355}
Note: See TracBrowser for help on using the repository browser.