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