Groupes conditionnels

Les groupes conditionnels c’est quoi ?

Les groupes conditionnels sont un moyen de créer et de regrouper des contacts en utilisant les données des contacts enrichis. C’est donc un moyen de créer des groupes dont la liste des membres n’est pas fixe mais calculée dynamiquement selon les critères de votre choix. C’est un excellent moyen de faire des listes de diffusion dynamiques.

Lors de l’envoi d’un SMS, les groupes conditionnels s’utilisent de la même façon que les groupes classiques.

Activer/désactiver le support des groupes conditionnels

Le support des groupes conditionnels peut être activé/désactivé. Pour cela, rendez-vous dans la partie « Réglages » de RaspiSMS, modifiez la valeur dans le champ « Support des groupes conditionnels » et cliquez sur « Mettre à jour les données ».

Comment ça fonctionne ?

Lors de la création d’un groupe conditionnel, au lieu d’écrire la liste des contacts faisant partie du groupe, vous écrivez une règle qui sera évaluée pour chaque contact avec les données de celui-ci. Si la règle est évaluée comme VRAIE, alors le contact est inclus dans le groupe, s’il elle est évaluée comme FAUSSE, le contact n’est pas inclus.

Au moment de l’envoi d’un SMS ayant parmi ses cibles un groupe conditionnel, la liste de tous les contacts est récupérée et la règle du groupe conditionnelle est évaluée pour chacun.

Note

Lors de la création d’un groupe conditionnel vous pouvez prévisualiser la liste des membres du groupes aussitôt en cliquant sur le bouton « Prévisualiser les contacts » en bas à droite.

Les bases des règles

Note

N’hésitez pas à tester vous-même les exemples qui suivent pour pleinement prendre en main les groupes conditionnels. Utilisez la fonctionnalité de prévisualisation pour voir la liste des contacts dans votre groupe.

Le système de règle utilisé par les groupes conditionnels est une sorte de langage de programmation, assez proche dans l’idée du système de templating. Il s’agit en fait d’une « expression booléenne », comme lors de l’utilisation d’un IF en programmation.

Nos contacts d’exemple

Pour la suite de ce tutoriel nous allons considérer que nous possédons deux contacts, « John Doe » et « Jane Doe » avec les données enrichies suivantes :

Données de John Doe

Nom de la donnée

Valeur de la donnée

lastname

Doe

firstname

John

birthdate

1990-10-22

gender

male

vip

1

Données de Jane Doe

Nom de la donnée

Valeur de la donnée

lastname

Doe

firstname

Jane

birthdate

1992-08-15

gender

female

vip

0

Notre première règle

Pour commencer, nous allons créer une règle très simple qui sera toujours VRAIE. À quoi une telle règle peut bien servir ? Et bien, par exemple à faire un groupe qui contient tous vos contacts. En effet, puisque la règle sera toujours VRAIE, chaque contact testé sera considéré comme devant faire partie du groupe. C’est donc un moyen simple d’envoyer un message à tous vos contacts sans avoir à mettre le groupe à jour à chaque ajout d’un nouveau contact.

Pour écrire une règle, on fait en fait une comparaison entre deux « opérandes » et un « opérateur », selon la forme suivante opérateur_gauche opérateur opérande_droite. Il existe plusieurs opérateurs que nous verrons plus tard, mais pour commencer regardons l’opérateur d’égalité, celui-ci s’écrit == et revient à dire EST ÉGAL À.

Par conséquent, nous pouvons écrire une règle (ou « condition ») qui sera toujours VRAIE comme ceci :

1 == 1

Si vous cliquez sur la fonctionnalité de pré-visualisation vous verrez que tous nos contacts sont inclus dans le groupe.

Utiliser les données des contacts

C’est bien gentil tout ça, mais comment peut-on utiliser ces règles pour modifier le comportement en fonction des données d’un contact ? Eh bien tout simplement en comparant non pas deux opérateurs fixes comme précédemment, mais un opérateur fixe et une variable contenant la donnée du contact qui nous intéresse.

Pour accéder à une donnée d’un contact il nous suffit d’utiliser la notation contact.nom_de_la_donnée. Si nous prenons nos contacts d’exemple, nous pouvons accéder à leur sexe en utilisant la notation contact.gender.

