Webform : formulaire, choix destinataire

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

j'utilise ce module avec son cousin webform block.
J'ai toutefois des besoins spéciaux :

  • réaliser un formulaire où l'on peut choisir le destinataire
  • faire un lien vers ce formulaire qui rempli automatiquement le destinataire en fonction de la provenance du lien (ex: lien placé sur page Lycée A renvoi vers formulaire ou destinataire Lycée A est auto complété )

merci pour vos infos

Forum : 
Version de Drupal : 

il me semble que si tu crées un champ email où l'utilisateur saisira l'adresse email du destinataire tu peux le récupérer comme destinataire du mail.

Pour le remplir automatiquement, il faudra que tu fasses un module où tu pourras par exemple en fonction d'une variable passé dans l'url.

J'avais pas mal galéré, pour ce genre de truc, mais j'ai réussi.

Bon voici ce que j'avais essayé de faire dans mon cas, un formulaire pour postuler à une offre d'emploi.

Dans ma page offre, j'ai mis un formulaire en-dessous grâce à webform block

<?php
// $Id: form_postuler.module,v 1.0 2009/10/19 14:18:05 selinav Exp $
//Hook alter form pour dire à drupal d'altérer le formulaire
function form_postuler_form_alter(&$form, &$form_state, $form_id) {
   
$nid=arg(1);
  
//Je dis si mon form_id correspond à celui du form que je veux altérer (webform_client_form_211) et que mon nid est différent de l'id de mon node formulaire (211 dans mon cas)(car sinon qd on revoie les soumissions le titre est altéré par la page en cours et de l'id du formulaire lié à webform block)
   
if($form_id=='webform_client_form_211' && $nid!=211){
       
      
//recup email cck      
      
$node = node_load(array('nid' => $nid));
     
$mon_champ=$node->field_job_email_contact[0]['email'];
       
//récup titre de mon noeud en cours pour le passer ensuite ds un champ
               
$titre=$node->title;
    
       if(!empty(
$mon_champ)){
           
//affectation valeur mail cck à champ caché créé via webform
                      
$form['submitted']['email_offre']['#default_value']=$mon_champ;
      }
                
//affectation de mon titre à un champ texte désactivé pour récupérer le titre de l'offre d emploi
     
$form['submitted']['titre_offre']['#default_value']=$titre;
  }
 
  
}
?>

quelques questions pratiques :

  • ton module est disponible sur drupal.org ?
  • sinon comment procéder pour l'utiliser ?(création de dossier,activation dans module..)

mes données propres :

  • le formulaire en question formulaire_contact
  • lien sur page lycée (type de contenu : page_lycee) qui renvoi vers la page du formulaire (page contact)
  • dans le formulaire ,création des adresses mail en fonction de l'url(ex: lycee-rostand = mail@rostand.fr)

le module n'est pas disponible sur drupal.org car il s'agit d'un besoin spécifique, tu n'auras pas d'interface d'administration.

Je te laisse faire une recherche en ce qui concerne la création de son premier module.
(fichier .info, .module, nom du module...)

Il faudra donc que tu ajoutes le code ci-dessus dans le fichier .module.

Puis que tu actives le module

Pour ton cas tu peux mettre un bout de php pour récupérer le bon mail.
Au lieu de récupérer le champ CCK comme moi, tu mets un truc du genre

<?php
$origine
=$_GET['origine']; /* où tu auras passé en variable la page qui appelle le formulaire, par exemple si tu viens de lycée, ton lien vers le form de contact de la page lycée sera contact?origine=lycee, pour une page ecole ça pourrait être contact?origine=ecole ... */

switch ($origine) {
  case
'lycee':
 
$email='mail@lycee.fr';
  break;

  case
'ecole':
 
$email='mail@ecole.fr';
  break;
}

$form['submitted']['email_offre']['#default_value']=$email;

//...
?>

bon j'ai créé le module,drupal le voit correctement, ensuite niveau code est ce que cela pourrais marcher ? en récupérant l'url,car je ne sais pas passer une variable comme tu l'indique.

<?php
$origine
=$_GET['$url']; /* où tu auras passé en variable la page qui appelle le formulaire, par exemple si tu viens de lycée, ton lien vers le form de contact de la page lycée sera contact?origine=lycee, pour une page ecole ça pourrait être contact?origine=ecole ... */

