Plusieurs formulaires sur une seule page?

8

Est-il possible de mettre plusieurs formulaires sur une seule page?

J'essaie de créer une page d'offre de coupons. Je voulais avoir deux formulaires pour deux offres différentes de chaque côté d'une page. Chaque formulaire a un champ de texte pour le code promo et son propre bouton d'envoi. Le premier formulaire fonctionne bien; cependant, les valeurs cachées du second formulaire semblent être remplacées par celles du premier formulaire.

J'utilise hook_alter pour modifier le second formulaire pour le rendre différent, mais il a toujours le même form_id que le premier. Est-ce la cause de mes problèmes ou dois-je chercher / penser ailleurs?

Les deux formulaires ont les mêmes valeurs pour "form_id" et "form_token", mais des valeurs différentes pour "form_build_id".

user1359
la source

Réponses:

8

Si vous souhaitez ajouter plusieurs fois le même formulaire, vous devez implémenter hook_forms () . Voir node_forms () pour un exemple.

Cela permet d'utiliser différents form_id, qui pointent tous vers la même fonction de création de formulaire. Par exemple, vous pouvez utiliser yourmodule_some_form_$ipuis utiliser hook_forms () pour les pointer vers yourmodule_some_form.

Voir http://www.mohitsharma.net/content/how-show-same-form-multiple-time-page pour un exemple

Berdir
la source
1
L'OP parle d'utiliser deux formulaires sur la même page; l'utilisation hook_forms()ne résout pas automatiquement cela. Si vous utilisez simplement le même formulaire deux fois sur la même page, vous avez toujours le problème d'avoir le même champ de formulaire répété deux fois.
kiamlaluno
Je ne sais pas si je te suis. Vous n'êtes pas sûr de 6.x en ce moment, mais au moins Drupal 7 s'assure qu'il n'y a pas d'ID en double, donc il ne devrait pas y avoir de problème lorsque vous avez plusieurs fois les mêmes champs de formulaire sur la même page?
Berdir
hook_forms()n'est pas utilisé pour avoir deux formulaires avec les mêmes champs de formulaire dans la même page; il est utilisé pour permettre d'avoir un seul générateur de formulaire pour différents ID de formulaire.
kiamlaluno
Vous pouvez utiliser hook_forms () exactement pour cela. Voir par exemple mohitsharma.net/content/how-show-same-form-multiple-time-page
Berdir
L'exemple donné dans cet article n'est pas pratique; le formulaire n'a même pas de bouton de soumission, et pour un tel formulaire, je ne l'utiliserais pas hook_forms(). L'OP modifie alors l'une des deux formes.
kiamlaluno
-1

Vous pouvez avoir plusieurs formulaires sur la même page; voir ce que fait node_admin_content () , qui utilise le code suivant:

function node_admin_content($form_state) {
  if (isset($form_state['values']['operation']) && $form_state['values']['operation'] == 'delete') {
    return node_multiple_delete_confirm($form_state, array_filter($form_state['values']['nodes']));
  }
  $form = node_filter_form();

  $form['#theme'] = 'node_filter_form';
  $form['admin']  = node_admin_nodes();

  return $form;
}

En laissant de côté la première instruction IF, la fonction ajoute deux formulaires différents qui ont leurs propres gestionnaires de soumission.

Le problème vient des champs de formulaire qui sont répétés deux fois. La structure de tableau suivante créerait des problèmes lorsque le tableau de formulaires est aplati, car il y aurait deux champs "coupon".

$form['first form']['coupon'] = array(
  '#type' => 'textfield', 
  '#title' => t('Coupon'), 
  '#default_value' => variable_get('mymodule_coupon'), 
  '#size' => 60, 
  '#maxlength' => 128, 
  '#required' => TRUE,
);

$form['second form']['coupon'] = array(
  '#type' => 'textfield', 
  '#title' => t('Coupon'), 
  '#default_value' => variable_get('mymodule_coupon'), 
  '#size' => 60, 
  '#maxlength' => 128, 
  '#required' => TRUE,
);

Sans voir le code utilisé, je pourrais penser que l'utilisation d'un rappel de page qui appelle drupal_get_form () est probablement le moyen le plus simple, dans votre cas.

$output = drupal_get_form("form identifier") . drupal_get_form("form identifier");

J'ai essayé d'utiliser le code suivant dans Drupal 6.

module_load_include('inc', 'path', 'path.admin');
$output = drupal_get_form('path_admin_form') . drupal_get_form('path_admin_form');

Le contenu de $outputpour les deux formulaires était le suivant (j'ai supprimé la sortie pour les champs de formulaire unique).

<form action="/dr61/devel/php"  accept-charset="UTF-8" method="post" id="path-admin-form-1">
<div><div class="form-item" id="edit-language-1-wrapper">

<input type="submit" name="op" id="edit-submit" value="Create new alias"  class="form-submit" />
<input type="hidden" name="form_build_id" id="form-4eb9304baac34f292901ca23d925ff03" value="form-4eb9304baac34f292901ca23d925ff03"  />
<input type="hidden" name="form_token" id="edit-path-admin-form-form-token" value="cd429a06b84e381eb82ef04cd5033eeb"  />
<input type="hidden" name="form_id" id="edit-path-admin-form" value="path_admin_form"  />
<form action="/dr61/devel/php"  accept-charset="UTF-8" method="post" id="path-admin-form-1">
<div><div class="form-item" id="edit-language-1-wrapper">

<input type="submit" name="op" id="edit-submit-1" value="Create new alias"  class="form-submit" />
<input type="hidden" name="form_build_id" id="form-fb363c7ca6d88f71d98e86f8a69b0379" value="form-fb363c7ca6d88f71d98e86f8a69b0379"  />
<input type="hidden" name="form_token" id="edit-path-admin-form-form-token-1" value="cd429a06b84e381eb82ef04cd5033eeb"  />
<input type="hidden" name="form_id" id="edit-path-admin-form-1" value="path_admin_form"  />

Il n'y a pas de conflit entre l'ID HTML affecté au même champ de formulaire et la valeur de "form_build_id" (ou "form_token") est différente dans les deux formulaires.

L'implémentation de hook_form_alter()utilisé pour modifier le formulaire devrait être en mesure de comprendre dans quel cas modifier le formulaire, ou les deux formulaires afficheraient les mêmes champs.

Du point de vue de l'expérience utilisateur, je ne suis pas sûr que l'affichage de deux formulaires différents avec leurs propres boutons de soumission soit la meilleure façon de faire ce que vous essayez d'atteindre.
Je pense qu'il serait préférable d'utiliser un formulaire qui montre différents champs sur la base des valeurs définies pour d'autres champs. Par exemple, le formulaire pourrait avoir un sélecteur pour le type de coupon et afficherait différents champs de formulaire en fonction du type de coupon sélectionné.

kiamlaluno
la source
Ce n'est pas si simple lorsque vous souhaitez réutiliser le même formulaire.
Berdir