Subversion Repositories eFlore/Applications.del

Rev

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

Rev 1840 Rev 1845
Line 33... Line 33...
33
		$this->conteneur = $conteneur;
33
		$this->conteneur = $conteneur;
34
		$this->contexte = $this->conteneur->getContexte();
34
		$this->contexte = $this->conteneur->getContexte();
35
		$this->parametres = $this->contexte->getQS();
35
		$this->parametres = $this->contexte->getQS();
36
	}
36
	}
Line 37... Line -...
37
 
-
 
38
 
-
 
39
	/**
-
 
40
	 * Construit un (vulgaire) abstract syntax tree:
-
 
41
	 * "AND" => [ "tag1", "tag2" ]
-
 
42
	 * Idéalement (avec un parser simple comme proposé par http://hoa-project.net/Literature/Hack/Compiler.html#Langage_PP)
-
 
43
	 * nous aurions:
-
 
44
	 * "AND" => [ "tag1", "tag2", "OR" => [ "tag3", "tag4" ] ]
-
 
45
	 *
-
 
46
	 * Ici nous devons traiter les cas suivants:
-
 
47
	 * tags séparés par des "ET/AND OU/OR", séparés par des espaces ou des virgules.
-
 
48
	 * Mais la chaîne peut aussi avoir été issue du "masque général" (la barre de recherche générique).
-
 
49
	 * ce qui implique des comportement par défaut différents afin de préserver la compatibilité.
-
 
50
	 *
-
 
51
	 * Théorie:
-
 
52
	 * 1) tags passés par "champ tag":
-
 
53
	 * - support du ET/OU, et explode par virgule.
-
 
54
	 * - si pas d'opérande détectée: "OU"
-
 
55
	 *
-
 
56
	 * 2) tags passés par "recherche générale":
-
 
57
	 * - support du ET/OU, et explode par whitespace.
-
 
58
	 * - si pas d'opérande détectée: "ET"
-
 
59
	 *
-
 
60
	 * La présence de $additional_sep s'explique car ET/OU sous-entendent une séparation par des espaces.
-
 
61
	 * Mais ce n'est pas toujours pertinent car: 1) la compatibilité suggère de considérer parfois
-
 
62
	 * la virgule comme séparateur et 2) les tags *peuvent* contenir des espaces. Par conséquent:
-
 
63
	 * * a,b,c => "a" $default_op "b" $default_op "c"
-
 
64
	 * * a,b AND c => "a" AND "b" AND "c"
-
 
65
	 * * a OR b AND c,d => "a" AND "b" AND "c" AND "d"
-
 
66
	 * C'est à dire par ordre décroissant de priorité:
-
 
67
	 * 1) opérande contenu dans la chaîne
-
 
68
	 * 2) opérande par défaut
-
 
69
	 * 3) les séparateurs présents sont substitués par l'opérande déterminée par 1) ou 2)
-
 
70
	 *
-
 
71
	 * // TODO: support des parenthèses, imbrications & co: "(", ")"
-
 
72
	 * // http://codehackit.blogspot.fr/2011/08/expression-parser-in-php.html
-
 
73
	 * // http://blog.angeloff.name/post/2012/08/05/php-recursive-patterns/
-
 
74
	 *
-
 
75
	 * @param $str: la chaîne à "parser"
-
 
76
	 * @param $operateur_par_defaut: "AND" ou "OR"
-
 
77
	 * @param $separateur_additionnel: séparateur de mots:
-
 
78
	 */
-
 
