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