Subversion Repositories Applications.annuaire

Rev

Rev 60 | Rev 105 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
15 aurelien 1
<?php
2
/**
3
* PHP Version 5
4
*
5
* @category  PHP
6
* @package   annuaire
7
* @author    aurelien <aurelien@tela-botanica.org>
8
* @copyright 2010 Tela-Botanica
9
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
10
* @version   SVN: <svn_id>
11
* @link      /doc/annuaire/
41 aurelien 12
*
15 aurelien 13
*/
14
 
41 aurelien 15
/**
16
 * Controleur chargé de la vérification des formulaire
17
 * Remplace aussi les valeurs lors des actions spéciales comme la modification du mail
18
 * (l'inscription à la lettre d'actu se fait aussi ici même si ça n'estp as totalement sa place)
19
 */
15 aurelien 20
class VerificationControleur extends Controleur {
21
 
22
	/**
41 aurelien 23
	 * Vérifie que les valeurs des champs de mappage et les valeurs obligatoires d'un annuaire donné
15 aurelien 24
	 * sont correctes
25
	 * @param int $id_annuaire l'identifiant de l'annuaire
26
	 * @param Array $valeurs les valeurs à vérifier
27
	 */
41 aurelien 28
	public function verifierErreursChampsSelonType($id_annuaire, $valeurs, $tableau_mappage) {
15 aurelien 29
 
60 aurelien 30
		$erreurs = array();
15 aurelien 31
 
32
		$this->chargerModele('AnnuaireModele');
41 aurelien 33
		$tableau_champs_obligatoire = $this->AnnuaireModele->obtenirChampsObligatoires($id_annuaire);
15 aurelien 34
 
41 aurelien 35
		foreach($valeurs as $id => $valeur_champ) {
15 aurelien 36
 
41 aurelien 37
			$type = $valeur_champ['type'];
38
			$valeur = $valeur_champ['valeur'];
39
			$condition = $valeur_champ['condition'];
15 aurelien 40
 
41 aurelien 41
			switch($type) {
42
 
43
				case 'text':
44
					if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($valeur) == '') {
45
						$erreurs[$id] = 'Ce champ est obligatoire';
46
					}
47
				break;
48
 
49
				case 'mail':
50
					if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($valeur) == '') {
51
						$erreurs[$id] = 'Le mail est obligatoire ';
52
					}
53
 
54
					if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && !$this->mailValide($valeur)) {
89 aurelien 55
						$erreurs[$id] = 'Le mail est invalide ';
41 aurelien 56
					}
57
 
58
					if($this->AnnuaireModele->utilisateurExisteParMail($id_annuaire, $valeur)) {
89 aurelien 59
						$erreurs[$id] = 'Cet email est déjà utilisé par quelqu\'un d\'autre ';
41 aurelien 60
					}
61
				break;
62
 
63
				case 'password':
64
					if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($valeur) == ''
65
					|| $valeur != $condition) {
89 aurelien 66
						$erreurs[$id] = 'Le mot de passe est invalide';
41 aurelien 67
					}
68
				break;
69
 
70
				// cas du champ checkbox
71
				case 'checkbox':
72
					if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($condition) != 'on') {
73
						$erreurs[$id] = 'N\'oubliez pas de cocher cette case';
74
					}
75
				break;
76
 
77
				default:
60 aurelien 78
 
41 aurelien 79
				break;
80
			}
15 aurelien 81
		}
82
 
60 aurelien 83
		if(count($erreurs) == 0) {
84
			$erreurs = false;
85
		}
86
 
15 aurelien 87
		return $erreurs;
88
	}
89
 
30 aurelien 90
	/**
91
	 * Vérifie les valeurs des champs pour la modification d'un formulaire
92
	 */
93
	public function verifierErreurChampModification($id_annuaire, $id_utilisateur, $type ,$valeur, $confirmation = false) {
15 aurelien 94
 
30 aurelien 95
		$retour = array(true,false);
15 aurelien 96
 
30 aurelien 97
		switch($type) {
98
			case 'mail':
99
				if(!$this->mailValide($valeur)) {
100
					$retour[0] = false;
101
					$retour[1] = 'mail invalide';
102
					break;
103
				}
15 aurelien 104
 
30 aurelien 105
				$this->chargerModele('AnnuaireModele');
106
				$ancien_mail = $this->AnnuaireModele->obtenirMailParId($id_annuaire,$id_utilisateur);
15 aurelien 107
 
30 aurelien 108
				if($ancien_mail != $valeur && $this->AnnuaireModele->utilisateurExisteParMail($id_annuaire, $valeur)) {
109
					$retour[0] = false;
110
					$retour[1] = 'cet email est déjà utilisé par quelqu\'un d\'autre';
111
				}
112
 
113
			break;
114
 
115
			case 'password':
116
 
117
				if(trim($valeur) != trim($confirmation)) {
118
					$retour[0] = false;
119
					$retour[1] = 'mot de passe invalide';
120
				}
15 aurelien 121
		}
122
 
30 aurelien 123
		return $retour;
15 aurelien 124
	}