switch ($url) {
  case
'lycee-rostand':
 
$email='mail@lycee.fr;
  break;

  case 'lycee-grawitz':
  $email='
mail@ecole.fr;
  break;
}

$form['submitted']['email_offre']['#default_value']=$email;

//...
?>

voila le raisonnement à traduire ensuite en code:

1- récupérer le Nid (car les pages sont statiques)ou passer par l'url mais moins évident à cause de pathauto...si le nom de la page change

2- si la page à le Nid 25 alors envoyer le mail à l'adresse lycee-XX@mail.com et ainsi de suite

Sur la page lycée tu vas avoir un lien vers la page contact.
Dans ton menu, au lieu de mettre 'contact' ou 'node/10' tu vas mettre 'contact?origine=lycee' ou 'node/10?origine=lycee'

Pour la page école tu fais pareil sauf que tu mets 'contact?origine=ecole'.

C'est ce que tu vas récupérer dans
$origine=$_GET['origine'];

Et après tu fais un switch où tu détermines le mail du destinataire en fonction de l'origine de la page.

j'avais créé un champ caché de type email qui s'appelle email offre.
Et mis ce champ là comme destinataire du form.

Il faut donc que tu crées un champ caché par exemple email destinataire qui aura comme nom interne email_destinataire. Et qui sera le destinataire du mail.

Tu remplace donc email_offre par email_destinataire.

Avec firebug tu verras apparaître ton champ caché et sa valeur.

ok j'ai fais un champ "hidden" dans webform et je lui ai donnée comme nom machine "email_destinataire".
au niveau du formulaire ya que ca a faire ?

sinon voila mon code fini :

<?php
$origine
=$_GET['origine']; /* où tu auras passé en variable la page qui appelle le formulaire, par exemple si tu viens de lycée, ton lien vers le form de contact de la page lycée sera contact?origine=lycee, pour une page ecole ça pourrait être contact?origine=ecole ... */

switch ($origine) {
  case
'lycee-rostand':
 
$email='mail@lycee.fr;
  break;

  case 'le-rocher':
  $email='
lerocher@lycee-le-rocher.fr;
  break;
}

$form['submitted']['email_destinataire']['#default_value']=$email;

//...
?>

il manque rien ? car l'éditeur me colore pas tout pareil je trouve,alors j'ai des doutes vu que je ne connais pas trop php

bien j'ai corrigé mon code car il manqué des " et des ' , ensuite ca a l'air de marcher, du moins au niveau du code proposé par le formulaire et le champ hidden email_destinataire qui me donne cela en html :

<input type="hidden" value="form-ebda96fa4fa81975131af3b4769fc2b6" id="form-ebda96fa4fa81975131af3b4769fc2b6" name="form_build_id">

je présume que drupal chiffre l'email pour ne pas l'avoir en clair ?
vais essayer d'envoyer le mail pour voir

EDIT: envoi de mail ne marche pas...j'ai testé avec un mail "statique" , la fonction mail php de wampserver marche bien,le mail arive nikel..mais le systeme de switch ne renseigne pas le champ caché semble t il..

bien mon serveur wamp envoi bien les formulaire classiques avec adresse mail "statique" mais le formulaire avec mon module custom ne marche pas, car il ne semble pas recupérer la variable origine...voici le code tel que je l'utilise...

<?php
$origine
=$_GET['origine']; /* où tu auras passé en variable la page qui appelle le formulaire, par exemple si tu viens de lycée, ton lien vers le form de contact de la page lycée sera contact?origine=lycee, pour une page ecole ça pourrait être contact?origine=ecole ... */

switch ($origine) {
  case
'lycee-grawitz':
 
$email='webmaster@provence-formation.com';
  break;

  case 'lycee-le-rocher':
 
$email='frederic.serbeto@provence-formation.com';
  break;
}

$form['submitted']['email_destinataire']['#default_value']=$email;

//...
?>

comment savoir si il récupére bien la variable ?
php n'est pas mon fort, et son debugage encore moins..

