[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins / gis / action / editer_gis.php
1 <?php
2
3 if (!defined('_ECRIRE_INC_VERSION')) {
4 return;
5 }
6
7 include_spip('inc/autoriser');
8
9 function action_editer_gis_dist($arg = null) {
10 if (is_null($arg)) {
11 $securiser_action = charger_fonction('securiser_action', 'inc');
12 $arg = $securiser_action();
13 }
14
15 // si id_gis n'est pas un nombre, c'est une creation
16 if (!$id_gis = intval($arg)) {
17 if (!autoriser('creer', 'gis') or !$id_gis = gis_inserer()) {
18 return array(false, _L('echec'));
19 }
20 }
21 $err = gis_modifier($id_gis);
22 return array($id_gis,$err);
23 }
24
25 /**
26 * Fonction d'insertion d'un gis vide
27 *
28 * @return int/false $id_gis : l'identifiant numérique du point ou false en cas de non création
29 */
30 function gis_inserer() {
31 $champs = array();
32
33 // Envoyer aux plugins
34 $champs = pipeline('pre_insertion', array(
35 'args' => array(
36 'table' => 'spip_gis',
37 ),
38 'data' => $champs
39 ));
40
41 $id_gis = sql_insertq('spip_gis', $champs);
42
43 pipeline(
44 'post_insertion',
45 array(
46 'args' => array(
47 'table' => 'spip_gis',
48 'id_objet' => $id_gis
49 ),
50 'data' => $champs
51 )
52 );
53 return $id_gis;
54 }
55
56 /**
57 * Enregistrer certaines modifications d'un gis
58 *
59 * Appelle toutes les fonctions de modification d'un point gis
60 * $err est de la forme chaine de langue ou vide si pas d'erreur
61 * https://code.spip.net/@articles_set
62 *
63 * @param int $id_gis l'identifiant numérique du point
64 * @param null/array $set un array des valeurs à mettre en base (par défaut false, on récupère les valeurs passées en dans le POST)
65 * @return string
66 */
67 function gis_modifier($id_gis, $set = null) {
68 include_spip('inc/modifier');
69 include_spip('inc/filtres');
70 $c = collecter_requests(
71 // white list
72 objet_info('gis', 'champs_editables'),
73 // black list
74 array('id_objet','objet'),
75 // donnees eventuellement fournies
76 $set
77 );
78
79 if (isset($c['lon'])) {
80 if ($c['lon'] > 180) {
81 while ($c['lon'] > 180) {
82 $c['lon'] = $c['lon'] - 360;
83 }
84 } elseif ($c['lon'] <= -180) {
85 while ($c['lon'] <= -180) {
86 $c['lon'] = $c['lon'] + 360;
87 }
88 }
89 }
90 if (isset($c['lat'])) {
91 if ($c['lat'] > 90) {
92 while ($c['lat'] > 90) {
93 $c['lat'] = $c['lat'] - 180;
94 }
95 } elseif ($c['lat'] <= -90) {
96 while ($c['lat'] <= -90) {
97 $c['lat'] = $c['lat'] + 180;
98 }
99 }
100 }
101 if ($err = objet_modifier_champs('gis', $id_gis, array(
102 //'nonvide' => array('nom' => _T('info_sans_titre')),
103 'data' => $set,
104 'invalideur' => "id='gis/$id_gis'",
105 ), $c)) {
106 return $err;
107 }
108
109 // lier a un parent ?
110 $c = collecter_requests(array('id_objet', 'objet'), array(), $set);
111 if (isset($c['id_objet']) and intval($c['id_objet']) and isset($c['objet']) and $c['objet']) {
112 lier_gis($id_gis, $c['objet'], $c['id_objet']);
113 }
114
115 return $err;
116 }
117
118
119 /**
120 * Associer un point géolocalisé a des objets listes sous forme
121 * array($objet=>$id_objets,...)
122 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
123 *
124 * on peut passer optionnellement une qualification du (des) lien(s) qui sera
125 * alors appliquee dans la foulee.
126 * En cas de lot de liens, c'est la meme qualification qui est appliquee a tous
127 *
128 * @param int $id_gis
129 * @param array $objets
130 * @param array $qualif
131 * @return string
132 */
133 function gis_associer($id_gis, $objets, $qualif = null) {
134 include_spip('action/editer_liens');
135 $res = objet_associer(array('gis'=>$id_gis), $objets, $qualif);
136 include_spip('inc/invalideur');
137 suivre_invalideur("id='gis/$id_gis'");
138 return $res;
139 }
140
141 /**
142 * Dissocier un point géolocalisé des objets listes sous forme
143 * array($objet=>$id_objets,...)
144 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
145 *
146 * un * pour $id_auteur,$objet,$id_objet permet de traiter par lot
147 *
148 * @param int $id_gis
149 * @param array $objets
150 * @return string
151 */
152 function gis_dissocier($id_gis, $objets) {
153 include_spip('action/editer_liens');
154 $res = objet_dissocier(array('gis' => $id_gis), $objets);
155 include_spip('inc/invalideur');
156 suivre_invalideur("id='gis/$id_gis'");
157 return $res;
158 }
159
160 /**
161 * Supprimer définitivement un point géolocalisé
162 *
163 * @param int $id_gis identifiant numérique du point
164 * @return int|false 0 si réussite, false dans le cas ou le point n'existe pas
165 */
166 function gis_supprimer($id_gis) {
167 $valide = sql_getfetsel('id_gis', 'spip_gis', 'id_gis=' . intval($id_gis));
168 if ($valide && autoriser('supprimer', 'gis', $valide)) {
169 sql_delete('spip_gis_liens', 'id_gis=' . intval($id_gis));
170 sql_delete('spip_gis', 'id_gis=' . intval($id_gis));
171 $id_gis = 0;
172 include_spip('inc/invalideur');
173 suivre_invalideur("id='id_gis/$id_gis'");
174 return $id_gis;
175 }
176 return false;
177 }
178
179 /**
180 * Délier un point géolocalisé d'un objet SPIP
181 *
182 * @param int $id_gis identifiant numérique du point
183 * @param string $objet Le type de l'objet à lier
184 * @param int $id_objet L'identifiant numérique de l'objet lié
185 *
186 * @return bool : true si la suppression de la liaison s'est bien passée, false à l'inverse
187 */
188 function delier_gis($id_gis, $objet, $id_objet) {
189 //$objet = objet_type($objet);
190 if ($id_objet and $id_gis
191 and preg_match('/^[a-z0-9_]+$/i', $objet) # securite
192 and autoriser('delier', 'gis', $id_gis, $GLOBALS['visiteur_session'], array('objet' => $objet,'id_objet'=>$id_objet))
193 ) {
194 gis_dissocier($id_gis, array($objet => $id_objet));
195 return true;
196 }
197 return false;
198 }
199
200 /**
201 * Lier un point géolocalisé à un objet SPIP
202 *
203 * @param int $id_gis identifiant numérique du point
204 * @param string $objet Le type de l'objet à lier
205 * @param int $id_objet L'identifiant numérique de l'objet lié
206 *
207 * @return bool : true si la liaison s'est bien passée, false à l'inverse
208 */
209 function lier_gis($id_gis, $objet, $id_objet) {
210 //$objet = objet_type($objet);
211 if ($id_objet and $id_gis
212 and preg_match('/^[a-z0-9_]+$/i', $objet) # securite
213 and !sql_getfetsel('id_gis', 'spip_gis_liens', "id_gis=$id_gis AND id_objet=$id_objet AND objet=".sql_quote($objet))
214 and autoriser('lier', 'gis', $id_gis, $GLOBALS['visiteur_session'], array('objet' => $objet,'id_objet'=>$id_objet))
215 ) {
216 gis_associer($id_gis, array($objet=>$id_objet));
217 return true;
218 }
219 return false;
220 }
221
222 function insert_gis() {
223 return gis_inserer();
224 }
225 function revisions_gis($id_gis, $c = false) {
226 return gis_modifier($id_gis, $c);
227 }
228 function supprimer_gis($id_gis) {
229 return gis_supprimer($id_gis);
230 }