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']);
|