79
	public function construireTableauTags($str = NULL, $operateur_par_defaut, $separateur_additionnel = ',') {
-
 
80
		if (!$str) return;
-
 
81
		$op = $this->definirOperateurParDefaut($str, $operateur_par_defaut);
-
 
82
 
-
 
83
		$mots = preg_split('/ (OR|AND|ET|OU) /', $str, -1, PREG_SPLIT_NO_EMPTY);
-
 
84
		if ($separateur_additionnel) {
-
 
85
			foreach ($mots as $index => $mot) {
-
 
86
				$mot = trim($mot);
-
 
87
				$mots_separes = preg_split("/$separateur_additionnel/", $mot, -1, PREG_SPLIT_NO_EMPTY);
-
 
88
				$mots[$index] = array_shift($mots_separes);
-
 
89
				$mots = array_merge($mots, $mots_separes);
-
 
90
			}
-
 
91
		}
-
 
92
		$mots = array_filter($mots);
-
 
93
		return array($op => $mots);
-
 
94
	}
-
 
95
 
-
 
96
	public function definirOperateurParDefaut($str, $operateur_par_defaut) {
-
 
97
		$op = $operateur_par_defaut;
-
 
98
		if (preg_match('/\b(ET|AND)\b/', $str)) {
-
 
99
			$op = 'AND';
-
 
100
		} else if(preg_match('/\b(OU|OR)\b/', $str)) {
-
 
101
			$op = 'OR';
-
 
102
		}
-
 
103
		return $op;
-
 
104
	}
-
 
105
 
37
 
106
	public function filtrerUrlParamsAppliImg() {
38
	public function filtrerUrlParamsAppliImg() {
Line 107... Line 39...
107
		$this->maintenirCompatibilitesParametres();
39
		$this->maintenirCompatibilitesParametres();
108
 
40
 
Line 137... Line 69...
137
		$paramsParDefaut = $this->conteneur->getParametreTableau('observations.parametres_valeurs_defaut');
69
		$paramsParDefaut = $this->conteneur->getParametreTableau('observations.parametres_valeurs_defaut');
138
		$this->definirParametresDefauts($paramsParDefaut);
70
		$this->definirParametresDefauts($paramsParDefaut);
Line 139... Line 71...
139
 
71
 
Line 140... Line 72...
140
		$this->filtrerUrlParamsGeneraux();
72
		$this->filtrerUrlParamsGeneraux();
141
 
73
 
Line 142... Line 74...
142
		$trisPossibles = $this->conteneur->getParametre('appli_obs.tris_possibles');
74
		$trisPossibles = $this->conteneur->getParametreTableau('appli_obs.tris_possibles');
143
		$this->detruireParametreInvalide('tri', $trisPossibles);
75
		$this->detruireParametreInvalide('tri', $trisPossibles);
144
 
76
 
Line 417... Line 349...
417
			$this->parametresFiltres['masque.tag_del'] = $this->construireTableauTags($this->parametres['masque'], 'AND', ' ');
349
			$this->parametresFiltres['masque.tag_del'] = $this->construireTableauTags($this->parametres['masque'], 'AND', ' ');
418
			$this->parametresFiltres['_parametres_condition_or_'][] = 'masque.tag_del';
350
			$this->parametresFiltres['_parametres_condition_or_'][] = 'masque.tag_del';
419
		}
351
		}
420
	}
352
	}
Line -... Line 353...
-
 
353
 
-
 
354
 
-
 
