Skip to content
Extraits de code Groupes Projets
Valider 7b89efd2 rédigé par marcimat@rezo.net's avatar marcimat@rezo.net
Parcourir les fichiers

Ajout d'une option dans le traitement par email : elle permet d'indiquer un ou...

Ajout d'une option dans le traitement par email : elle permet d'indiquer un ou plusieurs emails en fonction de la valeur qui a été 
saisie dans un champ du formulaire. Particulièrement utilise pour un sélecteur qui indiquerait que le formulaire est à destination
de tel ou tel service, sans transmettre les couriels en question dans le html du formulaire.

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.
parent ceed1ffa
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -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.',
......
<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"
......
......@@ -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;
}
......@@ -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:
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter