Несколько форм на одной странице?


8

Можно ли разместить несколько форм на одной странице?

Я пытаюсь сделать страницу предложения купона. Я хотел иметь две формы для двух разных предложений на каждой стороне страницы. Каждая форма имеет текстовое поле для кода купона и собственную кнопку отправки. Первая форма работает хорошо; однако скрытые значения второй формы, похоже, переопределяются значениями первой формы.

Я использую hook_alter, чтобы изменить вторую форму, чтобы она отличалась, но она по-прежнему имеет тот же form_id, что и первая. Это то, что вызывает мои проблемы, или мне нужно искать / думать где-то еще?

Две формы имеют одинаковые значения для «form_id» и «form_token», но разные значения для «form_build_id».

Ответы:


8

Если вы хотите добавить одну и ту же форму несколько раз, вам нужно реализовать hook_forms () . Смотрите node_forms () для примера.

Это позволяет использовать разные form_id, которые все указывают на одну и ту же функцию построителя форм. Например, вы можете использовать, yourmodule_some_form_$iа затем использовать hook_forms (), чтобы указать на них yourmodule_some_form.

См. Http://www.mohitsharma.net/content/how-show-same-form-multiple-time-page для примера


1
ОП говорит об использовании двух форм на одной странице; использование hook_forms()не решает автоматически это. Если вы просто используете одну и ту же форму дважды на одной и той же странице, у вас все еще остается проблема повторения одного и того же поля формы дважды.
kiamlaluno

Не уверен, что я пойду за тобой. Не уверен насчет 6.x прямо сейчас, но, как минимум, Drupal 7 следит за тем, чтобы не было повторяющихся идентификаторов, поэтому не должно быть проблемы, когда одни и те же поля формы несколько раз на одной странице?
Бердир

hook_forms()не используется для двух форм с одинаковыми полями формы на одной странице; он используется, чтобы позволить иметь единый конструктор форм для разных идентификаторов форм.
kiamlaluno

Вы можете использовать hook_forms () именно для этого. См. Например, mohitsharma.net/content/how-show-same-form-multiple-time-page
Бердир,

Пример, приведенный в этой статье, не практичен; у формы даже нет кнопки отправки, и для такой формы я бы не использовал hook_forms(). OP затем изменяет одну из двух форм.
kiamlaluno

-1

Вы можете иметь более одной формы на одной странице; посмотрите, что сделано с помощью 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()используемая для изменения формы, должна уметь понимать, в каком случае изменять форму, или обе формы будут отображать одинаковые поля.

С точки зрения пользовательского опыта, я не уверен, что показ двух разных форм с их собственными кнопками отправки - лучший способ сделать то, что вы пытаетесь достичь.
Я думаю, что было бы лучше использовать форму, которая показывает различные поля на основе значений, установленных для других полей. Например, форма может иметь селектор для типа купона и отображать различные поля формы в зависимости от выбранного типа купона.


Это не так просто, если вы хотите повторно использовать одну и ту же форму.
Бердир
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.