355
	/**
-
 
356
	 * Construit un (vulgaire) abstract syntax tree:
-
 
357
	 * "AND" => [ "tag1", "tag2" ]
-
 
358
	 * Idéalement (avec un parser simple comme proposé par http://hoa-project.net/Literature/Hack/Compiler.html#Langage_PP)
-
 
359
	 * nous aurions:
-
 
360
	 * "AND" => [ "tag1", "tag2", "OR" => [ "tag3", "tag4" ] ]
-
 
361
	 *
-
 
362
	 * Ici nous devons traiter les cas suivants:
-
 
363
	 * tags séparés par des "ET/AND OU/OR", séparés par des espaces ou des virgules.
-
 
364
	 * Mais la chaîne peut aussi avoir été issue du "masque général" (la barre de recherche générique).
-
 
365
	 * ce qui implique des comportement par défaut différents afin de préserver la compatibilité.
-
 
366
	 *
-
 
367
	 * Théorie:
-
 
368
	 * 1) tags passés par "champ tag":
-
 
369
	 * - support du ET/OU, et explode par virgule.
-
 
370
	 * - si pas d'opérande détectée: "OU"
-
 
371
	 *
-
 
372
	 * 2) tags passés par "recherche générale":
-
 
373
	 * - support du ET/OU, et explode par whitespace.
-
 
374
	 * - si pas d'opérande détectée: "ET"
-
 
375
	 *
-
 
376
	 * La présence de $additional_sep s'explique car ET/OU sous-entendent une séparation par des espaces.
-
 
377
	 * Mais ce n'est pas toujours pertinent car: 1) la compatibilité suggère de considérer parfois
-
 
378
	 * la virgule comme séparateur et 2) les tags *peuvent* contenir des espaces. Par conséquent:
-
 
379
	 * * a,b,c => "a" $default_op "b" $default_op "c"
-
 
380
	 * * a,b AND c => "a" AND "b" AND "c"
-
 
381
	 * * a OR b AND c,d => "a" AND "b" AND "c" AND "d"
-
 
382
	 * C'est à dire par ordre décroissant de priorité:
-
 
383
	 * 1) opérande contenu dans la chaîne
-
 
384
	 * 2) opérande par défaut
-
 
385
	 * 3) les séparateurs présents sont substitués par l'opérande déterminée par 1) ou 2)
-
 
386
	 *
-
 
387
	 * // TODO: support des parenthèses, imbrications & co: "(", ")"
-
 
388
	 * // http://codehackit.blogspot.fr/2011/08/expression-parser-in-php.html
-
 
389
	 * // http://blog.angeloff.name/post/2012/08/05/php-recursive-patterns/
-
 
390
	 *
-
 
391
	 * @param $str: la chaîne à "parser"
-
 
392
	 * @param $operateur_par_defaut: "AND" ou "OR"
-
 
393
	 * @param $separateur_additionnel: séparateur de mots:
-
 
394
	 */
-
 
395
	public function construireTableauTags($str = null, $operateur_par_defaut, $separateur_additionnel = ',') {
-
 
396
		if (!$str) return;
-
 
397
		$op = $this->definirOperateurParDefaut($str, $operateur_par_defaut);
-
 
398
 
-
 
399
		$mots = preg_split('/ (OR|AND|ET|OU) /', $str, -1, PREG_SPLIT_NO_EMPTY);
-
 
400
		if ($separateur_additionnel) {
-
 
401
			foreach ($mots as $index => $mot) {
-
 
402
				$mot = trim($mot);
-
 
403
				$mots_separes = preg_split("/$separateur_additionnel/", $mot, -1, PREG_SPLIT_NO_EMPTY);
-
 
404
				$mots[$index] = array_shift($mots_separes);
-
 
405
				$mots = array_merge($mots, $mots_separes);
-
 
406
			}
-
 
407
		}
-
 
408
		$mots = array_filter($mots);
-
 
409
		return array($op => $mots);
-
 
410
	}
-
 
411
 
-
 
412
	private function definirOperateurParDefaut($str, $operateur_par_defaut) {
-
 
413
		$op = $operateur_par_defaut;
-
 
414
		if (preg_match('/\b(ET|AND)\b/', $str)) {
-
 
415
			$op = 'AND';
-
 
416
		} else if(preg_match('/\b(OU|OR)\b/', $str)) {
-
 
417
			$op = 'OR';
-
 
418
		}
-
 
419
		return $op;
-
 
420
	}
421
 
421
 
422
	// masque.type: ['adeterminer', 'aconfirmer', 'endiscussion', 'validees']
422
	// masque.type: ['adeterminer', 'aconfirmer', 'endiscussion', 'validees']
423
	private function filtrerType() {
423
	private function filtrerType() {
424
		if(isset($this->parametres['masque.type'])) {
424
		if(isset($this->parametres['masque.type'])) {
425
			$typesArray = explode(';', $this->parametres['masque.type']);
425
			$typesArray = explode(';', $this->parametres['masque.type']);