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 $output
pour 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é.
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.