From 7b89efd2d15d3bf172b3536686eda0800f06404e Mon Sep 17 00:00:00 2001
From: "marcimat@rezo.net" <>
Date: Wed, 28 Sep 2016 17:06:10 +0000
Subject: [PATCH] =?UTF-8?q?Ajout=20d'une=20option=20dans=20le=20traitement?=
 =?UTF-8?q?=20par=20email=20:=20elle=20permet=20d'indiquer=20un=20ou=20plu?=
 =?UTF-8?q?sieurs=20emails=20en=20fonction=20de=20la=20valeur=20qui=20a=20?=
 =?UTF-8?q?=C3=A9t=C3=A9=20saisie=20dans=20un=20champ=20du=20formulaire.?=
 =?UTF-8?q?=20Particuli=C3=A8rement=20utilise=20pour=20un=20s=C3=A9lecteur?=
 =?UTF-8?q?=20qui=20indiquerait=20que=20le=20formulaire=20est=20=C3=A0=20d?=
 =?UTF-8?q?estination=20de=20tel=20ou=20tel=20service,=20sans=20transmettr?=
 =?UTF-8?q?e=20les=20couriels=20en=20question=20dans=20le=20html=20du=20fo?=
 =?UTF-8?q?rmulaire.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Ainsi, si un sélecteur a 3 choix (le test s'appuie sur la clé, pas le texte de la sélection) (par défaut dans les saisies : choix1|Texte),
il est possible d'écrire, si le champ est nommé `@selection_1@` :

```
@selection_1@/choix1 : un_courriel@domain.tld
@selection_1@/choix2 : autre@domain.tld, et_autre@domain.tld
@selection_1@/choix3 : secretariat@domain.tld
```

On remarque qu'il faut revenir à la ligne pour créer un nouveau test.
Le nom du champ est entre @ (comme ailleurs dans Formidable), la valeur du champ à tester est précédée d'un /
Les emails sont précédés de : et peuvent être séparés par des virgules.
Les espaces ne comptent pas.

Les tests ne sont pas exclusifs : si plusieurs conditions sont valides, les couriels sont cumulés.

+ Notice PHP en moins sur $destinataires parfois.
---
 lang/formidable_fr.php |  3 ++
 paquet.xml             |  2 +-
 traiter/email.php      | 86 +++++++++++++++++++++++++++++++++++++++---
 traiter/email.yaml     |  9 +++++
 4 files changed, 93 insertions(+), 7 deletions(-)

diff --git a/lang/formidable_fr.php b/lang/formidable_fr.php
index c086c966..20d78654 100644
--- a/lang/formidable_fr.php
+++ b/lang/formidable_fr.php
@@ -196,6 +196,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 	'traiter_email_option_destinataires_champ_form_label' => 'Destinaire présent dans un des champ des formulaires',
 	'traiter_email_option_destinataires_explication' => 'Choisissez le champ qui correspondra aux destinataires du message.',
 	'traiter_email_option_destinataires_label' => 'Destinataires',
+	'traiter_email_option_destinataires_selon_champ_explication' => 'Permet d’indiquer un ou plusieurs destinataires en fonction de la valeur d’un champ. 
+		Indiquer le champ, sa valeur, et le ou les courriels concernés (séparés par une virgule) suivant ce format, tel que : "@selection_1@/choix1 : mail@example.tld". Vous pouvez indiquer plusieurs tests : 1 par ligne.',
+	'traiter_email_option_destinataires_selon_champ_label' => 'Destinataires en fonction d’un champ',
 	'traiter_email_option_destinataires_plus_explication' => 'Une liste d’adresses séparées par des virgules.',
 	'traiter_email_option_destinataires_plus_label' => 'Destinataires supplémentaires',
 	'traiter_email_option_envoyeur_courriel_explication' => 'Choisissez le champ qui contiendra le courriel de l’envoyeur.',
diff --git a/paquet.xml b/paquet.xml
index 146f7125..72744bbb 100644
--- a/paquet.xml
+++ b/paquet.xml
@@ -1,7 +1,7 @@
 <paquet
 	prefix="formidable"
 	categorie="communication"
-	version="2.14.1"
+	version="2.15.0"
 	etat="stable"
 	compatibilite="[3.0.0;3.1.*]"
 	logo="images/formidable-64.png"
diff --git a/traiter/email.php b/traiter/email.php
index e3828adc..2fa72980 100644
--- a/traiter/email.php
+++ b/traiter/email.php
@@ -11,14 +11,19 @@ function traiter_email_dist($args, $retours) {
 	$saisies = unserialize($formulaire['saisies']);
 	$traitements = unserialize($formulaire['traitements']);
 	$champs = saisies_lister_champs($saisies);
+	$destinataires = array();
 
 	// On récupère les destinataires
 	if ($options['champ_destinataires']) {
 		$destinataires = _request($options['champ_destinataires']);
-		if (!is_array($destinataires) and intval($destinataires)) {
-			$destinataires = array($destinataires);
+		if (!is_array($destinataires)) {
+			if (intval($destinataires)) {
+				$destinataires = array($destinataires);
+			} else {
+				$destinataires = array();
+			}
 		}
-		if (is_array($destinataires)) {
+		if (count($destinataires)) {
 			// On récupère les mails des destinataires
 			$destinataires = array_map('intval', $destinataires);
 			$destinataires = sql_allfetsel(
@@ -29,9 +34,7 @@ function traiter_email_dist($args, $retours) {
 			$destinataires = array_map('reset', $destinataires);
 		}
 	}
-	if (!$destinataires) {
-		$destinataires = array();
-	}
+
 	if ($options['champ_courriel_destinataire_form']) {
 		$courriel_champ_form = _request($options['champ_courriel_destinataire_form']);
 		$destinataires[] = $courriel_champ_form;
@@ -45,6 +48,16 @@ function traiter_email_dist($args, $retours) {
 		$destinataires = array_merge($destinataires, $destinataires_plus);
 		$destinataires = array_unique($destinataires);
 	}
+	
+	// On ajoute les destinataires en fonction des choix de saisie dans le formulaire
+	// @selection_1@/choix1 : mail@domain.tld
+	// @selection_1@/choix2 : autre@domain.tld, lapin@domain.tld
+	if (!empty($options['destinataires_selon_champ'])) {
+		if ($destinataires_selon_champ = formidable_traiter_email_destinataire_selon_champ($options['destinataires_selon_champ'])) {
+			$destinataires = array_merge($destinataires, $destinataires_selon_champ);
+			$destinataires = array_unique($destinataires);
+		}
+	}
 
 	// On récupère le courriel de l'envoyeur s'il existe
 	if ($options['champ_courriel']) {
@@ -237,3 +250,64 @@ function traiter_email_dist($args, $retours) {
 	$retours['traitements']['email'] = true;
 	return $retours;
 }
+
+
+/**
+ * Retourne la liste des destinataires sélectionnés en fonction
+ * de l'option 'destinataires_selon_champ' du traitement email.
+ * 
+ * @param string $description
+ *     Description saisie dans l'option du traitement du formulaire,
+ *     qui respecte le schéma prévu, c'est à dire : 1 description par ligne,
+ *     tel que `@champ@/valeur : mail@domain.tld, mail@domain.tld, ...`
+ *     {@example : `@selection_2@/choix_1 : toto@domain.tld`}
+ * @return array 
+ *     Liste des destinataires, s'il y en a.
+**/
+function formidable_traiter_email_destinataire_selon_champ($description) {
+	$destinataires = array();
+
+	// 1 test à rechercher par ligne
+	$descriptions = explode("\n", trim($description));
+	$descriptions = array_map('trim', $descriptions);
+	$descriptions = array_filter($descriptions);
+
+	// pour chaque test, s'il est valide, ajouter les courriels indiqués
+	foreach ($descriptions as $test) {
+		// Un # est un commentaire
+		if ($test[0] == '#') {
+			continue;
+		}
+		// Le premier caractère est toujours un @
+		if ($test[0] != '@') {
+			continue;
+		}
+
+
+		list($champ, $reste) = explode('/', $test, 2);
+		$champ = substr(trim($champ), 1, -1); // enlever les @
+
+		if ($reste) {
+			list($valeur, $mails) = explode(':', $reste, 2);
+			$valeur = trim($valeur);
+			$mails = explode(',', $mails);
+			$mails = array_map('trim', $mails);
+			$mails = array_filter($mails);
+			if ($mails) {
+				// obtenir la valeur du champ saisi dans le formulaire.
+				// cela peut être un tableau.
+				$champ = _request($champ);
+				if (!is_null($champ)) {
+					$ok = is_array($champ) ? in_array($valeur, $champ) : ($champ == $valeur);
+
+					if ($ok) {
+						$destinataires = array_merge($destinataires, $mails);
+						$destinataires = array_unique($destinataires);
+					}
+				}
+			}
+		}
+	}
+
+	return $destinataires;
+}
diff --git a/traiter/email.yaml b/traiter/email.yaml
index dcfde208..ac3535d0 100644
--- a/traiter/email.yaml
+++ b/traiter/email.yaml
@@ -25,6 +25,15 @@ options:
       explication: '<:formidable:traiter_email_option_destinataires_plus_explication:>'
     verifier:
       type: 'email'
+  -
+    saisie: 'textarea'
+    options:
+      nom: 'destinataires_selon_champ'
+      label: '<:formidable:traiter_email_option_destinataires_selon_champ_label:>'
+      explication: '<:formidable:traiter_email_option_destinataires_selon_champ_explication:>'
+      placeholder: "@selection_1@/choix1 : mail1@example.tld, mail2@example.tld"
+      conteneur_class: 'pleine_largeur'
+      rows: 4
   -
     saisie: 'champ'
     options:
-- 
GitLab