Subversion Repositories Applications.annuaire

Rev

Rev 246 | Rev 338 | 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
/**
120 aurelien 16
 * Controleur chargé de la vérification des formulaires
41 aurelien 17
 * Remplace aussi les valeurs lors des actions spéciales comme la modification du mail
120 aurelien 18
 * (l'inscription à la lettre d'actu se fait aussi ici même si ça n'est pas totalement sa place)
41 aurelien 19
 */
120 aurelien 20
class VerificationControleur extends AppControleur {
15 aurelien 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);
148 aurelien 34
 
35
		if(!$tableau_champs_obligatoire) {
36
			$tableau_champs_obligatoire = array();
37
		}
15 aurelien 38
 
41 aurelien 39
		foreach($valeurs as $id => $valeur_champ) {
15 aurelien 40
 
41 aurelien 41
			$type = $valeur_champ['type'];
42
			$valeur = $valeur_champ['valeur'];
43
			$condition = $valeur_champ['condition'];
15 aurelien 44
 
41 aurelien 45
			switch($type) {
46
 
47
				case 'text':
218 aurelien 48
 
41 aurelien 49
					if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($valeur) == '') {
50
						$erreurs[$id] = 'Ce champ est obligatoire';
51
					}
52
				break;
53
 
54
				case 'mail':
55
					if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($valeur) == '') {
56
						$erreurs[$id] = 'Le mail est obligatoire ';
57
					}
58
 
59
					if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && !$this->mailValide($valeur)) {
89 aurelien 60
						$erreurs[$id] = 'Le mail est invalide ';
41 aurelien 61
					}
62
 
63
					if($this->AnnuaireModele->utilisateurExisteParMail($id_annuaire, $valeur)) {
89 aurelien 64
						$erreurs[$id] = 'Cet email est déjà utilisé par quelqu\'un d\'autre ';
41 aurelien 65
					}
66
				break;
67
 
68
				case 'password':
69
					if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($valeur) == ''
70
					|| $valeur != $condition) {
89 aurelien 71
						$erreurs[$id] = 'Le mot de passe est invalide';
41 aurelien 72
					}
73
				break;
74
 
75
				// cas du champ checkbox
76
				case 'checkbox':
77
					if($this->estUnchampObligatoire($id, $tableau_champs_obligatoire) && trim($condition) != 'on') {
78
						$erreurs[$id] = 'N\'oubliez pas de cocher cette case';
79
					}
80
				break;
81
 
82
				default:
60 aurelien 83
 
41 aurelien 84
				break;
85
			}
15 aurelien 86
		}
87
 
60 aurelien 88
		if(count($erreurs) == 0) {
89
			$erreurs = false;
90
		}
91
 
15 aurelien 92
		return $erreurs;
93
	}
94
 
30 aurelien 95
	/**
96
	 * Vérifie les valeurs des champs pour la modification d'un formulaire
97
	 */
98
	public function verifierErreurChampModification($id_annuaire, $id_utilisateur, $type ,$valeur, $confirmation = false) {
15 aurelien 99
 
30 aurelien 100
		$retour = array(true,false);
15 aurelien 101
 
30 aurelien 102
		switch($type) {
103
			case 'mail':
104
				if(!$this->mailValide($valeur)) {
105
					$retour[0] = false;
106
					$retour[1] = 'mail invalide';
107
					break;
108
				}
15 aurelien 109
 
30 aurelien 110
				$this->chargerModele('AnnuaireModele');
111
				$ancien_mail = $this->AnnuaireModele->obtenirMailParId($id_annuaire,$id_utilisateur);
15 aurelien 112
 
30 aurelien 113
				if($ancien_mail != $valeur && $this->AnnuaireModele->utilisateurExisteParMail($id_annuaire, $valeur)) {
114
					$retour[0] = false;
115
					$retour[1] = 'cet email est déjà utilisé par quelqu\'un d\'autre';
116
				}
117
 
118
			break;
119
 
120
			case 'password':
121
 
122
				if(trim($valeur) != trim($confirmation)) {
123
					$retour[0] = false;
124
					$retour[1] = 'mot de passe invalide';
125
				}
15 aurelien 126
		}
127
 
30 aurelien 128
		return $retour;
15 aurelien 129
	}
130
 