125
 
126
	public function remplacerValeurChampPourInsertion($type, $valeur, $mail_utilisateur) {
127
 
128
		$valeur_modifiee = $valeur;
129
 
130
		switch($type) {
131
 
132
			// cas du champ texte, à priori, rien de particulier
133
			case 'text':
134
				$valeur_modifiee = $valeur;
135
			break;
136
 
137
			// cas du champ password : on le crypte
138
			case 'password':
139
				$valeur_modifiee = $this->encrypterMotDePasse($valeur);
140
			break;
141
 
142
			// cas du champ checkbox
143
			case 'checkbox':
144
				// Si c'est un groupe checkbox, alors c'est une liste de checkbox liée à une ontologie
145
				if(is_array($valeur)) {
146
					// on stocke les valeurs d'ontologies liées au cases cochées
147
					$valeur_modifiee = implode(Config::get('separateur_metadonnee'), array_keys($valeur));
148
 
149
				} else {
150
					if($valeur == 'on') {
151
						// sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
152
						$valeur_modifiee = 1;
153
					} else {
154
						$valeur_modifiee = 0;
155
					}
156
				}
157
 
158
			break;
159
 
160
			case 'lettre':
161
					if($valeur == 'on') {
162
						// sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
163
						$valeur_modifiee = 1;
164
						// Si c'est une inscription à la lettre d'actualité, on appelle la fonction d'inscription
165
						$lettre_controleur = new LettreControleur();
166
						$lettre_controleur->inscriptionLettreActualite($mail_utilisateur);
167
					} else {
168
						$valeur_modifiee = 0;
169
					}
30 aurelien 170
			break;
15 aurelien 171
 
172
			default:
173
				$valeur_modifiee = $valeur;
174
			break;
175
		}
176
 
177
		return $valeur_modifiee;
178
	}
179
 
30 aurelien 180
	public function remplacerValeurChampPourModification($id_annuaire, $id_utilisateur, $type, $valeur, $mail_utilisateur) {
15 aurelien 181
 
182
		$valeur_modifiee = $valeur;
183
 
184
		switch($type) {
185
 
186
			// cas du champ texte, à priori, rien de particulier
187
			case 'text':
188
				$valeur_modifiee = $valeur;
189
			break;
190
 
191
			// cas du champ password : on le crypte
192
			case 'password':
193
				$valeur_modifiee = $this->encrypterMotDePasse($valeur);
194
			break;
195
 
196
			// cas du champ checkbox
197
			case 'checkbox':
198
				// Si c'est un groupe checkbox, alors c'est une liste de checkbox liée à une ontologie
199
				if(is_array($valeur)) {
200
 
201
					// on stocke les valeurs d'ontologies liées au cases cochées
202
					$valeur_modifiee = implode(Config::get('separateur_metadonnee'), array_keys($valeur));
203
 
204
				} else {
205
					if($valeur == 'on') {
206
						// sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
207
						$valeur_modifiee = 1;
208
					} else {
209
						$valeur_modifiee = 0;
210
					}
211
				}
212
 
213
			break;
214
 
215
			case 'lettre':
216
 
217
				// Si c'est une inscription à la lettre d'actualité, on appelle la fonction d'inscription
218
				$lettre_controleur = new LettreControleur();
219
 
30 aurelien 220
				$this->chargerModele('AnnuaireModele');
221
				$ancien_mail = $this->AnnuaireModele->obtenirMailParId($id_annuaire, $id_utilisateur);
222
 
223
				$changement_mail = false;
224
 
225
				if($ancien_mail != $mail_utilisateur) {
226
					$changement_mail = true;
227
				}
228
 
15 aurelien 229
				if($valeur == 'on') {
56 aurelien 230
					// on stocke 1 pour indique que la case est cochée (comme la checkbox oui/non)
15 aurelien 231
					$valeur_modifiee = 1;
30 aurelien 232
 
56 aurelien 233
					// si le mail a changé on désinscrit l'ancien mail et on inscrit le nouveau
30 aurelien 234
					if($changement_mail) {
235
						$lettre_controleur->ModificationInscriptionLettreActualite($ancien_mail, $mail_utilisateur);
236
					} else {
237
						$lettre_controleur->inscriptionLettreActualite($mail_utilisateur);
238
					}
239
 
15 aurelien 240
				} else {
56 aurelien 241
					// sinon, si la case est vide
15 aurelien 242
					$valeur_modifiee = 0;
30 aurelien 243
					$mail_a_desinscrire = $mail_utilisateur;
244
					if($changement_mail) {
245
						$mail_a_desinscrire = $ancien_mail;
246
					}
56 aurelien 247
					// on desinscrit l'utilisateur
30 aurelien 248
					$lettre_controleur->desinscriptionLettreActualite($mail_a_desinscrire);
15 aurelien 249
				}
250
			break;
251
 
252
			default:
253
				$valeur_modifiee = $valeur;
254
			break;
255
		}
256
 
257
		return $valeur_modifiee;
258
	}