dans mon formulaire, j'ai un champ destinataire qui est de type hidden, avec comme
Field Key : email_destinataire. donc je comprends pas où est le souci à ce niveau la...

Pour les paramètres de ce champ :
il est obligatoire et doit recevoir un email comme valeur.

au niveau du html :

<input type="hidden" value="" id="edit-submitted-email-destinataire" name="submitted[email_destinataire]">

dans l'url j'ai : http://localhost/drupalPF/contact?origine=lycee-grawitz

donc le champ ne se rempli pas...

j'utilise ce code php:

<?php
$origine
=$_GET['origine'];
/* où tu auras passé en variable la page qui appelle le formulaire, par exemple si tu viens de lycée, ton lien vers le form de contact de la page lycée sera contact?origine=lycee, pour une page ecole ça pourrait être contact?origine=ecole ... */

switch ($origine) {
  case
'lycee-grawitz':
 
$email='xxxxxxxx@mon-email.com';
  break;

  case
'lycee-le-rocher':
 
$email='xxxx@autre-email.com';
  break;
}

$form['submitted']['email_destinataire']['#default_value']=$email;

//...
?>

pour voir si ta variable est bien récupéré colle le code suivant en-dessous de

<?php
$origine
=$_GET['origine'];

drupal_set_message(t('origine : @origine.', array('@origine' => $origine)));
?>

ça doit t'afficher dans la barre de message de rupal :
origine : lycee-grawitz

bien je débugge doucement avec des echo, et j'ai pu constater que la variable arrive bien jusuq'a la page du formulaire puisque :

<?php
$origine
=$_GET['origine'];
....
echo
'Valeur transmise :',$origine,'<br/>';
....
$form['submitted']['email_destinataire']['#default_value']=$email;
echo
'Valeur email :',$email,'<br/>';
echo
'Valeur form-champ destinataire :',$form['email_destinataire'],'<br/>';
//...
?>

me donne :

Valeur transmise :lycee-grawitz

Valeur email :xxxxxxx@mon-email.com

Valeur form-champ destinataire :

ce qui indique clairement que form n'utilise pas la variable pour renseigner le champ hidden..

décidément une sacré synchro de post...
bref voici ce que me retourne le code avec des points :

Valeur form-champ submitted :Array

je pensais aussi que je n'utilise pas de fonction qui dit a drupal d'altérer le formulaire, c'est peut etre la cause du problème non ?

bon voila un début mais ca ne marche pas, ou alors faut reactiver le module, en tout cas je ne vois plus mes echo;

<?php
function form_lycee_form_alter($form, $origine) {
$origine=$_GET['origine'];
/* où tu auras passé en variable la page qui appelle le formulaire, par exemple si tu viens de lycée, ton lien vers le form de contact de la page lycée sera contact?origine=lycee, pour une page ecole ça pourrait être contact?origine=ecole ... */

switch ($origine) {
  case
'lycee-grawitz':
 
$email='xxx@xxx.com';
  break;

  case
'lycee-le-rocher':
 
$email='xxx@xxx.com';
  break;
}

$form['submitted']['email_destinataire']['#default_value']=$email;

//debugage du script//
echo 'Valeur transmise pour origine :'.$origine.'<br/>';
echo
'Valeur email :'.$email.'<br/>';
echo
'Valeur form-champ destinataire :'.$form['email_destinataire'].'<br/>';
echo
'Valeur form-champ submitted :'.$form['submitted'].'<br/>';

}
?>

je sais pas trop quoi mettre en parametres de la fonction...idem pour les & que j'ai enlevé..

je suis planté, j'ai rajouté le test sur l'id du formulaire mais je n'ai plus mes echo qui s'affichent..alors je comprends plus...un probleme dans le nom de la fonction ? un caractère absent ou en trop ?