131
	public function remplacerValeurChampPourInsertion($type, $valeur, $mail_utilisateur) {
132
 
133
		$valeur_modifiee = $valeur;
134
 
135
		switch($type) {
136
 
137
			// cas du champ texte, à priori, rien de particulier
138
			case 'text':
139
				$valeur_modifiee = $valeur;
140
			break;
141
 
142
			// cas du champ password : on le crypte
143
			case 'password':
144
				$valeur_modifiee = $this->encrypterMotDePasse($valeur);
145
			break;
146
 
147
			// cas du champ checkbox
148
			case 'checkbox':
149
				// Si c'est un groupe checkbox, alors c'est une liste de checkbox liée à une ontologie
150
				if(is_array($valeur)) {
151
					// on stocke les valeurs d'ontologies liées au cases cochées
152
					$valeur_modifiee = implode(Config::get('separateur_metadonnee'), array_keys($valeur));
153
 
154
				} else {
155
					if($valeur == 'on') {
156
						// sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
157
						$valeur_modifiee = 1;
158
					} else {
159
						$valeur_modifiee = 0;
160
					}
161
				}
162
 
163
			break;
164
 
165
			case 'lettre':
166
					if($valeur == 'on') {
167
						// sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
168
						$valeur_modifiee = 1;
169
						// Si c'est une inscription à la lettre d'actualité, on appelle la fonction d'inscription
170
						$lettre_controleur = new LettreControleur();
171
						$lettre_controleur->inscriptionLettreActualite($mail_utilisateur);
172
					} else {
173
						$valeur_modifiee = 0;
174
					}
30 aurelien 175
			break;
15 aurelien 176
 
177
			default:
178
				$valeur_modifiee = $valeur;
179
			break;
180
		}
181
 
182
		return $valeur_modifiee;
183
	}
184
 
30 aurelien 185
	public function remplacerValeurChampPourModification($id_annuaire, $id_utilisateur, $type, $valeur, $mail_utilisateur) {
15 aurelien 186
 
187
		$valeur_modifiee = $valeur;
188
 
189
		switch($type) {
190
 
191
			// cas du champ texte, à priori, rien de particulier
192
			case 'text':
193
				$valeur_modifiee = $valeur;
194
			break;
195
 
196
			// cas du champ password : on le crypte
197
			case 'password':
198
				$valeur_modifiee = $this->encrypterMotDePasse($valeur);
199
			break;
200
 
201
			// cas du champ checkbox
202
			case 'checkbox':
139 aurelien 203
 
15 aurelien 204
				// Si c'est un groupe checkbox, alors c'est une liste de checkbox liée à une ontologie
205
				if(is_array($valeur)) {
206
 
207
					// on stocke les valeurs d'ontologies liées au cases cochées
208
					$valeur_modifiee = implode(Config::get('separateur_metadonnee'), array_keys($valeur));
209
 
210
				} else {
161 aurelien 211
 
212
					if($valeur == 'on' || $valeur == '1') {
15 aurelien 213
						// sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
214
						$valeur_modifiee = 1;
215
					} else {
216
						$valeur_modifiee = 0;
217
					}
218
				}
219
 
220
			break;
221
 
222
			case 'lettre':
223
 
224
				// Si c'est une inscription à la lettre d'actualité, on appelle la fonction d'inscription
225
				$lettre_controleur = new LettreControleur();
226
 
30 aurelien 227
				$this->chargerModele('AnnuaireModele');
228
				$ancien_mail = $this->AnnuaireModele->obtenirMailParId($id_annuaire, $id_utilisateur);
229
 
230
				$changement_mail = false;
231
 
232
				if($ancien_mail != $mail_utilisateur) {
233
					$changement_mail = true;
234
				}
235
 
161 aurelien 236
				if($valeur == 'on' || $valeur == '1') {
56 aurelien 237
					// on stocke 1 pour indique que la case est cochée (comme la checkbox oui/non)
15 aurelien 238
					$valeur_modifiee = 1;
30 aurelien 239
 
56 aurelien 240
					// si le mail a changé on désinscrit l'ancien mail et on inscrit le nouveau
30 aurelien 241
					if($changement_mail) {
242
						$lettre_controleur->ModificationInscriptionLettreActualite($ancien_mail, $mail_utilisateur);
243
					} else {
143 aurelien 244
 
30 aurelien 245
						$lettre_controleur->inscriptionLettreActualite($mail_utilisateur);
246
					}
247
 
15 aurelien 248
				} else {
56 aurelien 249
					// sinon, si la case est vide
15 aurelien 250
					$valeur_modifiee = 0;
30 aurelien 251
					$mail_a_desinscrire = $mail_utilisateur;
252
					if($changement_mail) {
253
						$mail_a_desinscrire = $ancien_mail;
254
					}
56 aurelien 255
					// on desinscrit l'utilisateur
30 aurelien 256
					$lettre_controleur->desinscriptionLettreActualite($mail_a_desinscrire);
15 aurelien 257
				}
258
			break;
259
 
260
			default:
261
				$valeur_modifiee = $valeur;
262
			break;
263
		}
264
 
265
		return $valeur_modifiee;
266
	}
