formulaire spécial traitement spécial

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, je souhaiterai faire un formulaire avec mes propres champs pour ensuite envoyer des mails , crée un pdf telechargeable et pourquoi pas ecrire dans la base de donnée
je sais pas si un module capable de faire ca existe deja, mais sinon que me conseiller vous ?
merci

Merci du conseil jubjub mais j'ai fini par commencer a bricoler un petit module et je dois dire que je prefere (ca me permet de connaitre un peu mieux )
par contre je bloque la, enfaite j'ai crée le formulaire et maintenant j'ai besoin de recuperer les données pour les traiter ... une idée ?

vraiment dommage qu'il n'ait pas plus de ressource en francais ...

j'utilise la version 5 de drupal
en effet la page que tu donne est pas mal Zigazou mais j'ai toujours un petit probleme avec la fonction _submit j'ai beau essayé d'exploité le tableau form_values ou retourner un quelquecon message , mais rien a faire ca me renvoi sur la page de mon formulaire a chaque fois
en plus si j'ai bien compris ce n'est pas la seul facon de recuperer les données d'un formulaire , peut ton recuperer le tableau $form avec un $_POST['form'] ou quelque choses du genre ?
merci encore ^^

Peut ton recuperer le tableau $form avec un $_POST['form']
Techniquement c'est possible, par contre c'est complètement déconseillé !

Concernant ton problème de récupération de valeurs, si tu pouvais poster le code qui ne marche pas, je pense que le problème serait très rapidement résolu. Il faut que tu donnes :

  • la génération du formulaire (en incluant l'appel à drupal_get_form),
  • la fonction de validation (_validate, si tu as),
  • la fonction de traitement (_submit).

Bonjour
voici donc le code :

function contenu() {
  $content = drupal_get_form('a_form', $form);
  return $content;
}

function a_form(&$node) {
$form['general']= array(
'#type' => 'textarea',
  '#title' => t('Short description of ticket'),
   '#cols' => 60,
    '#rows' => 1,
'#description' => t(''),
    );

    $form['general'] = array(
    '#type' => 'select',
    '#title' => t('Ticket type'),
   '#description' => t(''),
    );

$form['submit'] = array('#type' => 'submit','#value' => t('Save'));

  return $form;
}

function a_submit($form_id, $form_values) {
  return drupal_set_message("vous ete la ?");
/
La dedans , j'ai essayé une requete sql, un t('$form_value['field']); et plein de truc parfelu mais rien ne marche  ...
/
}

voila j'ai pas tout balancé juste le necessaire

dis moi si jme trompe mais d'après ce que tu m'a dis ce que je fais la c'est deconseillé ?

function a_menu($may_cache) {
  $items = array();

  if ($may_cache) {
    $items[] = array('path' => 'a', 'title' => t('module a'),
      'callback' => 'contenu',
      'access' => user_access('access a'));

    $items[] = array('path' => 'a/edit', 'title' => t('module a'),
      'callback' => 'contenu2',
      'access' => user_access('access a'));

    $items[] = array('path' => 'a/view','type' => MENU_CALLBACK, 'title' => t('view'),
      'callback' => 'contenu3',
      'access' => user_access('access a'));
  }

  return $items;
}

function contenu2() {
  $content = "<form method=post action='/drupal5/?q=a/view'> <input name='aa' type=text size=20><input type=submit value='envoi ltest'> </form>";
  return $content;
}

function contenu3() {
    $content = $_POST['aa'];

  return $content;
}

enfaite j'ecris un petit formulaire sans passer par les fonctions drupal, ensuite je le recupere dans une autre page, toujours sans passer par les fonctions drupal ... a priori ca a l'air de marcher

dis moi si jme trompe mais d'après ce que tu m'a dis ce que je fais la c'est deconseillé ?
Totalement !
Le gestionnaire de formulaire prend notamment en compte la configuration de Drupal. Quand tu saisis /?q=a/view, ton formulaire fonctionnera uniquement si l'URL rewriting n'est pas activé. Le gestionnaire positionnera ce champ comme il convient. Ceci n'est qu'un exemple, il existe plein d'autres paramètres gérés automatiquement.
Il est également protégé contre certaines attaques.

Concernant l'exemple précédent, il est clair que cela ne peut pas fonctionner.

Prenons l'exemple du module pathmenu (que je connais bien, et pour cause). Il utilise un formulaire ultra-simple : il y a un textarea et un bouton submit...

Dans le hook_menu, j'indique la fonction à appeler pour définir le formulaire.

<?php
function pathmenu_menu($may_cache) {
 
$items = array();

  if(
$may_cache) {
   
$items[] = array(
     
'path'    =>'admin/pathmenu',
     
'title'   =>t('path menus'),
     
'callback'=>'pathmenu_admin',
     
'access'  =>user_access('administer pathmenu')
    );
  }

  return
$items;
}
?>

La callback est pathmenu_admin. C'est cette fonction que Drupal appellera pour générer la page (le formulaire dans notre cas).

<?php
function pathmenu_admin() {
 
// Initializes the form structure
 
$form=array();

 
// Adds a textarea which will hold the rules source code
 
$form['rules']=array(
   
'#type'         => 'textarea',
   
'#title'        => t('Rules'),
   
'#default_value'=> variable_get('pathmenu_rules', ''),
   
'#rows'         => 20,
   
'#description'  => t('List of rules.'),
  );

 
// Adds the submit button
 
$form['submit']=array(
   
'#type' =>'submit',
   
'#value'=>t('Save')
  );

 
// Returns the form
 
return drupal_get_form('pathmenu_form',$form);
}
?>

