source: spip-zone/_plugins_/diogene/diogene_complements/diogene_geo/trunk/diogene_geo_pipelines.php @ 97999

Last change on this file since 97999 was 97999, checked in by kent1@…, 3 years ago

Nettoyage

File size: 11.5 KB
Line 
1<?php
2/**
3 * Plugin Diogène géo : extensions géographique pour Diogène
4 *
5 * Auteurs :
6 * b_b
7 * kent1 (http://www.kent1.info - kent1@arscenic.info)
8 *
9 * © 2010-2014 - Distribue sous licence GNU/GPL
10 *
11 * Utilisation des pipelines par Diogene Géo
12 *
13 * @package SPIP\Diogene_geo\Pipelines
14 */
15
16if (!defined('_ECRIRE_INC_VERSION')) {
17        return;
18}
19
20/**
21 * Insertion dans le pipeline diogene_ajouter_saisies (plugin Diogene)
22 *
23 * On ajoute la carte et les saisies supplémentaires liées à diogene_geo ou un sélecteur de point existant
24 *
25 * @param array $flux
26 *              le contexte du pipeline
27 * @return array $flux
28 *              Le contexte du pipeline modifié
29 */
30function diogene_geo_diogene_ajouter_saisies($flux) {
31        $objet = $flux['args']['type'];
32        $id_objet = $flux['args']['contexte']['id_'.$objet];
33        if (defined('_DIR_PLUGIN_GIS')
34                and in_array($objet, array('article', 'rubrique'))
35                and is_array(unserialize($flux['args']['champs_ajoutes']))
36                and in_array('geo', unserialize($flux['args']['champs_ajoutes']))) {
37                /**
38                 * Récupérer le point gis lié à l'objet
39                 */
40                if (intval($id_objet)) {
41                        $valeurs_gis = sql_fetsel('*', 'spip_gis AS gis LEFT JOIN spip_gis_liens AS lien USING(id_gis)', "lien.id_objet=$id_objet AND lien.objet=".sql_quote($objet));
42                        if (is_array($valeurs_gis)) {
43                                $valeurs_gis['gis_titre'] = $valeurs_gis['titre'];
44                                $valeurs_gis['gis_descriptif'] = $valeurs_gis['descriptif'];
45                                unset($valeurs_gis['titre']);
46                                unset($valeurs_gis['gis_descriptif']);
47                                $flux['args']['contexte'] = array_merge($flux['args']['contexte'], $valeurs_gis);
48                        }
49                }
50                /**
51                 * Afficher le select si on veut forcer le point existant
52                 */
53                if (isset($flux['args']['options_complements']['geo_forcer_existant']) and $flux['args']['options_complements']['geo_forcer_existant'] == 'on') {
54                        if (intval(_request('id_gis')) > 0) {
55                                $flux['args']['contexte']['id_gis'] = _request('id_gis');
56                        }
57                        $flux['data'] .= recuperer_fond('formulaires/diogene_ajouter_medias_geo_forcer', $flux['args']['contexte']);
58                } else {
59                        /**
60                         * Afficher une carte dans les autres cas
61                         */
62                        $flux['data'] .= recuperer_fond('formulaires/diogene_ajouter_medias_geo', $flux['args']['contexte']);
63                }
64        }
65        return $flux;
66}
67
68/**
69 * Insertion dans le pipeline diogene_charger (plugin Diogène)
70 *
71 * On récupère les valeurs de lat, lon, zoom, gis_titre et gis_descriptif dans ce qui a été auparavant posté
72 * (On évite le $_GET de l'url) pour le réinsérer en cas d'erreur dans le formulaire
73 *
74 * @param array $flux
75 *              Le contexte du pipeline
76 * @return array $flux
77 *              Le contexte du pipeline modifié
78 */
79function diogene_geo_diogene_charger($flux) {
80        if (defined('_DIR_PLUGIN_GIS')) {
81                $flux['data']['lat'] = $_POST['lat'];
82                $flux['data']['lon'] = $_POST['lon'];
83                $flux['data']['zoom'] = $_POST['zoom'];
84                $flux['data']['gis_titre'] = $_POST['gis_titre'];
85                $flux['data']['gis_descriptif'] = $_POST['gis_descriptif'];
86                $flux['data']['adresse'] = $_POST['adresse'];
87                $flux['data']['code_postal'] = $_POST['code_postal'];
88                $flux['data']['ville'] = $_POST['ville'];
89                $flux['data']['region'] = $_POST['region'];
90                $flux['data']['pays'] = $_POST['pays'];
91                $flux['data']['id_gis'] = $_POST['id_gis'];
92                $flux['data']['position_auto'] = _request('position_auto');
93        }
94        return $flux;
95}
96
97/**
98 * Insertion dans le pipeline diogene_verifier (Plugin Diogene)
99 *
100 * Vérifie la validité des champs lat, lon, zoom, gis_titre, gis_descriptif
101 * - Si au moins une de ces valeurs est présente (sauf le descriptif), lat, lon, zoom, et titre
102 * deviennent obligatoires
103 * - Si lat et lon sont présents mais ne sont pas de type float => erreur
104 * - Si zoom est présent et n'est pas un int => erreur
105 *
106 * @param array $flux
107 *              Le contexte du pipeline
108 * @return array $flux
109 *              Le contexte du pipeline modifié
110 */
111function diogene_geo_diogene_verifier($flux) {
112        if (defined('_DIR_PLUGIN_GIS') && !_request('gis_supprimer') && _request('gis_afficher')) {
113                $erreurs = &$flux['args']['erreurs'];
114                if (!isset($flux['args']['options_complements']['geo_forcer_existant'])
115                        or $flux['args']['options_complements']['geo_forcer_existant'] != 'on') {
116                        $lat = _request('lat');
117                        $lon = _request('lon');
118                        $zoom = _request('zoom');
119                        $titre = _request('gis_titre');
120
121                        if (_request('statut') != 'poubelle' && ($lat or $lon or $zoom)) {
122                                if (!$lat) {
123                                        $flux['data']['lat'] = _T('info_obligatoire');
124                                }
125                                if (!$lon) {
126                                        $flux['data']['lon'] = _T('info_obligatoire');
127                                }
128                                if (!$zoom) {
129                                        $flux['data']['zoom'] = _T('info_obligatoire');
130                                }
131                                if (!$titre) {
132                                        $flux['data']['gis_titre'] = _T('info_obligatoire');
133                                }
134                        }
135
136                        if ((!$erreurs['lat']) && $lat) {
137                                if ((!empty($lat)) && !is_numeric($lat)) {
138                                        $flux['data']['lat'] = _T('diogene:erreur_valeur_float', array('champ' => _T('diogene_geo:latitude')));
139                                }
140                        }
141                        if ((!$erreurs['lon']) && $lon) {
142                                if ((!empty($lon)) && !is_numeric($lon)) {
143                                        $flux['data']['lonx'] = _T('diogene:erreur_valeur_float', array('champ' => _T('diogene_geo:longitude')));
144                                }
145                        }
146                        if ((!$erreurs['zoom']) && $zoom) {
147                                if ((!empty($zoom)) && !ctype_digit($zoom)) {
148                                        $flux['data']['zoom'] = _T('diogene:erreur_valeur_int', array('champ' =>_T('diogene_geo:zoom')));
149                                }
150                        }
151                }
152        }
153        return $flux;
154}
155
156/**
157 * Insertion dans le pipeline diogene_traiter (plugin Diogene)
158 *
159 * On crée un point ou le met à jour si on a les infos de géoloc
160 *
161 * @param array $flux
162 *              Le contexte du pipeline
163 * @return array $flux
164 *              Le contexte du pipeline modifié
165 */
166function diogene_geo_diogene_traiter($flux) {
167        if (defined('_DIR_PLUGIN_GIS') && $flux['args']['action'] == 'modifier') {
168                $objet = $flux['args']['type'];
169                $id_objet = $flux['args']['id_objet'];
170                if (intval(_request('id_diogene')) > 0) {
171                        $options_complements = unserialize(sql_getfetsel('options_complements', 'spip_diogenes', 'id_diogene='.intval(_request('id_diogene'))));
172                }
173                if (isset($options_complements['geo_forcer_existant']) && $options_complements['geo_forcer_existant'] == 'on') {
174                        include_spip('action/editer_gis');
175                        $id_gis = false;
176                        $post_gis = _request('id_gis') ? _request('id_gis') : $_POST['id_gis'];
177                        if (intval($id_objet)) {
178                                $id_gis = sql_getfetsel('gis.id_gis', 'spip_gis AS gis LEFT JOIN spip_gis_liens AS lien USING(id_gis)', "lien.id_objet=$id_objet AND lien.objet=".sql_quote($objet));
179                        }
180                        if (intval($id_gis) > 0 &&  $id_gis != $post_gis) {
181                                gis_dissocier($id_gis, array($objet => $id_objet));
182                        }
183                        if (intval($post_gis) > 0 && $id_gis != $post_gis) {
184                                gis_associer($post_gis, array($objet => $id_objet));
185                        }
186                } else {
187                        if (_request('gis_supprimer')) {
188                                include_spip('action/editer_gis');
189                                $id_gis = _request('id_gis');
190                                delier_gis($id_gis, $objet, $id_objet);
191                                $nb_gis = sql_countsel('spip_gis_liens', 'id_gis='.intval($id_gis));
192                                if ($nb_gis == 0) {
193                                        supprimer_gis($id_gis);
194                                }
195
196                                /**
197                                 * On vide ensuite les request sur les données géo
198                                 */
199                                set_request('lat', '');
200                                set_request('lon', '');
201                                set_request('zoom', '');
202                                set_request('gis_titre', '');
203                                set_request('gis_descriptif', '');
204                                set_request('adresse', '');
205                                set_request('code_postal', '');
206                                set_request('ville', '');
207                                set_request('region', '');
208                                set_request('pays', '');
209                        } elseif (($lat = _request('lat')) && ($lon = _request('lon')) && ($gis_afficher = _request('gis_afficher'))) {
210                                include_spip('action/editer_gis');
211                                // On crée l'array pour l'update et pour la création des coordonnées
212                                $zoom = _request('zoom');
213                                $titre = _request('gis_titre');
214                                $descriptif = _request('gis_descriptif');
215                                $id_gis = _request('id_gis');
216                                $datas = array(
217                                        'titre' => $titre,
218                                        'descriptif' => $descriptif,
219                                        'lat' => $lat,
220                                        'lon' => $lon,
221                                        'zoom' => $zoom,
222                                        'titre' => $titre,
223                                        'adresse' => _request('adresse'),
224                                        'code_postal' => _request('code_postal'),
225                                        'ville' => _request('ville'),
226                                        'region' => _request('region'),
227                                        'pays' => _request('pays')
228                                );
229                                if (!intval($id_gis)) {
230                                        $id_gis = insert_gis();
231                                }
232
233                                if (isset($datas['lon'])) {
234                                        if ($datas['lon'] > 180) {
235                                                while ($datas['lon'] > 180) {
236                                                        $datas['lon'] = $datas['lon'] - 360;
237                                                }
238                                        } elseif ($datas['lon'] <= -180) {
239                                                while ($datas['lon'] <= -180) {
240                                                        $datas['lon'] = $datas['lon'] + 360;
241                                                }
242                                        }
243                                }
244                                if (isset($datas['lat'])) {
245                                        if ($datas['lat'] > 90) {
246                                                while ($datas['lat'] > 90) {
247                                                        $datas['lat'] = $datas['lat'] - 180;
248                                                }
249                                        } elseif ($datas['lat'] <= -90) {
250                                                while ($datas['lat'] <= -90) {
251                                                        $datas['lat'] = $datas['lon'] + 180;
252                                                }
253                                        }
254                                }
255                                sql_updateq('spip_gis', $datas, 'id_gis='.intval($id_gis));
256                                if ($objet && $id_objet) {
257                                        lier_gis($id_gis, $objet, $id_objet);
258                                }
259                        }
260                        set_request('gis_afficher', $gis_afficher);
261                }
262        }
263        return $flux;
264}
265
266/**
267 * Insertion dans le pipeline diogene_objets (plugin Diogene)
268 *
269 * On ajoute la possibilité d'avoir une partie de formulaire pour gis pour les articles, les rubriques,
270 * les pages spécifiques et emballe_medias
271 *
272 * @param array $flux
273 *              Le contexte du flux
274 * @return array $flux
275 *              Le contexte du flux modifié
276 */
277function diogene_geo_diogene_objets($flux) {
278        if (defined('_DIR_PLUGIN_GIS')) {
279                $flux['article']['champs_sup']['geo'] = $flux['rubrique']['champs_sup']['geo'] = _T('diogene_geo:form_legend');
280                if (defined('_DIR_PLUGIN_PAGES')) {
281                        $flux['page']['champs_sup']['geo'] = _T('diogene_geo:form_legend');
282                }
283        }
284        return $flux;
285}
286
287/**
288 * Insertion dans le pipeline diogene_champs_texte (plugin Diogene)
289 *
290 * On ajoute dans le formulaire d'édition de diogène la possibilité
291 * de demander de cacher la carte par défaut car elle prend beaucoup de place
292 * (utile pour les sites qui ne sont pas basés sur la géolocalisation d'objets)
293 *
294 * @param array $flux
295 *              Le contexte du flux
296 * @return array $flux
297 *              Le contexte du flux modifié
298 */
299function diogene_geo_diogene_champs_texte($flux) {
300        if (defined('_DIR_PLUGIN_GIS') && in_array($flux['args']['objet'], array('article','page','emballe_media'))) {
301                $flux['data'] .= recuperer_fond('formulaires/diogene_geo_cacher', $flux['args']);
302        }
303        return $flux;
304}
305
306function diogene_geo_diogene_champs_pre_edition($array) {
307        if (defined('_DIR_PLUGIN_GIS')) {
308                $array[] = 'geo_cacher';
309                $array[] = 'geo_forcer_existant';
310        }
311        return $array;
312}
313
314/**
315 * Insertion dans le pipeline em_post_upload_medias (plugin Emballe médias)
316 *
317 * Dans le cas des documents mis en ligne par emballe medias,
318 * si on a récupéré une géolocalisation associée au document,
319 * on l'ajoute à l'article également
320 *
321 * @param array $flux
322 *              Le contexte du flux
323 * @param array $flux
324 *              Le contexte du flux sans modification
325 */
326function diogene_geo_em_post_upload_medias($flux) {
327        if (defined('_DIR_PLUGIN_GIS')) {
328                /**
329                 * Si on reçoit un id_gis_meta dans l'environnement,
330                 * c'est que cela vient d'une récupération de metas après upload de document
331                 * dans spipmotion par exemple (par metadata/video.php)
332                 */
333                if (_request('id_gis_meta')) {
334                        $id_gis = intval(_request('id_gis_meta'));
335                        lier_gis($id_gis, 'document', $flux['args']['id_document']);
336                } else {
337                        $id_gis = sql_getfetsel('id_gis', 'spip_gis_liens', 'objet='.sql_quote('document').' AND id_objet='.intval($flux['args']['id_document']));
338                }
339                if (intval($id_gis)) {
340                        include_spip('action/editer_gis');
341                        sql_delete('spip_gis_liens', 'objet='.sql_quote($flux['args']['objet']).' AND id_objet='.intval($flux['args']['id_objet']));
342                        lier_gis($id_gis, $flux['args']['objet'], $flux['args']['id_objet']);
343                        set_request('position_auto', true);
344                }
345        }
346        return $flux;
347}
Note: See TracBrowser for help on using the repository browser.