267
 
268
	public function verifierEtRemplacerValeurChampPourAffichage($type, $valeur, $id_annuaire) {
269
 
270
		if(!$type) {
271
			$valeur_modifiee = array();
272
 
273
			$valeur_modifiee['amv_type'] = 'champ_annuaire';
274
			$valeur_modifiee['amv_valeur_affichage'] = $valeur;
275
 
276
		} else {
105 aurelien 277
 
278
			if(!isset($valeur['amv_valeur'])) {
279
				$valeur['amv_valeur'] = '';
280
			}
15 aurelien 281
 
282
			$valeur_modifiee = $valeur;
283
 
284
			switch($type) {
285
 
286
				// cas du champ texte, à priori, rien de particulier
287
				case 'text':
120 aurelien 288
					$valeur_modifiee['amv_valeur_affichage'] = $this->remplacerLienHtml($valeur['amv_valeur']);
15 aurelien 289
				break;
120 aurelien 290
 
291
				// cas du champ texte long, à priori, rien de particulier
292
				case 'textarea':
293
					$valeur_modifiee['amv_valeur_affichage'] = $this->remplacerLienHtml($valeur['amv_valeur']);
294
				break;
15 aurelien 295
 
296
				// cas du champ checkbox
297
				case 'checkbox':
298
					// si c'est un groupe checkbox, alors c'est une liste de checkbox liée à une ontologie
299
					if(isset($valeur['amo_nom'])) {
300
						if(is_array($valeur['amo_nom']) && count($valeur['amo_nom']) > 0) {
301
						// on stocke les valeurs d'ontologies liées au cases cochées
302
							$valeur_modifiee['amv_valeur_affichage'] = implode(', ', $valeur['amo_nom']);
303
						} else {
304
							$valeur_modifiee['amv_valeur_affichage'] = $valeur['amo_nom'];
305
						}
306
					} else {
307
						// sinon on stocke 1 pour indique que la case est cochée (cas de la checkbox oui/non)
308
						if($valeur_modifiee == 1) {
309
							$valeur_modifiee['amv_valeur_affichage'] = 'oui';
310
						} else {
311
							$valeur_modifiee['amv_valeur_affichage'] = 'non';
312
						}
313
					}
314
				break;
315
 
316
				case 'select':
56 aurelien 317
					// TODO: si ça n'existe pas on va le chercher ?
318
					if(isset($valeur['amo_nom'])) {
319
						$valeur_modifiee['amv_valeur_affichage'] = $valeur['amo_nom'];
60 aurelien 320
					} else {
321
						if(isset($valeur['amv_valeur'])) {
322
							$ontologie_modele = new OntologieModele();
323
							$infos_onto = $ontologie_modele->chargerInformationsOntologie($valeur['amv_valeur']);
324
							if(is_array($infos_onto) && !empty($infos_onto)) {
325
								$valeur_modifiee['amv_valeur_affichage'] = $infos_onto['amo_nom'];
326
							} else  {
327
								$valeur_modifiee['amv_valeur_affichage'] = '';
328
							}
105 aurelien 329
						} else  {
330
							$valeur_modifiee['amv_valeur_affichage'] = '';
60 aurelien 331
						}
56 aurelien 332
					}
105 aurelien 333
 
15 aurelien 334
				break;
335
 
336
				case 'radio':
337
					$valeur_modifiee['amv_valeur_affichage'] = $valeur['amo_nom'];
338
				break;
339
 
340
				case 'image':
341
					// si c'est une image, on recherche son url véritable à partir de l'id donnée en paramètre
342
					if(isset($valeur['amv_valeur']) && $valeur['amv_valeur'] != '') {
343
						$this->chargerModele('ImageModele');
344
						$valeur_modifiee['amv_valeur_affichage'] = $this->ImageModele->obtenirEmplacementFichierParId($valeur['amv_valeur'],$id_annuaire, 'S');
345
					}
346
				break;
347
 
348
				// cas du champ lettre
349
				case 'lettre':
350
 
351
					// on affiche oui ou non
352
					if($valeur_modifiee['amv_valeur'] == 1) {
353
						$valeur_modifiee['amv_valeur_affichage'] = 'oui';
354
					} else {
355
						$valeur_modifiee['amv_valeur_affichage'] = 'non';
356
					}
357
				break;
105 aurelien 358
 
359
				// cas de la date, on la formate
360
				case 'date':
139 aurelien 361
 
362
					//echo '|'.$valeur['amv_valeur'].'|';
363
 
105 aurelien 364
					$format = Config::get('date_format_simple');
143 aurelien 365
 
139 aurelien 366
					if(!isset($format)) {
367
						$format = 'd/m/Y';
368
					}
218 aurelien 369
 
139 aurelien 370
					$time = strtotime($valeur['amv_valeur']);
371
 
372
					if(!$time || $time == '') {
373
						$valeur_modifiee['amv_valeur_affichage'] = $valeur['amv_valeur'];
105 aurelien 374
					} else {
139 aurelien 375
						$valeur_modifiee['amv_valeur_affichage'] = date($format, $time);
105 aurelien 376
					}
377
 
378
				break;
15 aurelien 379
 
380
				default:
381
					$valeur_modifiee['amv_valeur_affichage'] = $valeur['amv_valeur'];
382
				break;
383
			}
384
		}
385
 
386
		return $valeur_modifiee;
387
	}
