source: spip-zone/_plugins_/gis_geometries/gisgeom_pipelines.php

Last change on this file was 120108, checked in by cedric@…, 9 months ago

Report de r110514 : version 1.11.5 : retour sur r110510, ne pas casser l'usage depuis le formulaire ;)
Author: bruno@…
Date: 2018-06-05 18:26:14 +0200 (Mar, 05 jui 2018)

  • Property svn:executable set to *
File size: 8.2 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 gisgeom_insert_head_css($flux) {
14        $flux .= "\n".'<link rel="stylesheet" href="'. find_in_path('lib/leaflet-draw/leaflet.draw.css') .'" />';
15        return $flux;
16}
17
18/**
19 * Insertion des scripts et css du plugin dans les pages de l'espace privé
20 * @param $flux
21 * @return mixed
22 */
23function gisgeom_header_prive($flux) {
24        $flux .= gisgeom_insert_head_css('');
25        return $flux;
26}
27
28/**
29 * Ajouter les inputs des champs type et geo au formulaire editer_gis
30 * Ajouter le script leaflet draw au script gis.js appelé par les cartes
31 *
32 * @param $flux
33 * @return mixed
34 */
35function gisgeom_recuperer_fond($flux) {
36        if ($flux['args']['fond'] == 'saisies/carte') {
37                $saisie = recuperer_fond('formulaires/inc-editer_gis-geom', $flux['data']['contexte']);
38                $flux['data']['texte'] = preg_replace('%<!--extragis-->%is', '$0'.$saisie, $flux['data']['texte']);
39        }
40        if ($flux['args']['fond'] == 'javascript/gis.js') {
41                if (!function_exists('lire_config')) {
42                        include_spip('inc/config');
43                }
44                if (lire_config('auto_compress_js') == 'oui' && function_exists('compacte')) {
45                        $ajouts = "\n". compacte(spip_file_get_contents(find_in_path('lib/leaflet-draw/leaflet.draw-src.js')), 'js');
46                } else {
47                        $ajouts = "\n". spip_file_get_contents(find_in_path('lib/leaflet-draw/leaflet.draw-src.js'));
48                }
49                $flux['data']['texte'] .= $ajouts;
50        }
51        return $flux;
52}
53
54/**
55 * Récupérer la valeur du champ geo au format WKT pour la passer au formulaire editer_gis
56 *
57 * @param $flux
58 * @return mixed
59 */
60function gisgeom_formulaire_charger($flux) {
61        if ($flux['args']['form'] == 'editer_gis') {
62                $id_gis = $flux['data']['id_gis'];
63                if (intval($id_gis)) {
64                        $wkt = sql_getfetsel('AsText(geo)', 'spip_gis', "id_gis = $id_gis");
65                        include_spip('gisgeom_fonctions');
66                        $flux['data']['geo'] = $wkt;
67                        $flux['data']['geojson'] = wkt_to_json($wkt);
68                } elseif (_request('geojson')) {
69                        $flux['data']['geo'] = json_to_wkt(_request('geojson'));
70                        $flux['data']['geojson'] = _request('geojson');
71                } elseif (isset($_FILES['import']) and $_FILES['import']['error'] != 4) {
72                        include_spip('action/ajouter_documents');
73                        $infos_doc = verifier_upload_autorise($_FILES['import']['name']);
74                        $fichier = $_FILES['import']['tmp_name'];
75                        $import = '';
76                        lire_fichier($fichier, $donnees);
77                        if ($donnees) {
78                                find_in_path(_DIR_LIB_GEOPHP.'geoPHP.inc', '', true);
79                                $geometry = geoPHP::load($donnees, $infos_doc['extension']);
80                                $flux['data']['geojson'] = $geometry->out('json');
81                                set_request('geojson', $geometry->out('json'));
82                                // renseigner les coordonnées de l'objet à partir de son centroid
83                                $centroid = $geometry->getCentroid();
84                                set_request('lat', $centroid->getY());
85                                set_request('lon', $centroid->getX());
86                        }
87                }
88        }
89        return $flux;
90}
91
92/**
93 * Outrepasser les champs obligatoires du formulaire editer_gis si on importe un fichier lors de la création
94 *
95 * @param $flux
96 * @return mixed
97 */
98function gisgeom_formulaire_verifier($flux) {
99        if ($flux['args']['form'] == 'editer_gis' and isset($_FILES['import']) and $_FILES['import']['error'] != 4) {
100                include_spip('action/ajouter_documents');
101                $infos_doc = verifier_upload_autorise($_FILES['import']['name']);
102                if (in_array($infos_doc['extension'], array('gpx', 'kml'))) {
103                        unset($flux['data']['titre']);
104                        unset($flux['data']['zoom']);
105                } elseif ($infos_doc['extension'] != 'json') {
106                        $flux['data']['import'] = _T('medias:erreur_upload_type_interdit', array('nom'=>$_FILES['import']['name']));
107                }
108        }
109        return $flux;
110}
111
112/**
113 * Gestion de l'import de fichiers GPX et KML
114 * Passer la valeur du champ geo lors de l'insertion d'un objet
115 * (un champ GEOMETRY ne peut être nul si la table comporte un index spatial basé sur celui-ci)
116 *
117 * @param $flux
118 * @return mixed
119 */
120function gisgeom_pre_insertion($flux) {
121        if ($flux['args']['table'] == 'spip_gis' and !_request('geojson') and isset($_FILES['import']) and $_FILES['import']['error'] != 4) {
122                include_spip('action/ajouter_documents');
123                $infos_doc = verifier_upload_autorise($_FILES['import']['name']);
124                $fichier = $_FILES['import']['tmp_name'];
125                $import = '';
126                lire_fichier($fichier, $donnees);
127                if ($donnees) {
128                        find_in_path(_DIR_LIB_GEOPHP.'geoPHP.inc', '', true);
129                        $geometry = geoPHP::load($donnees, $infos_doc['extension']);
130                        set_request('geojson', $geometry->out('json'));
131                        $wkt = $geometry->out('wkt');
132                        $flux['data']['geo'] = sql_getfetsel("GeomFromText('$wkt')");
133                        // titre et descriptif du gis à partir des infos du fichier si pas de titre posté
134                        if (!_request('titre')) {
135                                if ($infos_doc['extension'] == 'gpx') {
136                                        $infos['titre'] = textebrut(extraire_balise($donnees, 'name'));
137                                        $infos['descriptif'] = textebrut(extraire_balise($donnees, 'desc'));
138                                }
139                                if ($infos_doc['extension'] == 'kml') {
140                                        include_spip('inc/xml');
141                                        $arbre = spip_xml_parse($donnees);
142                                        spip_xml_match_nodes(',^Document,', $arbre, $documents);
143                                        foreach ($documents as $document => $info) {
144                                                $infos['titre'] = preg_replace('/<!\[cdata\[(.*?)\]\]>/is', '$1', $info[0]['name'][0]);
145                                                $infos['descriptif'] = preg_replace('/<!\[cdata\[(.*?)\]\]>/is', '$1', $info[0]['description'][0]);
146                                        }
147                                }
148                                set_request('titre', $infos['titre']);
149                                set_request('descriptif', $infos['descriptif']);
150                        }
151                        // renseigner les coordonnées de l'objet à partir de son centroid
152                        $centroid = $geometry->getCentroid();
153                        set_request('lat', $centroid->getY());
154                        set_request('lon', $centroid->getX());
155                }
156        } elseif ($flux['args']['table'] == 'spip_gis') {
157                if (_request('geojson')) {
158                        $json = _request('geojson');
159                } else {
160                        /**
161                         * Cas où on utilise la fonction gis_inserer() depuis une application tierce
162                         * On doit fournir un 'geo' valide pour récupérer notre point
163                         * Ex: CRUD, xmlrpc...
164                         */
165                        $point = array('type' => 'Feature','geometry' => array('type'=> 'Point','coordinates' => array(_request('lon')?_request('lon'):0,_request('lat')?_request('lat'):0)));
166                        $json = json_encode($point);
167                }
168                include_spip('gisgeom_fonctions');
169                $wkt = json_to_wkt($json);
170                // convertir le WKT en binaire avant l'insertion
171                $binary = sql_getfetsel("GeomFromText('$wkt')");
172                $flux['data']['geo'] = $binary;
173        }
174        return $flux;
175}
176
177/**
178 * Passer les valeurs des champs geo et type lors de la modification d'un objet
179 *
180 * @param $flux
181 * @return mixed
182 */
183function gisgeom_post_edition($flux) {
184        if (_request('geojson')
185                and $flux['args']['type'] == 'gis'
186                and $flux['args']['action'] == 'modifier') {
187                $id_gis = $flux['args']['id_objet'];
188                include_spip('gisgeom_fonctions');
189                $wkt = json_to_wkt(_request('geojson'));
190                // TODO : renseigner les valeurs de lat et lon à partir du centroid de l'objet si ce n'est pas un point
191                sql_update(
192                        'spip_gis',
193                        array(
194                                'geo' => "GeomFromText('$wkt')",
195                                'type' => sql_quote(_request('type'))
196                        ),
197                        'id_gis = '.intval($id_gis)
198                );
199        }
200
201        if (!_request('geojson')
202                and isset($flux['data']['lon'])
203                and isset($flux['data']['lat'])
204                and $flux['args']['type'] == 'gis'
205                and $flux['args']['action'] == 'modifier') {
206                // générer automatiquemebt le champ geo à partir de lat et lon quand on passe par l'API et gis_modifier
207                $id_gis = $flux['args']['id_objet'];
208                $point = array('type' => 'Feature', 'geometry' => array('type' => 'Point', 'coordinates' => array($flux['data']['lon'], $flux['data']['lat'])));
209                $json  = json_encode($point);
210                include_spip('gisgeom_fonctions');
211                $wkt = json_to_wkt($json);
212                sql_update(
213                        'spip_gis',
214                        array(
215                                'geo' => "GeomFromText('$wkt')",
216                                'type' => sql_quote($type)
217                        ),
218                        'id_gis = '.intval($id_gis)
219                );
220        }
221       
222        return $flux;
223}
224
225/**
226 * Surcharger les boucles GIS et celles qui comportent le critère gis
227 * pour permettre d'accéder à la valeur du champ geo au format WKT (voir balise #GEOMETRY)
228 * et aux valeurs des styles concaténées (voir balise #GEOMETRY_STYLES)
229 *
230 * @param $boucle
231 * @return mixed
232 */
233function gisgeom_pre_boucle($boucle) {
234        if ($boucle->type_requete == 'gis' or in_array('gis', $boucle->jointures)) {
235                $boucle->select[]= 'AsText(gis.geo) AS geometry';
236                $boucle->select[]= "CONCAT_WS(',', gis.color, gis.weight, gis.opacity, gis.fillcolor, gis.fillopacity) AS geometry_styles";
237        }
238        return $boucle;
239}
Note: See TracBrowser for help on using the repository browser.