<?php
function form_lycee_form_alter(&$form, &$form_state, $form_id) {

   
$nid=arg(1);
  
//Je dis si mon form_id correspond à celui du form que je veux altérer (webform_client_form_211) et que mon nid est différent de l'id de mon node formulaire (211 dans mon cas)(car sinon qd on revoie les soumissions le titre est altéré par la page en cours et de l'id du formulaire lié à webform block)
   
if($form_id=='webform_client_form_20' && $nid!=20){
  
$origine=$_GET['origine'];
/* où tu auras passé en variable la page qui appelle le formulaire, par exemple si tu viens de lycée, ton lien vers le form de contact de la page lycée sera contact?origine=lycee, pour une page ecole ça pourrait être contact?origine=ecole ... */

switch ($origine) {
  case
'lycee-grawitz':
 
$email='xx@xxxx.com';
  break;

  case
'lycee-le-rocher':
 
$email='xxx@xx-xx.com';
  break;
}

$form['submitted']['email_destinataire']['#default_value']=$email;

//debugage du script//
echo 'Valeur transmise pour origine :'.$origine.'<br/>';
echo
'Valeur email :'.$email.'<br/>';
echo
'Valeur form-champ destinataire :'.$form['email_destinataire'].'<br/>';
echo
'Valeur form-champ submitted :'.$form['submitted'].'<br/>';
}
}
?>

désespérément vide...
je posterai les résultats de debug via drupalpour les echo je pensais que ca marchais comme les trace avec actionscript..

EDIT : rien ne s'affiche, j'ai ajouté la fonction de cette page : http://planete.drupalfr.org/node/116
mais cela ne change rien donc la variable ne semble pas être récupéré...ou alors le debugging ne marche pas..

hors de la fonction ca marche , mais origine est vide, en fait tout ce qui est dans la fonction est ignoré et ne marche pas...l'intitulé et les variables sont elles les bonnes ?
EDIT: trouvé sur le forum anglais : your function needs to be named modulename_form_alter() donc j'ai changé et j'ai le message, mais origine reste vide...

<?php
// $Id: formDispatch.module,v 1.0 2010 March - Aiphes Exp $
//Hook alter form pour dire à drupal d'altérer le formulaire
function formDispatch_form_alter(&$form, &$form_state, $form_id) {
   
$nid=arg(1);
  
//determination de l'ID du formulaire afin de l'altérer
   
if($form_id=='webform_client_form_20' && $nid!=20){
  
//récupération de la variable qui défini l'origine du visiteur et determine le destinataire du message.
      
$origine=$_GET['origine'];
     
  
//liste des email destintaire possible en fonction de l'origine du destinataire
switch ($origine) {
  case
'lycee-grawitz':
 
$email='webmastergrawitz@mail.com';
 
$sujet_mail='Message pour le lycée C.Grawitz';
  break;

  case
'lycee-le-rocher':
 
$email='webmasterlerocher@mail.com';
  break;
}
//affectation de la valeur de $email comme email destinataire du message, au champ caché email_destinataire
$form['submitted']['email_destinataire']['#default_value']=$email;
//affectation de la valeur de $sujet_mail comme sujet du message
$form['submitted']['sujet']['#default_value']=$sujet_mail;


  }
 
drupal_set_message(t('origine : @origine.', array('@origine' => $origine)));
 
}
?>

Met le drupal_set_message dans ton test sur le form id

<?php
// $Id: formDispatch.module,v 1.0 2010 March - Aiphes Exp $
//Hook alter form pour dire à drupal d'altérer le formulaire
function formDispatch_form_alter(&$form, &$form_state, $form_id) {
   
$nid=arg(1);
  
//determination de l'ID du formulaire afin de l'altérer
   
if($form_id=='webform_client_form_20' && $nid!=20){
  
//récupération de la variable qui défini l'origine du visiteur et determine le destinataire du message.
      
$origine=$_GET['origine'];

drupal_set_message(t('je suis ds hook'));//pour voir si ton test est bon ou pas $form_id=='webform_client_form_20' && $nid!=20
drupal_set_message(t('origine : @origine.', array('@origine' => $origine)));
    
  
//liste des email destintaire possible en fonction de l'origine du destinataire
switch ($origine) {
  case
'lycee-grawitz':
 
$email='webmastergrawitz@mail.com';
 
$sujet_mail='Message pour le lycée C.Grawitz';
  break;

  case
'lycee-le-rocher':
 
$email='webmasterlerocher@mail.com';
  break;
}
//affectation de la valeur de $email comme email destinataire du message, au champ caché email_destinataire
$form['submitted']['email_destinataire']['#default_value']=$email;
//affectation de la valeur de $sujet_mail comme sujet du message
$form['submitted']['sujet']['#default_value']=$sujet_mail;


  }
 
 
}
?>

