diff --git a/lang/formidable_fr.php b/lang/formidable_fr.php index c086c966deab9f148a185556123901005bddd252..20d7865494dc2de72e1116cd0dd54a9cb03a60f4 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 146f7125f1ed785b7c5c18f35f337da525b9b3bb..72744bbbcd9df1a94df5c3d09cba3c3abb5b43f8 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 e3828adc077a97e9d983e606d455b42b03db9b6d..2fa7298001ea0934667e4c0b6f70f68aa7424c91 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 dcfde20892ecb76c66907e6e30ea765e8d5777d5..ac3535d03bcc7e9922d669713b279332961c5970 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: