一页上有多个表格?


8

是否可以在一个页面上放置多个表单?

我正在尝试制作优惠券报价页面。我希望在页面的每一侧都有两种形式的两种不同报价。每个表格都有一个用于优惠券代码的文本字段和自己的提交按钮。第一种形式行得通;但是,第二种形式的隐藏值似乎被第一种形式的隐藏值覆盖。

我正在使用hook_alter来更改第二个表单以使其与众不同,但它仍具有与第一个相同的form_id。这是引起我问题的原因,还是我需要在其他地方查看/思考?

这两个表单的“ form_id”和“ form_token”值相同,但“ form_build_id”的值不同。

Answers:


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
OP正在谈论在同一页面上使用两种形式。使用hook_forms()不会自动解决此问题。如果您在同一页面上简单地两次使用相同的表单,则仍然会有相同的表单字段重复两次的问题。
kiamlaluno

不知道我是否跟随你。现在还不确定6.x,但是至少在Drupal 7上要确保没有重复的id,因此在同一页面上多次使用相同的表单字段时应该不会有问题吗?
贝尔迪尔

hook_forms()不用于在同一页面中具有相同表单字段的两个表单;它用于允许具有不同表单ID的单个表单构建器。
kiamlaluno

您可以完全使用hook_forms()。参见例如mohitsharma.net/content/how-show-same-form-multiple-time-page
Berdir 2011年

该文章中给出的示例不切实际。该表单甚至没有提交按钮,对于这种表单,我不会使用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 ID之间没有冲突,并且两种表单中“ form_build_id”(或“ form_token”)的值不同。

实施hook_form_alter()用来改变形式应该是能够理解在这种情况下改变形式,或两者的形式将显示相同的字段。

从用户体验的角度来看,我不确定用自己的提交按钮显示两种不同的表单是完成您要实现的目标的最佳方法。
我认为使用基于其他字段设置的值来显示不同字段的表单会更好。例如,表单可以具有用于优惠券类型的选择器,并且将基于所选的优惠券类型显示不同的表单字段。


要重新使用相同的表单并不是那么简单。
贝尔迪尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.