Subversion Repositories eFlore/Applications.cel

Rev

Rev 1527 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1527 Rev 1565
Line 1... Line 1...
1
<?php
1
<?php
2
 
-
 
3
/**
2
/**
4
* PHP Version 5
3
* PHP Version 5
-
 
4
* in=utf8
-
 
5
* out=utf8
5
*
6
*
6
* @category  PHP
7
* @category  PHP
7
* @package   jrest
8
* @package   jrest
8
* @author    Aurelien Peronnet <aurelien@tela-botanica.org>
9
* @author    Aurelien Peronnet <aurelien@tela-botanica.org>
9
* @copyright 2010 Tela-Botanica
10
* @copyright 2010 Tela-Botanica
Line 12... Line 13...
12
* @link      /doc/jrest/
13
* @link      /doc/jrest/
13
*/
14
*/
Line 14... Line 15...
14
 
15
 
15
/**
16
/**
16
* Classe de gestion de l'ajout, modification et suppression des champs supplémentaires des obs et images
-
 
17
* 
-
 
18
* in=utf8
-
 
19
* out=utf8
-
 
20
*
17
* Classe de gestion de l'ajout, modification et suppression des champs supplémentaires des obs et images
21
*/ 
18
*/
22
class GestionChampsEtendus extends Cel {
19
class GestionChampsEtendus extends Cel {
23
	
20
 
24
	private $mode = null;
21
	private $mode = null;
25
	private $table_champs_etendus = null;
22
	private $table_champs_etendus = null;
26
	private $champ_id = null;
23
	private $champ_id = null;
27
	
24
 
28
	public function GestionChampsEtendus($config, $mode) {
25
	public function GestionChampsEtendus($config, $mode) {
29
		parent::__construct($config);
26
		parent::__construct($config);
30
		$this->mode = $mode;
27
		$this->mode = $mode;
31
		
28
 
32
		if($this->mode == 'obs') {
29
		if ($this->mode == 'obs') {
33
			$this->mode = 'obs';
30
			$this->mode = 'obs';
34
			$this->table_champs_etendus = 'cel_obs_etendues';
31
			$this->table_champs_etendus = 'cel_obs_etendues';
35
			$this->champ_id = 'id_observation';
32
			$this->champ_id = 'id_observation';
36
		} else if($this->mode == 'image') {
33
		} else if ($this->mode == 'image') {
37
			$this->mode = 'image';
34
			$this->mode = 'image';
38
			$this->table_champs_etendus = 'cel_images_etendues';
35
			$this->table_champs_etendus = 'cel_images_etendues';
39
			$this->champ_id = 'id_image';
36
			$this->champ_id = 'id_image';
40
		} else {
37
		} else {
41
			throw new Exception('Mode inconnu, les modes autorisés sont "obs" et "image"');
38
			throw new Exception('Mode inconnu, les modes autorisés sont "obs" et "image"');
42
		}		
39
		}
43
	}
40
	}
44
	
41
 
45
	/**
42
	/**
46
	* Renvoie true ou false suivant que l'element indiqué possède une valeur
43
	* Renvoie true ou false suivant que l'element indiqué possède une valeur
47
	* pour la clé indiquée
44
	* pour la clé indiquée
48
	*
45
	*
49
	* @param int $id_element_lie
46
	* @param int $id_element_lie
50
	* @param string $cle
47
	* @param string $cle
51
	* @param string $valeur
48
	* @param string $valeur
52
	* @return bool
49
	* @return bool
53
	*/
50
	*/
-
 
51
	public function existe($id_element_lie, $cle) {
-
 
52
		$id = $this->proteger($id_element_lie);
54
	public function champEtenduExistePourElement($id_element_lie, $cle) {
53
		$cle = $this->proteger($cle);
-
 
54
		$requete = 'SELECT COUNT(*) >= 1 AS existe '.
55
		$requete = "SELECT COUNT(*) >= 1 as existe FROM ".$this->table_champs_etendus." ".
55
			"FROM {$this->table_champs_etendus} ".
56
					"WHERE ".$this->champ_id." = ".$this->proteger($id_element_lie)." ".
56
			"WHERE {$this->champ_id} = $id ".
Line 57... Line 57...
57
					"AND cle = ".$this->proteger($cle);
57
			"	AND cle = $cle ";
58
 
58
 
59
		$resultat = $this->executerRequete($requete);
59
		$resultat = $this->executerRequete($requete);
60
		return ($resultat[0]['existe'] == "1");
60
		return ($resultat[0]['existe'] == '1');
61
	}
61
	}
62
	
62
 
63
	/**
63
	/**
64
	* Renvoie tous les champs étendus associé à l'élément passé en paramètre
64
	* Renvoie tous les champs étendus associé à l'élément passé en paramètre
65
	*
65
	*
66
	* @param int $id_element_lie
66
	* @param int $id_element_lie
67
	* @return array
67
	* @return array tableau associatif des champs de la table etendu
68
	*/
68
	*/
69
	public function obtenirChampsEtendusPourElement($id_element_lie) {
69
	public function consulter($id_element_lie) {
70
		$requete = "SELECT * FROM ".$this->table_champs_etendus." ".
-
 
71
						"WHERE ".$this->champ_id." = ".$this->proteger($id_element_lie)." ";
70
		$id = $this->proteger($id_element_lie);
72
	
71
		$requete = "SELECT * FROM {$this->table_champs_etendus} WHERE {$this->champ_id} = $id ";
73
		$resultat = $this->executerRequete($requete);
72
		$resultat = $this->executerRequete($requete);
74
		return $resultat;
73
		return $resultat;
75
	}
74
	}
76
	
75
 
77
	/**
76
	/**
-
 
77
	* Renvoie tous les champs étendus associés aux éléments passés en paramètre.
78
	* Renvoie tous les champs étendus associés aux éléments passés en paramètre
78
	* Retour sous forme de tableau associatif de tableau d'objets ChampEtendu.
79
	* Sous forme tableau de tableaux associatifs clé valeur regroupé par id d'élement
79
	* Les objets ChampEtendu sont regroupés par id d'élement.
80
	*
80
	*
81
	* @param array $ids_element_lies
81
	* @param array $ids_element_lies tableau d'id des éléments liés (obs ou image).
82
	* @return array
82
	* @return array tableau associatif de tableau d'objets ChampEtendu.
83
	*/
83
	*/
84
	public function obtenirChampsEtendusPourElementsMultiples($ids_element_lies) {
84
	public function consulterParLots(Array $ids_element_lies) {
85
		$champs_etendus_par_element = array();
85
		$champs_etendus_par_element = array();
-
 
86
		if (!empty($ids_element_lies)) {
86
		if(!empty($ids_element_lies)) {
87
			$ids_element_lies = array_map(array($this, 'proteger'),$ids_element_lies);
87
			$ids_element_lies = array_map(array($this, 'proteger'),$ids_element_lies);
88
			$ids = implode(',', $ids_element_lies);
88
			
-
 
89
			$requete = "SELECT * FROM ".$this->table_champs_etendus." ".
-
 
90
								"WHERE ".$this->champ_id." IN (".implode(',',$ids_element_lies).") ";
89
 
91
	
90
			$requete = "SELECT * FROM {$this->table_champs_etendus} WHERE {$this->champ_id} IN ($ids) ";
92
			$resultats = $this->executerRequete($requete);
-
 
93
			
-
 
94
			$champs_etendus_par_element = array();
91
			$resultats = $this->executerRequete($requete);
95
			
92
 
96
			foreach ($resultats as &$ligne) {
93
			foreach ($resultats as &$ligne) {
97
				$id_element = $ligne[$this->champ_id];
94
				$id_element = $ligne[$this->champ_id];
98
				if(!isset($champs_etendus_par_element[$id_element])) {
95
				if (!isset($champs_etendus_par_element[$id_element])) {
-
 
96
					$champs_etendus_par_element[$id_element] = array();
-
 
97
				}
-
 
98
				$champ_etendu = new ChampEtendu();
-
 
99
				$champ_etendu->id = $id_element;
-
 
100
				$champ_etendu->cle = $ligne['cle'];
-
 
101
				$champ_etendu->label = $ligne['label'];
99
					$champs_etendus_par_element[$id_element] = array();
102
				$champ_etendu->valeur = $ligne['valeur'];
100
				}
103
 
101
				$champs_etendus_par_element[$id_element][$ligne['cle']] = $ligne['valeur'];
104
				$champs_etendus_par_element[$id_element][] = $champ_etendu;
102
			}
-
 
103
		}
105
			}
104
		
106
		}
105
		return $champs_etendus_par_element;
107
		return $champs_etendus_par_element;
106
	}
108
	}
107
	
109
 
108
	/**
110
	/**
109
	 * Ajoute un champ étendu à l'élément passé en paramètre, 
111
	 * Ajoute un champ étendu.
110
	 * si la clé existe déjà, seule valeur du champ est mise à jour
-
 
111
	 *
-
 
112
	 * @param int $id_element_lie
112
	 * Si la clé existe déjà, seule valeur du champ est mise à jour
113
	 * @param string $cle
113
	 *
114
	 * @param string $valeur
114
	 * @param ChampEtendu $champ_etendu
115
	 * @return bool 
115
	 * @return bool true si l'ajout a eu lieu
-
 
116
	 */
-
 
117
	public function ajouter(ChampEtendu $champ_etendu) {
-
 
118
		$id = $this->proteger($champ_etendu->id);
-
 
119
		$cle = $this->proteger($champ_etendu->cle);
-
 
120
		$label = $this->proteger($champ_etendu->label);
116
	 */
121
		$valeur = $this->proteger($champ_etendu->valeur);
117
	public function ajouterChampEtendu($id_element_lie, $cle, $valeur) {
122
 
118
		$requete = "INSERT INTO ".$this->table_champs_etendus." ".
123
		$requete = "INSERT INTO {$this->table_champs_etendus} ".
119
		           "(".$this->champ_id.", cle, valeur) ".
124
			"( {$this->champ_id}, cle, label, valeur) ".
Line 120... Line -...
120
		           "VALUES (".$this->proteger($id_element_lie).",".$this->proteger($cle).",".$this->proteger($valeur).") ".
-
 
121
		           "ON DUPLICATE KEY UPDATE valeur = VALUES(valeur)";
-
 
122
 
-
 
123
		// la partie on duplicate key est spécifique mysql mais il sera facile de s'en passer le jour 
-
 
124
		// où l'on change de sgbd
-
 
125
		$ajout = $this->executerRequeteSimple($requete);
-
 
126
		return ($ajout !== false);
-
 
127
	}
-
 
128
	
-
 
129
	/**
-
 
130
	* Ajoute des champs étendus à l'élément passé en paramètre,
-
 
131
	* si la clé existe déjà, seule la valeur du champ est mise à jour
-
 
132
	*
-
 
133
	* @param int $id_element_lie
-
 
134
	* @param array $cles_valeurs tableau de clés => valeurs à associer à l'élément
-
 
135
	* @return bool
-
 
136
	*/
-
 
137
	public function ajouterChampsEtendusMultiples($id_element_lie, $cles_valeurs) {
-
 
138
				
-
 
139
		$lignes = array();
-
 
140
		foreach($cles_valeurs as $cle => $valeur) {
-
 
141
			$lignes[] = "(".$this->proteger($id_element_lie).",".$this->proteger($cle).",".$this->proteger($valeur).")";
-
 
142
		}
-
 
143
		
-
 
144
		$requete = "INSERT INTO ".$this->table_champs_etendus." ".
-
 
145
			           "(".$this->champ_id.", cle, valeur) ".
-
 
146
			           "VALUES ".implode(',', $lignes)." ".
125
			"VALUES ($id, $cle, $label, $valeur) ".
147
			           "ON DUPLICATE KEY UPDATE valeur = VALUES(valeur)";
126
			"ON DUPLICATE KEY UPDATE valeur = VALUES(valeur)";
148
	
127
 
149
		// la partie on duplicate key est spécifique mysql mais il sera facile de s'en passer le jour
128
		// la partie on duplicate key est spécifique mysql mais il sera facile de s'en passer le jour
150
		// où l'on change de sgbd
129
		// où l'on change de sgbd
151
		$ajout = $this->executerRequeteSimple($requete);
130
		$ajout = $this->executerRequeteSimple($requete);
152
		return ($ajout !== false);
131
		return ($ajout !== false);
153
	}
132
	}
154
	
133
 
155
	/**
134
	/**
156
	* Ajoute des champs étendus aux éléments passés en paramètre,
135
	* Ajoute plusieurs champs étendus à la fois.
157
	* si la clé existe déjà, seule la valeur du champ est mise à jour
136
	* Si la clé existe déjà, seule la valeur du champ est mise à jour
158
	*
137
	*
159
	* @param array $elements_cles_valeurs tableau associatif de la forme id, cle, valeur
138
	* @param array $champs_etendus tableau d'objets ChampEtendu
160
	* @return bool
-
 
161
	*/
139
	* @return bool true si l'ajout a eu lieu
162
	public function ajouterChampsEtendusMultiplesAElementsMultiples($elements_cles_valeurs) {
140
	*/
-
 
141
	public function ajouterParLots(Array $champs_etendus) {
-
 
142
		$lignes = array();
-
 
143
		foreach ($champs_etendus as $champ_etendu) {
163
	
144
			$id = $this->proteger($champ_etendu->id);
-
 
145
			$cle = $this->proteger($champ_etendu->cle);
-
 
146
			$label = $this->proteger($champ_etendu->label);
164
		$lignes = array();
147
			$valeur = $this->proteger($champ_etendu->valeur);
-
 
148
 
165
		foreach($elements_cles_valeurs as &$element) {
149
			$lignes[] = "($id, $cle, $label, $valeur)";
166
			$lignes[] = "(".$this->proteger($element['id']).",".$this->proteger($element['cle']).",".$this->proteger($element['valeur']).")";
150
		}
167
		}
151
		$values = implode(',', $lignes);
168
	
152
 
169
		$requete = "INSERT INTO ".$this->table_champs_etendus." ".
153
		$requete = "INSERT INTO {$this->table_champs_etendus} ".
Line 170... Line 154...
170
				           "(".$this->champ_id.", cle, valeur) ".
154
			"({$this->champ_id}, cle, label, valeur) ".
171
				           "VALUES ".implode(',', $lignes)." ".
155
			"VALUES $values ".
172
				           "ON DUPLICATE KEY UPDATE valeur = VALUES(valeur)";
156
			"ON DUPLICATE KEY UPDATE valeur = VALUES(valeur)";
173
 
157
 
174
		// la partie on duplicate key est spécifique mysql mais il sera facile de s'en passer le jour
158
		// la partie on duplicate key est spécifique mysql mais il sera facile de s'en passer le jour
175
		// où l'on change de sgbd
159
		// où l'on change de sgbd
176
		$ajout = $this->executerRequeteSimple($requete);
160
		$ajout = $this->executerRequeteSimple($requete);
177
		return ($ajout !== false);
161
		return ($ajout !== false);
178
	}
162
	}
179
	
163
 
180
	/**
-
 
181
	 * Modifie un champ étendu associé à l'élément passé en paramètre
164
	/**
182
	 *
-
 
183
	 * @param int $id_element_lie
165
	 * Modifie un champ étendu associé à l'élément passé en paramètre
184
	 * @param string $cle
166
	 *
-
 
167
	 * @param ChampEtendu $champ_etendu
-
 
168
	 * @return bool true si la modification a eu lieu
-
 
169
	 */
-
 
170
	public function modifier(ChampEtendu $champ_etendu) {
-
 
171
		$id = $this->proteger($champ_etendu->id);
185
	 * @param string $valeur
172
		$cle = $this->proteger($champ_etendu->cle);
186
	 * @return bool 
173
		$label = $this->proteger($champ_etendu->label);
187
	 */
174
		$valeur = $this->proteger($champ_etendu->valeur);
188
	public function modifierChampEtendu($id_element_lie, $cle, $valeur) {
175
 
189
		$requete = "UPDATE ".$this->table_champs_etendus." ".
176
		$requete = "UPDATE {$this->table_champs_etendus} ".
190
				           "SET valeur = ".$this->proteger($valeur)." ".
177
			"SET label = $label, valeur = $valeur ".
191
				           "WHERE cle = ".$this->proteger($cle)." AND ".
178
			"WHERE cle = $cle".
192
						   $this->champ_id." = ".$this->proteger($id_element_lie);
179
			"	AND {$this->champ_id} = $id ";
193
		
180
 
194
		$modif = $this->executerRequeteSimple($requete);
181
		$modif = $this->executerRequeteSimple($requete);
195
		return ($modif !== false);
182
		return ($modif !== false);
196
	}
183
	}
197
	
184
 
198
	/**
185
	/**
199
	* Supprime le champ champ étendu associé à l'élément et au nom de clé passés en paramètre 
186
	* Supprime le champ champ étendu associé à l'élément et au nom de clé passés en paramètre
200
	*
187
	*
201
	* @param int $id_element_lie
188
	* @param int $id_element_lie
202
	* @param string $cle
189
	* @param string $cle
203
	* @return bool
190
	* @return bool
204
	*/
191
	*/
205
	public function supprimerChampEtendu($id_element_lie, $cle) {
-
 
206
		$requete = "DELETE FROM ".$this->table_champs_etendus." ".
192
	public function supprimer($id_element_lie, $cle) {
207
					"WHERE cle = ".$this->proteger($cle)." AND ".
193
		$id = $this->proteger($id_element_lie);
208
					$this->champ_id." = ".$this->proteger($id_element_lie);
194
		$cle = $this->proteger($cle);
209
		
195
		$requete = "DELETE FROM {$this->table_champs_etendus} WHERE cle = $cle AND {$this->champ_id} = $id ";
210
		$suppr = $this->executerRequeteSimple($requete);
196
		$suppr = $this->executerRequeteSimple($requete);
211
		return ($suppr !== false);
197
		return ($suppr !== false);
212
	}
198
	}
213
	
199
 
214
	/**
200
	/**
215
	* Supprime tous les champs champ étendu associés à l'élément passés en paramètre
201
	* Supprime tous les champs champ étendu associés à l'élément passés en paramètre
216
	*
202
	*
217
	* @param int $id_element_lie
203
	* @param int $id_element_lie
218
	* @return bool
204
	* @return bool
219
	*/
-
 
220
	public function supprimerChampsEtendusAElement($id_element_lie) {
205
	*/
221
		$requete = "DELETE FROM ".$this->table_champs_etendus." ".
206
	public function vider($id_element_lie) {
222
							"WHERE ".$this->champ_id." = ".$this->proteger($id_element_lie);
207
		$id = $this->proteger($id_element_lie);
-
 
208
		$requete = "DELETE FROM {$this->table_champs_etendus} WHERE {$this->champ_id} = $id ";
-
 
209
		$suppr = $this->executerRequeteSimple($requete);
-
 
210
		return ($suppr !== false);
-
 
211
	}
-
 
212
 
-
 
213
	/**
-
 
214
	 * Transforme un label en clé.
-
 
215
	 * Supprime tous les accents et caractères spéciaux.
-
 
216
	 * Accole les mots pour créer un chatmot.
-
 
217
	 *
-
 
218
	 * @param string le label.
-
 
219
	 * @return string la clé correspondante
-
 
220
	 */
-
 
221
	public function transformerLabelEnCle($label) {
-
 
222
		$cle = strtolower(trim($label));
-
 
223
 
-
 
224
		// Suppression des mots inutiles
-
 
225
		$mots_a_remplacer = array(' le ', ' la ', ' les ', ' des ', ' de ', " l'", " d'", ' à ', ' au ');
-
 
226
		$cle = str_replace($mots_a_remplacer, ' ', $cle);
-
 
227
 
-
 
228
		// Remplacement parenthèses et crochets et leurs contenus
-
 
229
		$cle = preg_replace('/\([^)]+\)/', '', $cle);
-
 
230
		$cle = preg_replace('/\[[^\]]+\]/', '', $cle);
-
 
231
 
-
 
232
		// Remplacement des accents (voir : http://www.weirdog.com/blog/php/supprimer-les-accents-des-caracteres-accentues.html )
-
 
233
		$cle = htmlentities($cle, ENT_NOQUOTES, 'utf-8');
-
 
234
		$cle = preg_replace('/&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);/', '\1', $cle);
-
 
235
		$cle = preg_replace('/&([A-za-z]{2})(?:lig);/', '\1', $cle); // pour les ligatures e.g. '&oelig;'
-
 
236
		$cle = preg_replace('/&[^;]+;/', '', $cle); // supprime les autres caractères
-
 
237
 
-
 
238
		// Suppression définitive de tout ce qui n'est pas ASCII
-
 
239
		$cle = preg_replace('/[^a-zA-Z0-9]/', '', $cle);
-
 
240
 
-
 
241
		// Accollement des mots
-
 
242
		$cle = ucwords($cle);
223
		
243
		$cle = str_replace(' ', '', $cle);
224
		$suppr = $this->executerRequeteSimple($requete);
244
 
225
		return ($suppr !== false);
245
		return $cle;