Answers:
如果要多次添加相同的表单,则需要实现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
hook_forms()
不用于在同一页面中具有相同表单字段的两个表单;它用于允许具有不同表单ID的单个表单构建器。
hook_forms()
。然后,OP更改两种形式之一。
同一页上可以有多个表格;查看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()
用来改变形式应该是能够理解在这种情况下改变形式,或两者的形式将显示相同的字段。
从用户体验的角度来看,我不确定用自己的提交按钮显示两种不同的表单是完成您要实现的目标的最佳方法。
我认为使用基于其他字段设置的值来显示不同字段的表单会更好。例如,表单可以具有用于优惠券类型的选择器,并且将基于所选的优惠券类型显示不同的表单字段。
hook_forms()
不会自动解决此问题。如果您在同一页面上简单地两次使用相同的表单,则仍然会有相同的表单字段重复两次的问题。