La fonction pathmenu_admin construit le formulaire ($form=...) et demande à Drupal de générer le code HTML qui va bien (drupal_get_form) en indiquant que le nom du formulaire est pathmenu_form. Très important !

<?php
function pathmenu_form_validate($form_id,$form_values) {
 
// Retrieves the rules source code
 
$rules        =$form_values['rules'];

 
// Tries to analyze the rules
 
$rules_analyze=_pathmenu_analyze_rules($rules);
  if(
$rules_analyze===FALSE) {
   
// Rules could not be analyzed
   
form_set_error('rules',t('Syntax error in rules'));
  }

 
// Tries to compile the rules
 
$rules_compile=_pathmenu_compile_rules($rules_analyze);

  if(!
$rules_compile) {
   
// Rules could not be compiled
   
form_set_error('rules',t('Unable to compile rules'));
  }
}
?>

La fonction pathmenu_form_validate est appelée automatiquement par le gestionnaire de formulaire de Drupal pour valider le contenu des champs du formulaire. Drupal sait quelle fonction appeler car on lui a dit que le formulaire se nommait pathmenu_form. Donc il va appeler pathmenu_form_validate (il rajoute simplement _validate à la fin du nom).

L'exemple t'indique même comment signaler des erreurs à ton utilisateur.

<?php
function pathmenu_form_submit($form_id,$form_values) {
 
variable_set('pathmenu_rules',$form_values['rules']);
 
variable_set('pathmenu_phpcode',_pathmenu_compile_rules(_pathmenu_analyze_rules($form_values['rules'])));
 
drupal_set_message(t('Rules saved.'));
}
?>

La fonction pathmenu_form_submit va s'occuper du traitement des données récupérées sur le formulaire. Dans cette fonction, toutes les valeurs fournies par le formulaire sont valides puisqu'elles auront été validées préalablement par pathmenu_form_validate, ce qui fait que la fonction de traitement est fréquemment plus courte que la fonction de validation.

Pour ajouter à la dernière réponse :
La valeur de retour de la fonction _submit définit la page à afficher après traitement du formulaire.
Cette fonction redirigerait l'utilisateur vers le node 2 après traitement.

<?php
function pathmenu_form_submit($form_id,$form_values) {
 
variable_set('pathmenu_rules',$form_values['rules']);
 
variable_set('pathmenu_phpcode',_pathmenu_compile_rules(_pathmenu_analyze_rules($form_values['rules'])));
 
drupal_set_message(t('Rules saved.'));
}
  return
'node/2';
?>

oké je comprend mieux la gestion des formulaire par drupal , et ce que j'ai fais prend enfin un sens il me reste encore pas mal de boulot a faire (notamment du php brute ) et je pense que je suis pas au bout de mes peines , alors jreviendrais surement poster ici mes petits probleme en esperant que vous puissiez m'aider :)
en tout cas ca fait plaisir de trouver un forum francais un petit peu vivant

vous ne savez pas si rien n'est en cours pour la traduction de api.drupal.org en francais ?

encore merci pour tout :)

[edit]
une petite question au passage, pour la gestion de mail je suppose que drupal utilise la fonction php mail() ? si c'est le cas il se debrouille comment sur les servers ou cette fonction est desactivé ?

En effet il utilise la fonction mail, a priori y a des modules pour fournir des mails externes genre SMTP authentication mais bon ca oblige a avoir un mail exterieur et ca me semble pas facile...
Sinon jette un oeil ds la categorie Mail

Sinon voir si y a pas une autre fonction mail que ton hebergeur autorise et en dernier recours, changer d'hebergeur...

PS: evite de melanger les questions ds les fils de discussion ca limite les interventions d'autres personnes pas forcement interessees par le 1er sujet et limite la possibilite de retrouver ce message par la suite.

Petite remarque sur le code de Zigazou : Sur Drupal 5, ce n'est plus tout à fait de cette façon qu'on génère les formulaires.

Il faut en fait définir 2 fonctions, la première qui déclare et renvoie le array $form qui contient tous les champs :

<?php
function mon_form() {
 
$form['champ1'] = array(...);
 
$form['champ2'] = array(...);
  return
$form;
}
?>

La seconde, qui génère effectivement le formulaire :

<?php
function ma_page() {
  return
drupal_get_form('mon_form');
}
?>

L'id du formulaire est le nom de la fonction de déclaration (mon_form). Pour "économiser" une fonction, on peut directement déclarer l'appel à drupal_get_form() dans le menu :

<?php
function toto_menu($may_cache) {
 
$items = array();
 
  if(
$may_cache) {
   
$items[] = array(
     
'path'    => 'ma_page',
     
'title'   => t('my page'),
     
'callback'=> 'drupal_get_form',
     
'callback arguments'=> array('mon_form'),
     
'type'    => MENU_CALLBACK,
     
'access'  => TRUE,
    );
  }
 
  return
$items;
}
?>

Le fait de dissocier la déclaration de la génération du formulaire permet au même formulaire d'être utilisé (sans forcément être immédiatement généré) par plusieurs fonctions.

Le code de Zigazou correspond à la version 4.7 de Drupal, et je ne crois pas que c'est la version utilisée par azz (sous Drupal 5, drupal_get_form() n'a plus qu'un argument obligatoire au lieu de 2 sous Drupal 4.7).