89 aurelien 388
 
389
	public function collecterValeurInscription($valeurs, $tableau_mappage) {
390
 
391
		$valeurs_mappees = array();
392
		$valeurs_a_inserer = array();
393
 
394
		// on itère sur le tableau de valeur pour récupérer les champs de mappage;
395
		foreach($valeurs as $nom_champ => $valeur) {
15 aurelien 396
 
89 aurelien 397
			// pour chaque valeur
398
			// on extrait l'id du champ
399
			$ids_champ = mb_split("_",$nom_champ, 3);
400
 
401
			if(count($ids_champ) == 3) {
402
 
403
				$type = $ids_champ[0];
404
				$id_champ = $ids_champ[2];
405
				$condition = $ids_champ[1];
406
 
407
				// cas de la checkbox qui devrait être là mais pas cochée
408
				if($condition == 'hidden' && !isset($valeurs[$type.'_'.$id_champ])) {
409
					// dans ce cas là on fabrique une valeur vide
410
					$valeurs[$type.'_'.$id_champ] = 0;
411
				}
412
 
413
			} else {
414
				$type = $ids_champ[0];
415
				$condition = false;
416
				$id_champ = $ids_champ[1];
417
			}
418
 
419
			// Si le champ fait partie des champs mappés
420
			$cle_champ = array_search($id_champ, $tableau_mappage[1]);
421
 
422
			// on ajoute sa clé correspondante dans le tableau des champs mappés
423
			// qui sont les champs à vérifier
424
			if($condition) {
425
				$condition = $valeurs[$type.'_'.$id_champ];
426
				$valeurs_mappees[$id_champ] = array('valeur' => $valeur, 'type' => $type, 'condition' => $condition);
427
			} else {
428
				//$valeurs_mappees[$cle_champ] = $valeur;
429
				$valeurs_mappees[$id_champ] = array('valeur' => $valeur, 'type' => $type, 'condition' => false);
430
			}
431
 
432
			if(!$condition) {
433
				$valeurs_a_inserer[$nom_champ] = $valeur;
434
			}
435
		}
436
 
437
		return array('valeurs_mappees' => $valeurs_mappees, 'valeurs_a_inserer' => $valeurs_a_inserer);
438
	}
218 aurelien 439
 
