35,74 → 35,6 |
$this->parametres = $this->contexte->getQS(); |
} |
|
|
/** |
* Construit un (vulgaire) abstract syntax tree: |
* "AND" => [ "tag1", "tag2" ] |
* Idéalement (avec un parser simple comme proposé par http://hoa-project.net/Literature/Hack/Compiler.html#Langage_PP) |
* nous aurions: |
* "AND" => [ "tag1", "tag2", "OR" => [ "tag3", "tag4" ] ] |
* |
* Ici nous devons traiter les cas suivants: |
* tags séparés par des "ET/AND OU/OR", séparés par des espaces ou des virgules. |
* Mais la chaîne peut aussi avoir été issue du "masque général" (la barre de recherche générique). |
* ce qui implique des comportement par défaut différents afin de préserver la compatibilité. |
* |
* Théorie: |
* 1) tags passés par "champ tag": |
* - support du ET/OU, et explode par virgule. |
* - si pas d'opérande détectée: "OU" |
* |
* 2) tags passés par "recherche générale": |
* - support du ET/OU, et explode par whitespace. |
* - si pas d'opérande détectée: "ET" |
* |
* La présence de $additional_sep s'explique car ET/OU sous-entendent une séparation par des espaces. |
* Mais ce n'est pas toujours pertinent car: 1) la compatibilité suggère de considérer parfois |
* la virgule comme séparateur et 2) les tags *peuvent* contenir des espaces. Par conséquent: |
* * a,b,c => "a" $default_op "b" $default_op "c" |
* * a,b AND c => "a" AND "b" AND "c" |
* * a OR b AND c,d => "a" AND "b" AND "c" AND "d" |
* C'est à dire par ordre décroissant de priorité: |
* 1) opérande contenu dans la chaîne |
* 2) opérande par défaut |
* 3) les séparateurs présents sont substitués par l'opérande déterminée par 1) ou 2) |
* |
* // TODO: support des parenthèses, imbrications & co: "(", ")" |
* // http://codehackit.blogspot.fr/2011/08/expression-parser-in-php.html |
* // http://blog.angeloff.name/post/2012/08/05/php-recursive-patterns/ |
* |
* @param $str: la chaîne à "parser" |
* @param $operateur_par_defaut: "AND" ou "OR" |
* @param $separateur_additionnel: séparateur de mots: |
*/ |
public function construireTableauTags($str = NULL, $operateur_par_defaut, $separateur_additionnel = ',') { |
if (!$str) return; |
$op = $this->definirOperateurParDefaut($str, $operateur_par_defaut); |
|
$mots = preg_split('/ (OR|AND|ET|OU) /', $str, -1, PREG_SPLIT_NO_EMPTY); |
if ($separateur_additionnel) { |
foreach ($mots as $index => $mot) { |
$mot = trim($mot); |
$mots_separes = preg_split("/$separateur_additionnel/", $mot, -1, PREG_SPLIT_NO_EMPTY); |
$mots[$index] = array_shift($mots_separes); |
$mots = array_merge($mots, $mots_separes); |
} |
} |
$mots = array_filter($mots); |
return array($op => $mots); |
} |
|
public function definirOperateurParDefaut($str, $operateur_par_defaut) { |
$op = $operateur_par_defaut; |
if (preg_match('/\b(ET|AND)\b/', $str)) { |
$op = 'AND'; |
} else if(preg_match('/\b(OU|OR)\b/', $str)) { |
$op = 'OR'; |
} |
return $op; |
} |
|
public function filtrerUrlParamsAppliImg() { |
$this->maintenirCompatibilitesParametres(); |
|
139,7 → 71,7 |
|
$this->filtrerUrlParamsGeneraux(); |
|
$trisPossibles = $this->conteneur->getParametre('appli_obs.tris_possibles'); |
$trisPossibles = $this->conteneur->getParametreTableau('appli_obs.tris_possibles'); |
$this->detruireParametreInvalide('tri', $trisPossibles); |
|
$this->supprimerParametresFiltresInvalides(); |
419,6 → 351,74 |
} |
} |
|
|
/** |
* Construit un (vulgaire) abstract syntax tree: |
* "AND" => [ "tag1", "tag2" ] |
* Idéalement (avec un parser simple comme proposé par http://hoa-project.net/Literature/Hack/Compiler.html#Langage_PP) |
* nous aurions: |
* "AND" => [ "tag1", "tag2", "OR" => [ "tag3", "tag4" ] ] |
* |
* Ici nous devons traiter les cas suivants: |
* tags séparés par des "ET/AND OU/OR", séparés par des espaces ou des virgules. |
* Mais la chaîne peut aussi avoir été issue du "masque général" (la barre de recherche générique). |
* ce qui implique des comportement par défaut différents afin de préserver la compatibilité. |
* |
* Théorie: |
* 1) tags passés par "champ tag": |
* - support du ET/OU, et explode par virgule. |
* - si pas d'opérande détectée: "OU" |
* |
* 2) tags passés par "recherche générale": |
* - support du ET/OU, et explode par whitespace. |
* - si pas d'opérande détectée: "ET" |
* |
* La présence de $additional_sep s'explique car ET/OU sous-entendent une séparation par des espaces. |
* Mais ce n'est pas toujours pertinent car: 1) la compatibilité suggère de considérer parfois |
* la virgule comme séparateur et 2) les tags *peuvent* contenir des espaces. Par conséquent: |
* * a,b,c => "a" $default_op "b" $default_op "c" |
* * a,b AND c => "a" AND "b" AND "c" |
* * a OR b AND c,d => "a" AND "b" AND "c" AND "d" |
* C'est à dire par ordre décroissant de priorité: |
* 1) opérande contenu dans la chaîne |
* 2) opérande par défaut |
* 3) les séparateurs présents sont substitués par l'opérande déterminée par 1) ou 2) |
* |
* // TODO: support des parenthèses, imbrications & co: "(", ")" |
* // http://codehackit.blogspot.fr/2011/08/expression-parser-in-php.html |
* // http://blog.angeloff.name/post/2012/08/05/php-recursive-patterns/ |
* |
* @param $str: la chaîne à "parser" |
* @param $operateur_par_defaut: "AND" ou "OR" |
* @param $separateur_additionnel: séparateur de mots: |
*/ |
public function construireTableauTags($str = null, $operateur_par_defaut, $separateur_additionnel = ',') { |
if (!$str) return; |
$op = $this->definirOperateurParDefaut($str, $operateur_par_defaut); |
|
$mots = preg_split('/ (OR|AND|ET|OU) /', $str, -1, PREG_SPLIT_NO_EMPTY); |
if ($separateur_additionnel) { |
foreach ($mots as $index => $mot) { |
$mot = trim($mot); |
$mots_separes = preg_split("/$separateur_additionnel/", $mot, -1, PREG_SPLIT_NO_EMPTY); |
$mots[$index] = array_shift($mots_separes); |
$mots = array_merge($mots, $mots_separes); |
} |
} |
$mots = array_filter($mots); |
return array($op => $mots); |
} |
|
private function definirOperateurParDefaut($str, $operateur_par_defaut) { |
$op = $operateur_par_defaut; |
if (preg_match('/\b(ET|AND)\b/', $str)) { |
$op = 'AND'; |
} else if(preg_match('/\b(OU|OR)\b/', $str)) { |
$op = 'OR'; |
} |
return $op; |
} |
|
// masque.type: ['adeterminer', 'aconfirmer', 'endiscussion', 'validees'] |
private function filtrerType() { |
if(isset($this->parametres['masque.type'])) { |