Вы можете иметь более одной формы на одной странице; посмотрите, что сделано с помощью node_admin_content () , который использует следующий код:
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;
}
Оставляя первый оператор IF, функция добавляет две разные формы, которые имеют свои собственные обработчики представления.
Проблема с полями формы, которые повторяются дважды. Следующая структура массива создаст проблемы при выравнивании массива форм, так как будет два «купонных» поля.
$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,
);
Не видя используемого кода, я мог бы подумать, что использование обратного вызова страницы, который вызывает drupal_get_form (), вероятно, в вашем случае является более простым способом.
$output = drupal_get_form("form identifier") . drupal_get_form("form identifier");
Я попытался использовать следующий код в Drupal 6.
module_load_include('inc', 'path', 'path.admin');
$output = drupal_get_form('path_admin_form') . drupal_get_form('path_admin_form');
Содержимое $output
для этих двух форм было следующим (я удалил вывод для отдельных полей формы).
<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" />
Нет конфликта между идентификатором HTML, назначенным одному и тому же полю формы, и значение для "form_build_id" (или "form_token") отличается в двух формах.
Реализация, hook_form_alter()
используемая для изменения формы, должна уметь понимать, в каком случае изменять форму, или обе формы будут отображать одинаковые поля.
С точки зрения пользовательского опыта, я не уверен, что показ двух разных форм с их собственными кнопками отправки - лучший способ сделать то, что вы пытаетесь достичь.
Я думаю, что было бы лучше использовать форму, которая показывает различные поля на основе значений, установленных для других полей. Например, форма может иметь селектор для типа купона и отображать различные поля формы в зависимости от выбранного типа купона.
hook_forms()
не решает автоматически это. Если вы просто используете одну и ту же форму дважды на одной и той же странице, у вас все еще остается проблема повторения одного и того же поля формы дважды.