440
	public function collecterValeursRechercheMoteur($valeurs_recherchees, $tableau_mappage) {
441
 
442
		// on itère sur le tableau de valeur pour récupérer les métadonnées;
443
		foreach($valeurs_recherchees as $nom_champ => $valeur) {
89 aurelien 444
 
218 aurelien 445
			$ids_champ = mb_split("_",$nom_champ);
446
 
447
			if(count($ids_champ) == 2) {
448
 
449
				$type = $ids_champ[0];
450
				$id_champ = $ids_champ[1];
451
 
452
				$cle_champ = array_search($id_champ, $tableau_mappage[1]);
246 aurelien 453
				if($cle_champ && $cle_champ != 'champ_pays') {
218 aurelien 454
 
455
					$valeurs_mappees[$tableau_mappage[0][$cle_champ]] = $valeur;
456
 
457
				} else {
458
					$valeurs_recherchees[$id_champ] = $valeur;
459
				}
294 aurelien 460
 
218 aurelien 461
				$valeurs_get[$nom_champ] = $valeur;
462
			}
463
 
464
			unset($valeurs_recherchees[$nom_champ]);
465
		}
466
 
467
		return array('valeurs_mappees' => $valeurs_mappees, 'valeurs_recherchees' => $valeurs_recherchees, 'valeurs_get' => $valeurs_get);
468
	}
469
 
15 aurelien 470
	/**
471
	 * Renvoie vrai ou faux suivant qu'un mail donné en paramètre est syntaxiquement valide (ne vérifie pas l'existence
472
	 * de l'adresse)
473
	 * @param string $mail le mail à tester
474
	 * @return boolean vrai ou faux suivant que le mail est valide ou non
475
	 */
476
	public function mailValide($mail) {
477
 
478
		$regexp_mail = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/';
479
		return preg_match($regexp_mail, $mail);
480
 
481
	}
482
 
483
	/**
484
	 * Renvoie un mot de passe crypté selon la fonction d'encryptage définie dans le fichier de configuration
485
	 * (si celle-ci n'existe pas on utilise une fonction par défaut)
486
	 * @param string $pass le mot de passe à encrypter
487
	 * @return string le mot de passe encrypté
488
	 */
489
	public function encrypterMotDePasse($pass) {
490
 
491
		$fonction = Config::get('pass_crypt_fonct');
492
 
493
		if(function_exists($fonction)) {
494
			return $fonction($pass);
495
		} else {
496
			return md5($pass);
497
		}
498
	}
41 aurelien 499
 
56 aurelien 500
	//TODO: créer une class util
501
	static function encrypterMotDepasseStatic($pass) {
502
 
503
		$fonction = Config::get('pass_crypt_fonct');
504
 
505
		if(function_exists($fonction)) {
506
			return $fonction($pass);
507
		} else {
508
			return md5($pass);
509
		}
510
	}
120 aurelien 511
 
148 aurelien 512
	static function convertirTailleFichier($taille) {
513
		if(!$taille) {
514
			return "0 Mo";
515
		}
516
 
517
		return number_format($taille*(1/1024)*(1/1024), 0).' Mo';
518
	}
519
 
120 aurelien 520
	public function genererMotDePasse() {
521
 
522
		$pass = "";
523
		$chaine = "abcdefghkmnpqrstuvwxyzABCDEFGHKLMNPQRSTUVWXYZ23456789";
56 aurelien 524
 
120 aurelien 525
		srand((double)microtime()*1000000);
526
		for($i = 0; $i < 10; $i++){
527
			$pass .= $chaine[rand()%strlen($chaine)];
528
		}
529
 
530
		return $pass;
531
 
532
	}
533
 
56 aurelien 534
	/**
535
	 * Suivant un identifiant de champ et un tableau, renvoie vrai ou faux suivant que le champs est obligatoire ou non
536
	 * @param int $id_champ l'identifiant de champ
537
	 * @param int $champ_obligatoire le tableau des champs obligatoires
538
	 */
41 aurelien 539
	private function estUnchampObligatoire($id_champ, $champs_obligatoire) {
540
 
541
		return in_array($id_champ, $champs_obligatoire) || in_array($id_champ, array_keys($champs_obligatoire));
542
	}
120 aurelien 543
 
544
	/**
545
	 *
546
	 */
547
	private function remplacerLienHtml($texte) {
548
 
549
		$expr = "(http[\S\.\/:]*)";
550
 
551
		$matches = array();
552
		preg_match_all($expr, $texte, $matches);
553
 
554
		foreach($matches as $match) {
555
 
556
			foreach($match as $element) {
557
				$str_lien = '<br /><a class="info_resume" href="'.$element.'" >'.$element.'</a>';
558
				$texte = str_replace($element, $str_lien, $texte);
559
			}
560
		}
561
 
562
		return $texte;
563
	}
15 aurelien 564
}
565
?>