je suis sur qu'il y a un souci avec le nom de la fonction ou ses variables , car rien ne sort de cette fonction..pourtant dans le code html ya:

<form enctype="multipart/form-data" class="webform-client-form" id="webform-client-form-20" method="post" accept-charset="UTF-8" action="/drupalPF/contact">

ET
  <div id="node-20" class="node ">
 

<input type="hidden" value="webform_client_form_20" id="edit-webform-client-form-20" name="form_id">

cela confirme que le form id est le bon...

ata on me parle dans l'oreillette...oooo yes le problème vient de trouver sa solution...
une erreur comme il en arrive souvent, un malheureux oubli de signe = dans le if au niveau de

<?php
$form_id
=='webform_client_form_20' && $nid!==20
?>

seul le sujet du mail ne se rempli pas pour l'instant..mais les messages fonctionnent et le champ caché du mail se rempli bien...

<input type="hidden" value="webmastergrawitz@mail.com" id="edit-submitted-email-destinataire" name="submitted[email_destinataire]">

punaise que ce fut dur...mais j'ai appris plein de truc grace a toi, MERCI selinav

par contre je ne comprends pas pourquoi il ne recupere pas le sujet que je lui donne, peut etre que ce n'est pas submitted dans le type de champ du form,je vais creuser cela..ca peut toujours servir...

<?php
....
switch (
$origine) {
  case
'lycee-grawitz':
 
$email='webmastergrawitz@mail.com';
 
$sujet_mail='Message pour le lycée C.Grawitz';
  break;
....
//affectation de la valeur de $sujet_mail comme sujet du message
$form['submitted']['sujet']['#default_value']=$sujet_mail;
drupal_set_message(t("contenu de sujet mail : @sujet_mail.", array("@sujet_mail" => $sujet_mail)));

  }
 
 
}
?>

ton drupal_set_message t'affiche-t-il le sujet que tu as renseigné?
Si oui, c'est la ligne suivante qui est faux. Le nom du champs n'est pas forcément sujet.

$form['submitted']['sujet']['#default_value']=$sujet_mail;

Pour connaître le nom de chacun des champs qui sont passés dans ton formulaire fait

<?php
print "<pre>";
print_r ($form);
print
"</pre>";
?>

avant ton drupal_set_message

voila l'extrait du resultat:

[submitted] => Array
        (
           ...

            [sujet] => Array
                (
                    [#type] => textfield
                    [#title] => Sujet
                    [#default_value] =>
                    [#required] => 0
                    [#weight] => 3.003
                    [#field_prefix] =>
                    [#field_suffix] =>
                    [#description] =>
                    [#attributes] => Array
                        (
                        )

                    [#prefix] =>

                    [#suffix] =>

                )
...
[3] => Array
                                        (
                                            [nid] => 20
                                            [cid] => 3
                                            [form_key] => sujet
                                            [name] => Sujet
                                            [type] => textfield
                                            [value] =>
                                            [extra] => Array

ya aussi un probleme, car je ne recois pas le contenu du champ message dans l'email, mais c'est un souci avec webform je pense..

Dans ton cas [#default_value] => est vide c'est pour cela que tu as rien.
Essaie de mettre une valeur par défaut dans webform, juste pour voir si ça passe

bof ca donne rien , j'ai mis une valeur par defaut dans les reglages du formulaire

E-mail subject :
Component : Sujet

et dans le module

<?php
default:
 
$email='...';
 
$sujet_mail='Message pour :';
  break;
?>

du coup en sortie j'ai :
•contenu de sujet mail : Message pour :. sur la page contact sans ?origine, le champ se rempli bien avec ma valeur :

<input name="submitted[sujet]" class="form-text" id="edit-submitted-sujet" type="text" size="60" maxLength="128" value="Message pour :"/>

par contre sur le page ?origine=lycee-grawitz, ca ne renvoi rien et le champ reste vide...

EDIT: probleme d'accent car sans accent sa passe bien..mes fichiers sont en ANSI..faut que je les passe en UTF8 je pense, vais voir comment on fait avec netbeans