259
 
260
	public function verifierEtRemplacerValeurChampPourAffichage($type, $valeur, $id_annuaire) {
261
 
262
		if(!$type) {
263
			$valeur_modifiee = array();
264
 
265
			$valeur_modifiee['amv_type'] = 'champ_annuaire';
266
			$valeur_modifiee['amv_valeur_affichage'] = $valeur;
267
 
268
		} else {
269
 
270
			$valeur_modifiee = $valeur;
271
 
272
			switch($type) {
273
 
274
				// cas du champ texte, à priori, rien de particulier
275
				case 'text':
276
					$valeur_modifiee['amv_valeur_affichage'] = $valeur['amv_valeur'];
277
				break;
278
 
279
				// cas du champ checkbox
280
				case 'checkbox':
281
					// si c'est un groupe checkbox, alors c'est une liste de checkbox liée à une ontologie
282
					if(isset($valeur['amo_nom'])) {
283
						if(is_array($valeur['amo_nom']) && count($valeur['amo_nom']) > 0) {
284
						// on stocke les valeurs d'ontologies liées au cases cochées
285
							$valeur_modifiee['amv_valeur_affichage'] = implode(', ', $valeur['amo_nom']);
286
						} else {
287
							$valeur_modifiee['amv_valeur_affichage'] = $valeur['amo_nom'];
288
						}
289
					} else {
290
						// sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
291
						if($valeur_modifiee == 1) {
292
							$valeur_modifiee['amv_valeur_affichage'] = 'oui';
293
						} else {
294
							$valeur_modifiee['amv_valeur_affichage'] = 'non';
295
						}
296
					}
297
				break;
298
 
299
				case 'select':
56 aurelien 300
					// TODO: si ça n'existe pas on va le chercher ?
301
					if(isset($valeur['amo_nom'])) {
302
						$valeur_modifiee['amv_valeur_affichage'] = $valeur['amo_nom'];
60 aurelien 303
					} else {
304
						if(isset($valeur['amv_valeur'])) {
305
							$ontologie_modele = new OntologieModele();
306
							$infos_onto = $ontologie_modele->chargerInformationsOntologie($valeur['amv_valeur']);
307
							if(is_array($infos_onto) && !empty($infos_onto)) {
308
								$valeur_modifiee['amv_valeur_affichage'] = $infos_onto['amo_nom'];
309
							} else  {
310
								$valeur_modifiee['amv_valeur_affichage'] = '';
311
							}
312
						}
56 aurelien 313
					}
15 aurelien 314
				break;
315
 
316
				case 'radio':
317
					$valeur_modifiee['amv_valeur_affichage'] = $valeur['amo_nom'];
318
				break;
319
 
320
				case 'image':
321
					// si c'est une image, on recherche son url véritable à partir de l'id donnée en paramètre
322
					if(isset($valeur['amv_valeur']) && $valeur['amv_valeur'] != '') {
323
						$this->chargerModele('ImageModele');
324
						$valeur_modifiee['amv_valeur_affichage'] = $this->ImageModele->obtenirEmplacementFichierParId($valeur['amv_valeur'],$id_annuaire, 'S');
325
					}
326
				break;
327
 
328
				// cas du champ lettre
329
				case 'lettre':
330
 
331
					// on affiche oui ou non
332
					if($valeur_modifiee['amv_valeur'] == 1) {
333
						$valeur_modifiee['amv_valeur_affichage'] = 'oui';
334
					} else {
335
						$valeur_modifiee['amv_valeur_affichage'] = 'non';
336
					}
337
				break;
338
 
339
				default:
340
					$valeur_modifiee['amv_valeur_affichage'] = $valeur['amv_valeur'];
341
				break;
342
			}
343
		}
344
 
345
		return $valeur_modifiee;
346
	}
