Index de l'aide
Les filtres
Description
Dans votre programme, un filtre est une chaîne de caractères composée d'opérateurs logiques (AND, OR, XOR, NOT) et d'éléments simples (un nombre ou un texte). Grasse à cette écriture simplifiée il permet de cibler de façon précise ou large un ensemble de clients ou de groupes.
Il existe 2 types de filtre imbricable l'un dans l'autre. Le premier est un type FiltreClient qui donne une liste de clients. Le second est de type FiltreGroupe qui donne une liste de groupes. Chaque fonction nécessitant un filtre attend un type précis. Au sein de chaque type de filtre, un élément ou un opérateur ne travaillera que sur le type du filtre. Par exemple, un nombre dans un FiltreClient donnera un client dont le uid (user id) est le nombre. Un texte dans un FiltreGroupe donnera un groupe dont le nom est le texte. Notez que du coup, un nombre dans un FiltreGroupe donne la liste de tous les groupes dont le client identifié par ce nombre fait partie.
Syntaxe des operateurs :
Comme en programmation les opérateurs sont :
- && : L'opérateur AND logique
- || : L'opérateur OR logique
- ^| : L'opérateur XOR logique
- ! : L'opérateur NOT logique
syntaxe des éléments :
Les éléments sont séparés par des opérateurs.
- 15 (un nombre) : Indique un numéro uid (user id) de client
- '...' : Un nom exact
- /.../ : Une expression régulière
syntaxe des types de filtres :
Pour imbriquer les filtres les uns dans les autres, il faut spécifier le type de filtre dans lequel on travaille. quand le type est omis, cela sous entend que l'on travaille dans le type attendu par la fonction.
- [...] : Travaille dans un FiltreGroupe
- {...} : Travaille dans un FiltreClient
Notez que les (...) (parenthèse) ne sont pas un type de filtre mais permettent comme dans une simple écriture mathématique de définir des priorités de traitements sur des opérateurs.
Utilisation :
Pour nos explications nous allons utiliser la fonction sendMessage() qui attend un FiltreClient. Il n'est donc pas nécessaire d'écrire les "{}" si l'on veut travailler sur des clients.
- sendMessage("Hello !","25")
Dans cette syntaxe, le filtre donne une liste contenant un client dont le numéro uid (user id) est 25. Evidement il ne peut exister qu'un seul client portant ce numéro. Le message "Hello !" lui est alors envoyé.
- sendMessage("Hello !","!25")
Ici nous utilisons l'opérateur NOT grasse au '!'. Etant toujours dans un filtreClient et comme expliqué dans l'introduction, l'opérateur travaille sur des clients. Cela signifie que l'on prend "l'inverse" de ce que le nombre 25 nous donne. Donc tous les clients sauf le client dont le uid (user id) est 25.
- sendMessage("Hello !","25 || 26")
Nous avons ici un opérateur OR. L'opérateur travaille donc sur des clients, il fait un OU logique sur 25 et 26. Il en ressort donc une liste de deux clients contenant 25 et 26. Le message partira donc aux clients de cette liste (s'ils existent bien sur).
- sendMessage("Hello !","25 && 26")
Même principe que précédemment, on fait un AND logique sur 25 et 26. Il en ressort une liste de clients vide puisque aucun client ne peut avoir le numéro 25 et 26 en même temps. Dans ce cas cette écriture est "absurde" puisque qu'elle ne peux que donner une liste vide. Mais le && servira plus tard.
Imbrication de filtres :
- sendMessage("Hello !","[30]")
Nous sommes toujours dans une fonction qui attend un FiltreClient. Dans notre FiltreClient nous y avons imbriqué un FiltreGroupe. Ce FiltreGroupe donne donc une liste de groupe. Dans notre Filtreclient cela se traduit par une liste de tous les clients appartenant à l'un de ses groupes.
Commençons par l'intérieur de notre FiltreGroupe. Comme expliqué dans l'introduction, un nombre dans un FiltreGroupe donne la liste de tous les groupes dont le client identifié par ce nombre fait partie. Ce filtreGroupe donne forcement une liste de groupes. Dans notre FiltreClient, cette liste de groupes devient une liste de clients faisant partit de l'un de ses groupes. Au final le message partira à tous les clients faisant parti de l'un des groupes auquel le client uid (user id) 30 appartient.
- sendMessage("Hello !","[30 || 32]")
Pour comprendre, nous allons décomposer le FiltreGroupe. Comme nous l'avons vu, le nombre 30 donne une liste de groupes auxquels le client uid (user id) 30 appartient. Il en va de même pour le client 32. Notre opérateur OR logique s'applique donc à 2 listes de groupes. Il en ressort une liste de groupe contenant un "mélange" des deux listes. De cette liste, le FiltreClient en ressort une liste de clients appartenant à l'un de ses groupes.
Par exemple : Si le client 30 appartient au groupe 'A' et au groupe 'B', le client 32 appartient au groupe 'B' et 'C'. Alors le nombre 30 dans le FiltreGroupe donne une liste de deux groupes 'A' et 'B'. Le nombre 32 donne aussi une liste de deux groupes 'B' et 'C'. L'opérateur logique OR s'applique sur ces deux listes et donne une liste contenant 'A', 'B' et 'C'. Sortit du FiltreGroupe, notre FiltreClient transforme cette liste de groupes en liste de clients appartenant à l'un de ses trois groupes.
- sendMessage("Hello !","[30 && 32]")
En reprenant l'exemple précédent : Le nombre 30 dans le FiltreGroupe donne une liste de deux groupes 'A' et 'B'. Le nombre 32 donne aussi une liste de deux groupes 'B' et 'C'. L'opérateur logique AND s'applique sur ces deux listes et donne cette fois une liste ne contenant que 'B' (commun aux deux listes). Sortit du FiltreGroupe, notre FiltreClient transforme cette liste en liste de clients appartenant au groupe 'B'.
Attention à ne pas confondre avec l'exemple suivant :
- sendMessage("Hello !","[30] && [32]")
En effet si l'on garde toujours notre exemple : Le nombre 30 donne la liste de groupe 'A' et 'B'. Sortit du FiltreGroupe, nous avons une liste de tous les clients appartenant à l'un des deux groupes. De l'autre côté, 32 donne une liste composée de 'B' et 'C' qui sortit du FiltreGroupe donne tous les clients appartenant à l'un des deux groupes. L'opérateur AND étant dans le FiltreClient, il agit sur les deux listes de clients et donne une liste de clients communs aux deux listes. Le résultat est donc sensiblement différant de l'exemple précédent.
- sendMessage("Hello !","[(30 || 31) && (28 || 29)]")
Les parenthèses s'utilisent comme en mathématique. Elles ne représentent pas de type de filtre et peuvent s'imbriquer à volonté. Notez q'un filtre est toujours traité de gauche vers la droite. si vous avez plusieurs opérateurs OU et ET vous avez tout intérêt à utiliser les parenthèses pour définir les priorités de traitements.
Le schéma suivant explique le fonctionnement de ce filtre :
L'élément texte :
Si l'élément texte n'a pas sa place dans un filtreClient, il est très utile pour un FiltreGroupe et permet de donner une liste contenant un groupe (s'il existe) dont le nom est le texte.
- sendMessage("Hello !","['toto']")
Le texte 'toto' donne donc une liste contenant un groupe (s'il existe) dont le nom est 'toto'. Encore une fois, sortit du FiltreGroupe, le FiltreClient donne une liste de tous les clients appartenant à ce groupe.
Attention : Afin d'éviter les conflits de caractères tels que les [ ou les ' dans le texte, il est préférable d'utiliser la fonction quotemeta() de PHP ou PERL afin de placer des '\' devant les caractères spéciaux.
- sendMessage("Hello !","[!'toto']")
L'opérateur NOT s'appliquant à n'importe quel élément, le texte et l'opérateur donnent alors une liste de tous les groupes existants sauf celui dont le nom est 'toto'. Le FiltreClient donne donc une liste de tous les clients appartenant à l'un des groupes de la liste.
- sendMessage("Hello !","!['toto']")
L'opérateur NOT s'applique aussi à un filtre entier. Mais attention, dans cet exemple, l'opérateur travaille sur une liste de clients. Le FiltreGroupe donne une liste d'un groupe dont le nom est 'toto', le FiltreClient la convertit en liste de clients appartenant à ce groupe et l'opérateur NOT donne tous les clients sauf ceux de la liste.
- sendMessage("Hello !","['toto' || 'bateau' || 10]")
Comme pour l'élément "nombre", il est possible d'intégrer des opérateurs entre plusieurs éléments textes.
L'élément expression régulière :
Un élément expression régulière dans un FiltreGroupe donne tous les groupes dont le nom vérifie l'expression régulière. Pour connaître le principe de syntaxe d'une expression régulier : cliquez ici
- sendMessage("Hello !","[/to+to/]")
Ici l'expression régulière vérifie les groupes dont le nom et "toto" ou "toooto" ou encore "tooooooooto". au final, tous les clients appartenant à l'un de ses groupes recevront le message.
Comme pour l'élément texte, il est possible d'utiliser des opérateurs et d'autres éléments :
- sendMessage("Hello !","[/to+to/ && !10]")
Attention : ici aussi, afin d'éviter les conflits de caractères tels que les [ ou les ' dans le texte, il est préférable d'utiliser la fonction quotemeta() de PHP ou PERL afin de placer des '\' devant les caractères spéciaux. Par exemple, si le caractère '+' doit faire partie du nom du groupe et non pas d'un critère de l'expression régulière, il faut écrire :
- sendMessage("Hello !","[/to\\+to/]")
Il y'a ici deux caractères '\' afin q'au final la chaîne en mémoire soit : [/to\+to/]
Pour aller plus loin :
La syntaxe des filtres est très souple. Elle permet d'imbriquer à volonté des types de filtres. Exemple :
- sendMessage("Hello !","[(10 && 20) || !{(15 || 12) && [34 || 31]}]")