Subversion Repositories eFlore/Applications.coel

Rev

Rev 1733 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1733 Rev 1765
1
<?php
1
<?php
2
/**
2
/**
3
 * Service fournissant la liste des structures et leurs informations.
3
 * Service fournissant la liste des structures et leurs informations.
4
 * 
4
 * 
5
 * @author Raphaël Droz <raphael@tela-botanica.org>
5
 * @author Raphaël Droz <raphael@tela-botanica.org>
6
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
6
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
7
 * @Copyright (c) 2009, 2013 Tela Botanica (accueil@tela-botanica.org)
7
 * @Copyright (c) 2009, 2013 Tela Botanica (accueil@tela-botanica.org)
8
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
8
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
9
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
9
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
10
 */
10
 */
11
class CoelStructure extends Coel {
11
class CoelStructure extends Coel {
12
 
12
 
13
	static $optional_bool_fields = array(
13
	static $optional_bool_fields = array(
14
		'cs_nbre_personne',
14
		'cs_nbre_personne',
15
		'csc_mark_formation', 'csc_mark_formation_interet',
15
		'csc_mark_formation', 'csc_mark_formation_interet',
16
		'csc_mark_collection_commune', 'csc_mark_acces_controle', 'csc_mark_restauration', 'csc_mark_traitement',
16
		'csc_mark_collection_commune', 'csc_mark_acces_controle', 'csc_mark_restauration', 'csc_mark_traitement',
17
		'csc_mark_acquisition_collection', 'csc_mark_acquisition_echantillon',
17
		'csc_mark_acquisition_collection', 'csc_mark_acquisition_echantillon',
18
		'csv_mark_action', 'csv_mark_action_future', 'csv_mark_recherche', 'csv_mark_acces_ss_motif', 'csv_mark_visite_avec_motif',
18
		'csv_mark_action', 'csv_mark_action_future', 'csv_mark_recherche', 'csv_mark_acces_ss_motif', 'csv_mark_visite_avec_motif',
19
		'cs_latitude', 'cs_longitude',
19
		'cs_latitude', 'cs_longitude',
20
	);
20
	);
21
 
21
 
22
	// ATTENTION : tjrs garder la table principale en premier, puis mettre les tables spécialisées.
22
	// ATTENTION : tjrs garder la table principale en premier, puis mettre les tables spécialisées.
23
	protected $tables = array(	120 => array(
23
	protected $tables = array(	120 => array(
24
		'nom' => 'coel_structure', 
24
		'nom' => 'coel_structure', 
25
		'prefixe' => 'cs', 
25
		'prefixe' => 'cs', 
26
		'id' => array('cs_id_structure')),
26
		'id' => array('cs_id_structure')),
27
	122 => array(
27
	122 => array(
28
		'nom' => 'coel_structure_conservation', 
28
		'nom' => 'coel_structure_conservation', 
29
		'prefixe' => 'csc',
29
		'prefixe' => 'csc',
30
		'id' => array('csc_id_structure')),
30
		'id' => array('csc_id_structure')),
31
	123 => array(
31
	123 => array(
32
		'nom' => 'coel_structure_valorisation', 
32
		'nom' => 'coel_structure_valorisation', 
33
		'prefixe' => 'csv',
33
		'prefixe' => 'csv',
34
		'id' => array('csv_id_structure')));	
34
		'id' => array('csv_id_structure')));	
35
 
35
 
36
	/**
36
	/**
37
	 * Méthode principale appelée avec une requête de type GET.
37
	 * Méthode principale appelée avec une requête de type GET.
38
	 */
38
	 */
39
	public function getElement($param = array()) {
39
	public function getElement($param = array()) {
40
		// Initialisation des variables
40
		// Initialisation des variables
41
		$info = array();
41
		$info = array();
42
				
42
				
43
		// Nour recherchons le type de requête demandé
43
		// Nour recherchons le type de requête demandé
44
		$type = $param[0];
44
		$type = $param[0];
45
				 
45
				 
46
		if ($type == '*' || is_numeric($type)) {
46
		if ($type == '*' || is_numeric($type)) {
47
			// Pré traitement des paramêtres
47
			// Pré traitement des paramêtres
48
			$p = $this->traiterParametresUrl(array('id_projet', 'id_structure', 'recherche'), $param);
48
			$p = $this->traiterParametresUrl(array('id_structure', 'recherche'), $param);
49
			$info = $this->getElementParDefaut($p);
49
			$info = $this->getElementParDefaut($p);
50
		} else {
50
		} else {
51
			$methode = 'getElement'.$type;
51
			$methode = 'getElement'.$type;
52
			if (method_exists($this, $methode)) {
52
			if (method_exists($this, $methode)) {
53
				array_shift($param);
53
				array_shift($param);
54
				$info = $this->$methode($param);
54
				$info = $this->$methode($param);
55
			} else {
55
			} else {
56
				$this->messages[] = "Le type d'information demandé '$type' n'est pas disponible.";
56
				$this->messages[] = "Le type d'information demandé '$type' n'est pas disponible.";
57
			}
57
			}
58
		}
58
		}
59
		
59
		
60
		// Envoie sur la sortie standard
60
		// Envoie sur la sortie standard
61
		$this->envoyer($info);
61
		$this->envoyer($info);
62
	}
62
	}
63
	
63
	
64
	/**
64
	/**
65
	 * Méthode par défaut pour garder la compatibilité avec Coel.
65
	 * Méthode par défaut pour garder la compatibilité avec Coel.
66
	 * Appelée avec les paramêtres d'url suivant :
66
	 * Appelée avec les paramêtres d'url suivant :
67
	 * /CoelStructure/_/_/_
67
	 * /CoelStructure/_/_/_
68
	 * ou les _ représentent dans l'ordre : id_projet, id_structure et nom
68
	 * ou les _ représentent dans l'ordre : id_structure et nom
69
	 * Si un des paramêtres est abscent, il prendre la valeur *
69
	 * Si un des paramêtres est abscent, il prendre la valeur *
70
	 */
70
	 */
71
	public function getElementParDefaut($p) {
71
	public function getElementParDefaut($p) {
72
		// Initialisation des variables
72
		// Initialisation des variables
73
		$info = array();
73
		$info = array();
74
 
74
 
75
		$whereClause = array();
75
		$whereClause = array();
76
		if(isset($p['id_projet'])) $whereClause[] = "cs_ce_projet = {$p['id_projet']}";
-
 
77
		if(isset($p['id_structure'])) $whereClause[] = "cs_id_structure = {$p['id_structure']}";
76
		if(isset($p['id_structure'])) $whereClause[] = "cs_id_structure = {$p['id_structure']}";
78
 
77
 
79
		if(isset($p['recherche'])) {
78
		if(isset($p['recherche'])) {
80
			if(@$this->searchCity && trim($this->searchCity) == 'true') {
79
			if(@$this->searchCity && trim($this->searchCity) == 'true') {
81
				$whereClause[] = "(" . implode(" OR ", array("cs_nom LIKE {$p['recherche']}", "cs_ville LIKE {$p['recherche']}")) . ")";
80
				$whereClause[] = "(" . implode(" OR ", array("cs_nom LIKE {$p['recherche']}", "cs_ville LIKE {$p['recherche']}")) . ")";
82
			} else {
81
			} else {
83
				$whereClause[] = "cs_nom LIKE {$p['recherche']}";
82
				$whereClause[] = "cs_nom LIKE {$p['recherche']}";
84
			}
83
			}
85
		}
84
		}
86
 
85
 
87
		// Construction de la requête
86
		// Construction de la requête
88
		$requete = sprintf(
87
		$requete = sprintf(
89
			'SELECT SQL_CALC_FOUND_ROWS %s cs.*, csc.*, csv.*, cmhl_date_modification, cmhl_notes, cmhl_source, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip '
88
			'SELECT SQL_CALC_FOUND_ROWS %s cs.*, csc.*, csv.*, cmhl_date_modification, cmhl_notes, cmhl_source, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip '
90
			. ' FROM coel_structure AS cs '
89
			. ' FROM coel_structure AS cs '
91
			. ' LEFT JOIN coel_meta_historique_ligne ON (cs_ce_meta = cmhl_id_historique_ligne) '
90
			. ' LEFT JOIN coel_meta_historique_ligne ON (cs_ce_meta = cmhl_id_historique_ligne) '
92
			. ' LEFT JOIN coel_structure_conservation AS csc ON (cs_id_structure = csc_id_structure) '
91
			. ' LEFT JOIN coel_structure_conservation AS csc ON (cs_id_structure = csc_id_structure) '
93
			. ' LEFT JOIN coel_structure_valorisation AS csv ON (cs_id_structure = csv_id_structure) '
92
			. ' LEFT JOIN coel_structure_valorisation AS csv ON (cs_id_structure = csv_id_structure) '
94
			. ' WHERE %s ORDER BY %s LIMIT %d, %d -- %s:%d',
93
			. ' WHERE %s ORDER BY %s LIMIT %d, %d -- %s:%d',
95
 
94
 
96
			$this->distinct ? 'DISTINCT' : '',
95
			$this->distinct ? 'DISTINCT' : '',
97
			$whereClause ? implode(" AND ", $whereClause) : TRUE,
96
			$whereClause ? implode(" AND ", $whereClause) : TRUE,
98
			is_null($this->orderby) ? 'cs.cs_nom ASC' : $this->orderby,
97
			is_null($this->orderby) ? 'cs.cs_nom ASC' : $this->orderby,
99
			$this->start, $this->limit,
98
			$this->start, $this->limit,
100
			__FILE__, __LINE__);
99
			__FILE__, __LINE__);
101
 
100
 
102
		// Récupération des résultats
101
		// Récupération des résultats
103
		try {
102
		try {
104
			// SPÉCIAL :
103
			// SPÉCIAL :
105
			// Lorsqu'on cherche une seule structure avec un id passé en paramêtre, nous devons renvoyer un objet
104
			// Lorsqu'on cherche une seule structure avec un id passé en paramêtre, nous devons renvoyer un objet
106
			$donnees = ($this->formatRetour == 'objet' && isset($p['id_structure'])) ? $this->bdd->query($requete)->fetch(PDO::FETCH_OBJ) : $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
105
			$donnees = ($this->formatRetour == 'objet' && isset($p['id_structure'])) ? $this->bdd->query($requete)->fetch(PDO::FETCH_OBJ) : $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
107
			if ($donnees === false) {
106
			if ($donnees === false) {
108
				$this->messages[] = "La requête a retourné aucun résultat.";
107
				$this->messages[] = "La requête a retourné aucun résultat.";
109
			}
108
			}
110
 
109
 
111
			// l'UI java n'aime pas les NULL
110
			// l'UI java n'aime pas les NULL
112
			if(!is_array($donnees)) {
111
			if(!is_array($donnees)) {
113
				// $donnees est un objet PHP
112
				// $donnees est un objet PHP
114
				array_walk($donnees, create_function('&$val', '$val = is_null($val) ? "" : $val;'));
113
				array_walk($donnees, create_function('&$val', '$val = is_null($val) ? "" : $val;'));
115
			}
114
			}
116
			else {
115
			else {
117
				// $donnees est un tableau d'objets PHP
116
				// $donnees est un tableau d'objets PHP
118
				foreach($donnees as &$structure) {
117
				foreach($donnees as &$structure) {
119
					array_walk($structure, create_function('&$val', '$val = is_null($val) ? "" : $val;'));
118
					array_walk($structure, create_function('&$val', '$val = is_null($val) ? "" : $val;'));
120
				}
119
				}
121
			}
120
			}
122
 
121
 
123
			$elements_nbre = $this->bdd->query("SELECT FOUND_ROWS() AS c")->fetch(PDO::FETCH_ASSOC);
122
			$elements_nbre = $this->bdd->query("SELECT FOUND_ROWS() AS c")->fetch(PDO::FETCH_ASSOC);
124
			$info['nbElements'] = intval($elements_nbre['c']);
123
			$info['nbElements'] = intval($elements_nbre['c']);
125
			$info['structures'] = $donnees;			
124
			$info['structures'] = $donnees;			
126
		} catch (PDOException $e) {
125
		} catch (PDOException $e) {
127
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
126
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
128
		}
127
		}
129
 
128
 
130
		return $info;
129
		return $info;
131
	}
130
	}
132
	
131
	
133
	/* Méthode pour récupérer le nombre de structure par zone géographique.
132
	/* Méthode pour récupérer le nombre de structure par zone géographique.
134
	 * Appelée avec les paramêtres d'url suivant :
133
	 * Appelée avec les paramêtres d'url suivant :
135
	 * /CoelStructure/ParZoneGeo/_
134
	 * /CoelStructure/ParZoneGeo/_
136
	 * ou les _ représentent dans l'ordre : type.
135
	 * ou les _ représentent dans l'ordre : type.
137
	 * ou type peut valoir: FRD (= département français) 
136
	 * ou type peut valoir: FRD (= département français) 
138
	 * Si un des paramêtres est abscent, il prendre la valeur *
137
	 * Si un des paramêtres est abscent, il prendre la valeur *
139
	 */
138
	 */
140
	public function getElementParZoneGeo($param) {
139
	public function getElementParZoneGeo($param) {
141
		// Pré traitement des paramêtres
140
		// Pré traitement des paramêtres
142
		$p = $this->traiterParametresUrl(array('type', 'projets'), $param);
141
		$p = $this->traiterParametresUrl(array('type'), $param);
143
		if (!isset($p['type'])) {
142
		if (!isset($p['type'])) {
144
			$this->messages[] = "Il est obligatoire d'indiquer type de recherche pour utiliser ce service.";
143
			$this->messages[] = "Il est obligatoire d'indiquer type de recherche pour utiliser ce service.";
145
			return array();
144
			return array();
146
		}
145
		}
147
 
146
 
148
		// Construction de la requête
147
		// Construction de la requête
149
		$requete =	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '.
148
		$requete =	(($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '.
150
			'	IF ( SUBSTRING( cs_code_postal FROM 1 FOR 2 ) >= 96, '.
149
			'	IF ( SUBSTRING( cs_code_postal FROM 1 FOR 2 ) >= 96, '.
151
			'		SUBSTRING( cs_code_postal FROM 1 FOR 3 ), '.
150
			'		SUBSTRING( cs_code_postal FROM 1 FOR 3 ), '.
152
			'		SUBSTRING( cs_code_postal FROM 1 FOR 2 ) ) AS id, '.
151
			'		SUBSTRING( cs_code_postal FROM 1 FOR 2 ) ) AS id, '.
153
			'	COUNT( cs_id_structure ) AS nbre '.
152
			'	COUNT( cs_id_structure ) AS nbre '.
154
			'FROM coel_structure '.
153
			'FROM coel_structure '.
155
			'WHERE cs_ce_truk_pays = 2654 '.
154
			'WHERE cs_ce_truk_pays = 2654 '.
156
			(isset($p['projets']) ? "	AND cs_ce_projet IN ({$p['projets']}) " : '').
-
 
157
			'GROUP BY IF ( SUBSTRING( cs_code_postal FROM 1 FOR 2 ) >= 96, '.
155
			'GROUP BY IF ( SUBSTRING( cs_code_postal FROM 1 FOR 2 ) >= 96, '.
158
			'	SUBSTRING( cs_code_postal FROM 1 FOR 3 ), '.
156
			'	SUBSTRING( cs_code_postal FROM 1 FOR 3 ), '.
159
			'	SUBSTRING( cs_code_postal FROM 1 FOR 2 ) ) '.
157
			'	SUBSTRING( cs_code_postal FROM 1 FOR 2 ) ) '.
160
			'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'id ASC').' ';
158
			'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby  : 'id ASC').' ';
161
 
159
 
162
		// Récupération des résultats
160
		// Récupération des résultats
163
		try {
161
		try {
164
			$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
162
			$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
165
		} catch (PDOException $e) {
163
		} catch (PDOException $e) {
166
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
164
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
167
		}
165
		}
168
 
166
 
169
		if ($donnees === false) {
167
		if ($donnees === false) {
170
			$this->messages[] = "La requête a retourné aucun résultat.";
168
			$this->messages[] = "La requête a retourné aucun résultat.";
171
			return array();
169
			return array();
172
		}
170
		}
173
 
171
 
174
		$info = array();
172
		$info = array();
175
		foreach ($donnees as $donnee) {
173
		foreach ($donnees as $donnee) {
176
			$info[$donnee['id']] = $donnee['nbre'];
174
			$info[$donnee['id']] = $donnee['nbre'];
177
		}
175
		}
178
		return $info;
176
		return $info;
179
	}
177
	}
180
 
178
 
181
 
179
 
182
	static function NULLifNotNum(&$params, $keys_to_null) {
180
	static function NULLifNotNum(&$params, $keys_to_null) {
183
		foreach($keys_to_null as $v) {
181
		foreach($keys_to_null as $v) {
184
			if(! array_key_exists($v, $params)) continue;
182
			if(! array_key_exists($v, $params)) continue;
185
			if(!is_numeric($params[$v]) && ! preg_match('/^-?\d+,\d*$/', $params[$v])) {
183
			if(!is_numeric($params[$v]) && ! preg_match('/^-?\d+,\d*$/', $params[$v])) {
186
				$params[$v] = NULL;
184
				$params[$v] = NULL;
187
			}
185
			}
188
			else {
186
			else {
189
				$params[$v] = str_replace(',', '.', $params[$v]);
187
				$params[$v] = str_replace(',', '.', $params[$v]);
190
			}
188
			}
191
 
189
 
192
		}
190
		}
193
	}
191
	}
194
	
192
	
195
	/**
193
	/**
196
	 * Méthode appelée pour ajouter un élément.
194
	 * Méthode appelée pour ajouter un élément.
197
	 */
195
	 */
198
	public function createElement($params) {
196
	public function createElement($params) {
199
		// Identification de l'utilisateur
197
		// Identification de l'utilisateur
200
		list($id_utilisateur, $id_session) = $this->getIdentification($params);
198
		list($id_utilisateur, $id_session) = $this->getIdentification($params);
201
 
199
 
202
		// Contrôle du non détournement de l'utilisateur
200
		// Contrôle du non détournement de l'utilisateur
203
		if (!$this->etreAutorise($id_utilisateur)) {
201
		if (!$this->etreAutorise($id_utilisateur)) {
204
			$this->envoyer();
202
			$this->envoyer();
205
			return;
203
			return;
206
		}
204
		}
207
		try {
205
		try {
208
			$form_needs_refresh = self::callNominatim($params, $this->bdd);
206
			$form_needs_refresh = self::callNominatim($params, $this->bdd);
209
 
207
 
210
			self::NULLifNotNum($params, self::$optional_bool_fields);
208
			self::NULLifNotNum($params, self::$optional_bool_fields);
211
 
209
 
212
			// Vérification des tables à vraiment mettre à jour en fonction des données passées.
210
			// Vérification des tables à vraiment mettre à jour en fonction des données passées.
213
			$tables_a_modifier = $this->recupererTablesAModifier($params);
211
			$tables_a_modifier = $this->recupererTablesAModifier($params);
214
			reset($tables_a_modifier);
212
			reset($tables_a_modifier);
215
 
213
 
216
			$id_structure = null;
214
			$id_structure = null;
217
			while (list($table_id, $table) = each($tables_a_modifier)) {
215
			while (list($table_id, $table) = each($tables_a_modifier)) {
218
				if (is_null($table['champs'])) continue;
216
				if (is_null($table['champs'])) continue;
219
				if ($this->avoirCleComplete($table)) {
217
				if ($this->avoirCleComplete($table)) {
220
					$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
218
					$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
221
					continue;
219
					continue;
222
				}
220
				}
223
 
221
 
224
				// Ajout des données à la table des données
222
				// Ajout des données à la table des données
225
				$id_structure = $this->ajouter($table);
223
				$id_structure = $this->ajouter($table);
226
				if ($id_structure === false) continue;
224
				if ($id_structure === false) continue;
227
 
225
 
228
				$table['champs_valeurs_id']['cs_id_structure'] = $id_structure;
226
				$table['champs_valeurs_id']['cs_id_structure'] = $id_structure;
229
				$table['champs_valeurs_brut']['cs_id_structure'] = $id_structure;
227
				$table['champs_valeurs_brut']['cs_id_structure'] = $id_structure;
230
				$tables_a_modifier[122]['champs_valeurs_id']['csc_id_structure'] = $id_structure;
228
				$tables_a_modifier[122]['champs_valeurs_id']['csc_id_structure'] = $id_structure;
231
				$tables_a_modifier[122]['champs_valeurs_brut']['csc_id_structure'] = $id_structure;
229
				$tables_a_modifier[122]['champs_valeurs_brut']['csc_id_structure'] = $id_structure;
232
				$tables_a_modifier[122]['champs_valeurs_protege']['csc_id_structure'] = $this->bdd->quote($id_structure);
230
				$tables_a_modifier[122]['champs_valeurs_protege']['csc_id_structure'] = $this->bdd->quote($id_structure);
233
				$tables_a_modifier[123]['champs_valeurs_id']['csv_id_structure'] = $id_structure;
231
				$tables_a_modifier[123]['champs_valeurs_id']['csv_id_structure'] = $id_structure;
234
				$tables_a_modifier[123]['champs_valeurs_brut']['csv_id_structure'] = $id_structure;
232
				$tables_a_modifier[123]['champs_valeurs_brut']['csv_id_structure'] = $id_structure;
235
				$tables_a_modifier[123]['champs_valeurs_protege']['csv_id_structure'] = $this->bdd->quote($id_structure);
233
				$tables_a_modifier[123]['champs_valeurs_protege']['csv_id_structure'] = $this->bdd->quote($id_structure);
236
 
234
 
237
				// Historisation (Ajout des méta-données)
235
				// Historisation (Ajout des méta-données)
238
				$etat = 1; // Ajout
236
				$etat = 1; // Ajout
239
				$cle = $this->recupererCle($table);
237
				$cle = $this->recupererCle($table);
240
				$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
238
				$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
241
				$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
239
				$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
242
								
240
								
243
				// Liaison de la table des données à ses méta-données
241
				// Liaison de la table des données à ses méta-données
244
				$champ_meta = "{$table['prefixe']}_ce_meta";
242
				$champ_meta = "{$table['prefixe']}_ce_meta";
245
				$table['champs_valeurs_protege'] = array($champ_meta => $id_meta);
243
				$table['champs_valeurs_protege'] = array($champ_meta => $id_meta);
246
				$this->modifier($table);
244
				$this->modifier($table);
247
			}
245
			}
248
 
246
 
249
			if(isset($params['cpr_abreviation']) && !empty($params['cpr_abreviation'])) {
247
			if(isset($params['cpr_abreviation']) && !empty($params['cpr_abreviation'])) {
250
				$this->ajouterGuid($params['cpr_abreviation'], $id_structure);
248
				$this->ajouterGuid($params['cpr_abreviation'], $id_structure);
251
			}
249
			}
252
		} catch (PDOException $e) {
250
		} catch (PDOException $e) {
253
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
251
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
254
		}
252
		}
255
 
253
 
256
		if($form_needs_refresh) { // coordonnées mises à jour en DB: en informer le formulaire
254
		if($form_needs_refresh) { // coordonnées mises à jour en DB: en informer le formulaire
257
			$this->envoyer($this->getElementParDefaut(array('id_structure' => $id_structure)));
255
			$this->envoyer($this->getElementParDefaut(array('id_structure' => $id_structure)));
258
			exit;
256
			exit;
259
		}
257
		}
260
	
258
	
261
		$this->envoyer($id_structure);
259
		$this->envoyer($id_structure);
262
	}
260
	}
263
 
261
 
264
	/**
262
	/**
265
	 * Méthode appelée pour mettre à jour un élément
263
	 * Méthode appelée pour mettre à jour un élément
266
	 */
264
	 */
267
	public function updateElement($uid, $params) {
265
	public function updateElement($uid, $params) {
268
		// Vérification de la présence des id passés par l'url
266
		// Vérification de la présence des id passés par l'url
269
		if (!isset($uid[0])) {
267
		if (!isset($uid[0])) {
270
			$this->messages[] = "Identifiant de structure manquant. Vous ne devriez pas avoir accès à ce service.";
268
			$this->messages[] = "Identifiant de structure manquant. Vous ne devriez pas avoir accès à ce service.";
271
			$this->envoyer();
269
			$this->envoyer();
272
			return;
270
			return;
273
		}
271
		}
274
 
272
 
275
		// Identification de l'utilisateur
273
		// Identification de l'utilisateur
276
		list($id_utilisateur, $id_session) = $this->getIdentification($params);
274
		list($id_utilisateur, $id_session) = $this->getIdentification($params);
277
		// Contrôle du non détournement de l'utilisateur
275
		// Contrôle du non détournement de l'utilisateur
278
		if (!$this->etreAutorise($id_utilisateur)) {
276
		if (!$this->etreAutorise($id_utilisateur)) {
279
			$this->envoyer();
277
			$this->envoyer();
280
			return;
278
			return;
281
		}
279
		}
282
		try {
280
		try {
283
			$form_needs_refresh = self::callNominatim($params, $this->bdd);
281
			$form_needs_refresh = self::callNominatim($params, $this->bdd);
284
 
282
 
285
			self::NULLifNotNum($params, self::$optional_bool_fields);
283
			self::NULLifNotNum($params, self::$optional_bool_fields);
286
 
284
 
287
			// Vérification des tables à vraiment mettre à jour en fonction des données passées.
285
			// Vérification des tables à vraiment mettre à jour en fonction des données passées.
288
			$tables_a_modifier = $this->recupererTablesAModifier($params);
286
			$tables_a_modifier = $this->recupererTablesAModifier($params);
289
			// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
287
			// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
290
			foreach ($tables_a_modifier as $table_id => $table) {
288
			foreach ($tables_a_modifier as $table_id => $table) {
291
				if(@$table['nom'] == 'coel_structure' && !$this->avoirCleComplete($table)) {
289
				if(@$table['nom'] == 'coel_structure' && !$this->avoirCleComplete($table)) {
292
					error_log("tentative d'UPDATE sans contrainte de WHERE, \$table = " . print_r($table, TRUE));
290
					error_log("tentative d'UPDATE sans contrainte de WHERE, \$table = " . print_r($table, TRUE));
293
					continue; // ne pas mettre à jour sans contrainte de WHERE
291
					continue; // ne pas mettre à jour sans contrainte de WHERE
294
				}
292
				}
295
				$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
293
				$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
296
			}
294
			}
297
		} catch (PDOException $e) {
295
		} catch (PDOException $e) {
298
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
296
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
299
		}
297
		}
300
 
298
 
301
		// Envoie sur la sortie standard
299
		// Envoie sur la sortie standard
302
 
300
 
303
		if($form_needs_refresh) { // coordonnées mises à jour en DB: en informer le formulaire (si resté ouvert)
301
		if($form_needs_refresh) { // coordonnées mises à jour en DB: en informer le formulaire (si resté ouvert)
304
			$this->envoyer($this->getElementParDefaut(array('id_structure' => $uid[0])));
302
			$this->envoyer($this->getElementParDefaut(array('id_structure' => $uid[0])));
305
			exit;
303
			exit;
306
		}
304
		}
307
		$this->envoyer(); // OK par défaut
305
		$this->envoyer(); // OK par défaut
308
	}
306
	}
309
	
307
	
310
	/**
308
	/**
311
	 * Méthode appelée pour supprimer un élément
309
	 * Méthode appelée pour supprimer un élément
312
	 */
310
	 */
313
	public function deleteElement($uid) {
311
	public function deleteElement($uid) {
314
		// NOTES : une structure ne peut pas être supprimée si elle possède des collections liées.
312
		// NOTES : une structure ne peut pas être supprimée si elle possède des collections liées.
315
		// Vérification de la présence des id passés par l'url
313
		// Vérification de la présence des id passés par l'url
316
		if (!isset($uid[0]) || !isset($uid[1])) {
314
		if (!isset($uid[0]) || !isset($uid[1])) {
317
			$this->messages[] = "Identifiant de structure ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
315
			$this->messages[] = "Identifiant de structure ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
318
			$this->envoyer();
316
			$this->envoyer();
319
			return;
317
			return;
320
		}
318
		}
321
 
319
 
322
		// Identification de l'utilisateur
320
		// Identification de l'utilisateur
323
		list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
321
		list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
324
		// Contrôle du non détournement de l'utilisateur		
322
		// Contrôle du non détournement de l'utilisateur		
325
		if (! $this->etreAutorise($id_utilisateur)) {
323
		if (! $this->etreAutorise($id_utilisateur)) {
326
			$this->envoyer();
324
			$this->envoyer();
327
			return;
325
			return;
328
		}
326
		}
329
 
327
 
330
		// Récupération des id passés par l'url
328
		// Récupération des id passés par l'url
331
		$identifiants = explode(',', rtrim($uid[1], ','));
329
		$identifiants = explode(',', rtrim($uid[1], ','));
332
 
330
 
333
		if (count($identifiants) == 0) {
331
		if (count($identifiants) == 0) {
334
			$this->messages[] = "Aucun enregistrement n'a été supprimé.";
332
			$this->messages[] = "Aucun enregistrement n'a été supprimé.";
335
			$this->envoyer();
333
			$this->envoyer();
336
			return;
334
			return;
337
		}
335
		}
338
	
336
	
339
		try {
337
		try {
340
			foreach ($identifiants as $id_structure) {
338
			foreach ($identifiants as $id_structure) {
341
				// Vérification que la structure ne possède pas de collections liées
339
				// Vérification que la structure ne possède pas de collections liées
342
				if (self::verifierPresenceCollection($this->bdd, $id_structure)) {
340
				if (self::verifierPresenceCollection($this->bdd, $id_structure)) {
343
					$this->messages[] = "La structure '$id_structure' ne peut pas être supprimée car elle possède des collections liées.";
341
					$this->messages[] = "La structure '$id_structure' ne peut pas être supprimée car elle possède des collections liées.";
344
					continue;
342
					continue;
345
				}
343
				}
346
 
344
 
347
				$params = array('cs_id_structure' => $id_structure, 'csc_id_structure' => $id_structure, 'csv_id_structure' => $id_structure);
345
				$params = array('cs_id_structure' => $id_structure, 'csc_id_structure' => $id_structure, 'csv_id_structure' => $id_structure);
348
				$tables_a_modifier = $this->recupererTablesAModifier($params);
346
				$tables_a_modifier = $this->recupererTablesAModifier($params);
349
								
347
								
350
				foreach ($tables_a_modifier as $table_id => $table) {
348
				foreach ($tables_a_modifier as $table_id => $table) {
351
					if (! $this->avoirEnregistrement($table)) continue;
349
					if (! $this->avoirEnregistrement($table)) continue;
352
 
350
 
353
					if ($this->supprimer($table) === true) {
351
					if ($this->supprimer($table) === true) {
354
						// Historisation (Ajout des méta-données)
352
						// Historisation (Ajout des méta-données)
355
						$cle = $this->recupererCle($table);
353
						$cle = $this->recupererCle($table);
356
						$this->historiser($table_id, $cle, 'NULL', $id_utilisateur, 3, $id_session);
354
						$this->historiser($table_id, $cle, 'NULL', $id_utilisateur, 3, $id_session);
357
					}
355
					}
358
				}
356
				}
359
			}
357
			}
360
		} catch (PDOException $e) {
358
		} catch (PDOException $e) {
361
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
359
			$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
362
		}
360
		}
363
 
361
 
364
		// Envoie sur la sortie standard
362
		// Envoie sur la sortie standard
365
		$this->envoyer();
363
		$this->envoyer();
366
	}
364
	}
367
	
365
	
368
	static function verifierPresenceCollection($db, $id_structure) {
366
	static function verifierPresenceCollection($db, $id_structure) {
369
		// Vérification que la structure ne possède pas de collections liées
367
		// Vérification que la structure ne possède pas de collections liées
370
		return ($db->query(sprintf(
368
		return ($db->query(sprintf(
371
			'SELECT COUNT(cc_id_collection) AS nbre_collection FROM coel_collection ' .
369
			'SELECT COUNT(cc_id_collection) AS nbre_collection FROM coel_collection ' .
372
			' WHERE cc_ce_structure = %d GROUP BY cc_ce_structure ',
370
			' WHERE cc_ce_structure = %d GROUP BY cc_ce_structure ',
373
			$id_structure))->fetchColumn() != 0);
371
			$id_structure))->fetchColumn() != 0);
374
	}
372
	}
375
 
373
 
376
	static function callNominatim(&$params, $db = NULL) {
374
	static function callNominatim(&$params, $db = NULL) {
377
		// lon/lat déjà saisies ?
375
		// lon/lat déjà saisies ?
378
		if (@$params['cs_latitude'] && @$params['cs_longitude']) return FALSE;
376
		if (@$params['cs_latitude'] && @$params['cs_longitude']) return FALSE;
379
 
377
 
380
		// ni adresse, ni CP, ni ville ? rien n'est possible
378
		// ni adresse, ni CP, ni ville ? rien n'est possible
381
		if (!@$params['cs_adresse_01'] && !@$params['cs_code_postal'] && !@$params['cs_ville']) return FALSE;
379
		if (!@$params['cs_adresse_01'] && !@$params['cs_code_postal'] && !@$params['cs_ville']) return FALSE;
382
 
380
 
383
		$lonlat = array();
381
		$lonlat = array();
384
		if(Coel::coordGuess(Coel::addrReStruct($params, $db), $lonlat)) {
382
		if(Coel::coordGuess(Coel::addrReStruct($params, $db), $lonlat)) {
385
			$params['cs_latitude'] = $lonlat['lat'];
383
			$params['cs_latitude'] = $lonlat['lat'];
386
			$params['cs_longitude'] = $lonlat['lon'];
384
			$params['cs_longitude'] = $lonlat['lon'];
387
			return TRUE;
385
			return TRUE;
388
		}
386
		}
389
 
387
 
390
		// second guess, sans code postal
388
		// second guess, sans code postal
391
		if(@$params['cs_code_postal']) {
389
		if(@$params['cs_code_postal']) {
392
			$params2 = $params;
390
			$params2 = $params;
393
			unset($params2['cs_code_postal']);
391
			unset($params2['cs_code_postal']);
394
			if(Coel::coordGuess(Coel::addrReStruct($params2, $db), $lonlat)) {
392
			if(Coel::coordGuess(Coel::addrReStruct($params2, $db), $lonlat)) {
395
				$params['cs_latitude'] = $lonlat['lat'];
393
				$params['cs_latitude'] = $lonlat['lat'];
396
				$params['cs_longitude'] = $lonlat['lon'];
394
				$params['cs_longitude'] = $lonlat['lon'];
397
				return TRUE;
395
				return TRUE;
398
			}
396
			}
399
		}
397
		}
400
		return FALSE;
398
		return FALSE;
401
	}
399
	}
402
	
400
	
403
	private function ajouterGuid($abr_projet, $id_structure) {
401
	private function ajouterGuid($id_structure) {
404
		if ($id_structure !== false) {
402
		if ($id_structure !== false) {
405
			$table_guid = $this->tables[120];
403
			$table_guid = $this->tables[120];
406
			$table_guid['champs_valeurs_id']['cs_id_structure'] = $id_structure;
404
			$table_guid['champs_valeurs_id']['cs_id_structure'] = $id_structure;
407
			$table_guid['champs_valeurs_protege']['cs_guid'] = $this->bdd->quote(sprintf($this->config['coel']['guid'], $abr_projet, 'str'.$id_structure));
405
			$table_guid['champs_valeurs_protege']['cs_guid'] = $this->bdd->quote(sprintf($this->config['coel']['guid'], 'str'.$id_structure));
408
			$this->modifier($table_guid);
406
			$this->modifier($table_guid);
409
		}
407
		}
410
	}
408
	}
411
}
409
}