Vous pouvez également accéder aux métas données du contact, tel que le nom que vous lui avez donner, son numéro de téléphone, sa date de création ou sa date de mise à jour avec la syntaxe contact_metas.name, contact_metas.number, contact_metas.created_at et contact_metas.updated_at.

Faire un groupe avec tous les contacts femmes

Nous allons créer un groupe qui contiendra tous les contacts dont la donnée gender est égale à female. Pour cela il y a encore une chose que vous devez apprendre, la comparaison avec des chaînes de caractères. En effet, jusqu’à présent nous avons comparé des chiffres (1 et 1 entre eux), mais les données d’un contact sont toujours des chaînes de caractères.

Pour faire une comparaison avec du texte, vous devrez entourer celui-ci avec des guillemets simples ('), ou doubles ("). On parle alors d’une chaîne de caractère. Sans cela, le moteur de règle ne pourrais pas savoir si vous parlez d’une variable (par exemple contact.gender) ou d’un texte !

Dans notre cas, nous allons vouloir comparer le sexe de notre contact avec la chaîne 'female'.

Avertissement

Attention, les chaînes de caractères sont « sensibles à la casse », donc 'female' est différent de 'FEMALE'.

Note

Et si vous devez écrire un guillemet simple, par exemple pour faire une apostrophe, au milieu d’une chaîne délimitée par des guillemets simples, comment faire ? Eh bien il vous suffit de « l’échapper », c’est-à-dire indiquer qu’il s’agit d’un simple caractère et pas d’un caractère spécial. Pour cela il vous suffit d’écrire un \ devant le '. Par exemple, pour écrire aujourd'hui, vous écrirez 'aujourd\'hui'.

Le fonctionnement est le même pour les guillemets doubles.

Vous devrez d’ailleurs faire pareil pour écrire un \ : vous devrez alors écrire \\.

Pour créer un groupe avec tous les contacts femmes, nous pouvons donc écrire.

contact.gender == 'female'

Comme vous pouvez le constater en utilisant la fonction de prévisualisation, cette fois seule « Jane Doe » est dans le groupe.

Utiliser d’autres opérateurs et combiner des conditions

Jusqu’à présent nous avons seulement vu l’opérateur d’égalité, mais ce n’est pas le seul. En effet, non seulement il existe d’autres opérateurs de comparaison, mais il existe aussi des opérateurs « logiques » qui permettent de combiner plusieurs conditions.

Les opérateurs de comparaison et mathématiques

En plus de l’opérateur d’égalité, des opérateurs d’inégalité, d’infériorité, etc. sont utilisables, ainsi que des opérateurs mathématiques.

Les opérateurs de comparaison

Opérateur

Effets

==

Vrai si les deux opérandes ont la même valeur.

!=

Vrai si les deux opérandes n’ont pas la même valeur.

<

Vrai si la valeur de l’opérande gauche est plus petite que celle de l’opérande droite.

>

Vrai si la valeur de l’opérande gauche est plus grande que celle de l’opérande droite.

<=

Vrai si la valeur de l’opérande gauche est plus petite ou égale à celle de l’opérande droite.

>=

Vrai si la valeur de l’opérande gauche est plus grande ou égale que celle de l’opérande droite.

En voyons ces opérateurs, on se rend par exemple compte que l’on aurait pu écrire d’autres formes de notre première règle toujours vraie, comme 1 < 10 ou encore 'vraie' != 'faux'.

En plus des opérateurs de comparaison, les opérateurs mathématiques classiques sont aussi utilisables.

Les opérateurs mathématiques

Opérateur

Effets

+

Addition.

-

Soustraction.

*

Multiplication.

/

Division.

**

Puissance.

%

Modulo.

Avec ces opérateurs on pourrait encore reprendre la règle précédente comme suit, 1 < 5*2 ou 4 == 2*2.

Combiner plusieurs conditions

Pour aller plus loin que la simple comparaison, vous pouvez combiner plusieurs conditions en utilisant les opérateurs logiques, en faisant condition opérateur condition.

Les opérateurs logiques

Opérateur

Effets

&&

Vrai si les deux opérations sont vraies

||

Vrai si au moins une des deux opérations est vraie

!

Cas particulier, elle s’utilise avec une seule condition et devant, par exemple !(1==1). Inverse la condition, si vrai -> faux, si faux -> vrai.

Note

Comme vous le voyez avec le dernier cas, on peux aussi utiliser les parenthèses, ( et ), comme en mathématique, pour regrouper des expressions.

Nous pourrions donc choisir de faire un groupe avec seulement les femmes qui sont VIP (ce groupe sera vide puisque « Jane Doe » n’est pas VIP).

contact.gender == 'female' && contact.vip == 1

Note

Pour la suite de ce tutoriel, nous n’incluerons pas cette vérification à chaque fois pour des raisons de lisibilité, mais nous vous encourageons vivement à l’utiliser systématiquement !

Aller plus loin avec les groupes conditionnels

Le moteur est un outil très puissant et il s’agit techniquement d’un véritable petit langage de programmation.

Note

Pour proposer autant de fonctionnalités, RaspiSMS utilise le moteur règle « ExpressionLanguage » du projet Symfony (version 5.x). Si vous souhaitez aller encore plus loin avec le moteur de règle, nous vous invitons à vous reporter à la documentation du composant ExpressionLanguage de Symfony. Vous y trouverez de nombreuses informations.

Utiliser des fonctions

En plus des opérateurs de base, certaines fonctionnalités supplémentaires sont accessibles à travers les « fonctions ». Pour utiliser une fonction on utilise la notation nom_fonction(parametre1, parametre2...). Les fonctions peuvent retourner des chaînes de caractères, des chiffres ou même VRAIE ou FAUX.

Nous pourrions par exemple utiliser la fonction upper sur la donnée lastname de notre contact pour la mettre en majuscules, afin de supprimer les risques d’erreurs liées à la casse.

upper(contact.lastname) == 'DOE'

Vous pouvez tentez de modifier la casse de 'DOE', par exemple en 'DoE' et constater qu’après modification des contacts ne sont pas inclus. À l’inverse, modifier la casse de la donnée lastname d’un des contacts n’aura aucun effet. C’est un bon moyen de vous prémunir contre les erreurs de casse lors de la saisie des données.

Liste des fonctions disponibles

Seules les fonctions suivantes sont disponibles au sein de RaspiSMS.

Liste des fonctions basiques disponibles dans RaspiSMS

Nom dans RaspiSMS

Équivalent PHP

exists

!is_null

lower

mb_strtolower

upper

mb_strtoupper

substr

mb_substr

strlen

mb_strlen

abs

abs

date

date_create

date_from_format

date_create_from_format

intval

intval

boolval

boolval

count

count

Pour en apprendre plus sur chacune de ces fonctions, consultez la page correspondante sur la documentation PHP.

Liste des fonctions avancées disponibles dans RaspiSMS

Nom dans RaspiSMS

Description

Utilisation

Équivalent PHP

is_birthday

Vérifie si la date du jour est un anniversaire pour une date donnée.

is_birthday(date("1892-01-03"))

isset($arg1) && is_a($arg1, 'DateTime') && $arg1->format('m-d') == (new \DateTime())->format('m-d')

Vérifier si les données du contact existent

Comme les données du contact sont entièrement définies par l’utilisateur et ne sont pas obligatoires, elles peuvent varier d’un utilisateur à l’autre. Cela peut parfois créer des comportements imprévus, pour cette raison nous vous conseillons de toujours vérifier si les données que vous utilisez sont disponibles. Pour cela, il vous suffit de commencer votre condition par une conditon de la forme (exists(contact.var1) && exists(contact.var2)) && (votre_vraie_condition).

Dans notre cas, nous devrions donc modifier notre dernier exemple comme ceci.

(exists(contact.lastname)) && (upper(contact.lastname) == 'DOE')

Si une variable n’est pas définie, alors la condition retournera FAUX et le contact ne sera pas inclus.

Note

Pour des raisons de lisibilité nous n’avons pas inclus cette vérification dans tous nos exemples, mais vous êtes fortement encouragés à toujours vérifier la présence des données.