89 aurelien 347
 
348
	public function collecterValeurInscription($valeurs, $tableau_mappage) {
349
 
350
		$valeurs_mappees = array();
351
		$valeurs_a_inserer = array();
352
 
353
		// on itère sur le tableau de valeur pour récupérer les champs de mappage;
354
		foreach($valeurs as $nom_champ => $valeur) {
15 aurelien 355
 
89 aurelien 356
			// pour chaque valeur
357
			// on extrait l'id du champ
358
			$ids_champ = mb_split("_",$nom_champ, 3);
359
 
360
			if(count($ids_champ) == 3) {
361
 
362
				$type = $ids_champ[0];
363
				$id_champ = $ids_champ[2];
364
				$condition = $ids_champ[1];
365
 
366
				// cas de la checkbox qui devrait être là mais pas cochée
367
				if($condition == 'hidden' && !isset($valeurs[$type.'_'.$id_champ])) {
368
					// dans ce cas là on fabrique une valeur vide
369
					$valeurs[$type.'_'.$id_champ] = 0;
370
				}
371
 
372
			} else {
373
				$type = $ids_champ[0];
374
				$condition = false;
375
				$id_champ = $ids_champ[1];
376
			}
377
 
378
			// Si le champ fait partie des champs mappés
379
			$cle_champ = array_search($id_champ, $tableau_mappage[1]);
380
 
381
			// on ajoute sa clé correspondante dans le tableau des champs mappés
382
			// qui sont les champs à vérifier
383
			if($condition) {
384
				$condition = $valeurs[$type.'_'.$id_champ];
385
				$valeurs_mappees[$id_champ] = array('valeur' => $valeur, 'type' => $type, 'condition' => $condition);
386
			} else {
387
				//$valeurs_mappees[$cle_champ] = $valeur;
388
				$valeurs_mappees[$id_champ] = array('valeur' => $valeur, 'type' => $type, 'condition' => false);
389
			}
390
 
391
			if(!$condition) {
392
				$valeurs_a_inserer[$nom_champ] = $valeur;
393
			}
394
		}
395
 
396
		return array('valeurs_mappees' => $valeurs_mappees, 'valeurs_a_inserer' => $valeurs_a_inserer);
397
	}
398
 
15 aurelien 399
	/**
400
	 * Renvoie vrai ou faux suivant qu'un mail donné en paramètre est syntaxiquement valide (ne vérifie pas l'existence
401
	 * de l'adresse)
402
	 * @param string $mail le mail à tester
403
	 * @return boolean vrai ou faux suivant que le mail est valide ou non
404
	 */
405
	public function mailValide($mail) {
406
 
407
		$regexp_mail = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/';
408
		return preg_match($regexp_mail, $mail);
409
 
410
	}
411
 
412
	/**
413
	 * Renvoie un mot de passe crypté selon la fonction d'encryptage définie dans le fichier de configuration
414
	 * (si celle-ci n'existe pas on utilise une fonction par défaut)
415
	 * @param string $pass le mot de passe à encrypter
416
	 * @return string le mot de passe encrypté
417
	 */
418
	public function encrypterMotDePasse($pass) {
419
 
420
		$fonction = Config::get('pass_crypt_fonct');
421
 
422
		if(function_exists($fonction)) {
423
			return $fonction($pass);
424
		} else {
425
			return md5($pass);
426
		}
427
	}
41 aurelien 428
 
56 aurelien 429
	//TODO: créer une class util
430
	static function encrypterMotDepasseStatic($pass) {
431
 
432
		$fonction = Config::get('pass_crypt_fonct');
433
 
434
		if(function_exists($fonction)) {
435
			return $fonction($pass);
436
		} else {
437
			return md5($pass);
438
		}
439
	}
440
 
441
	/**
442
	 * Suivant un identifiant de champ et un tableau, renvoie vrai ou faux suivant que le champs est obligatoire ou non
443
	 * @param int $id_champ l'identifiant de champ
444
	 * @param int $champ_obligatoire le tableau des champs obligatoires
445
	 */
41 aurelien 446
	private function estUnchampObligatoire($id_champ, $champs_obligatoire) {
447
 
448
		return in_array($id_champ, $champs_obligatoire) || in_array($id_champ, array_keys($champs_obligatoire));
449
	}
15 aurelien 450
}
451
?>