我的目标是,如果用户提交的此表单的“产品名称”值为“YYY”。在提交页面上应该重新加载,但这次“产品名称”应该显示以前的valye默认为本例“YYY”。
这是我的代码......
function addnewproduct_page () {
return drupal_get_form('addnewproduct_form',&$form_state);
}
function addnewproduct_form(&$form_state) {
$form = array();
$formproductname['productname'] = array (
'#type' => 'textfield',
'#title' => t('Product Name'),
'#required' => TRUE,
'#size' => '20',
);
if (isset($form_state['values']['productname']))
{
$form['productname']['#default_value'] = $form_state['values']['productname'];
}
//a "submit" button
$form['submit'] = array (
'#type' => 'submit',
'#value' => t('Add new Product'),
);
return $form;
}
答案 0 :(得分:15)
您可以在提交处理程序中使用$ form_state ['storage']来保存步骤之间的值。所以添加一个提交函数,如下所示:
function addnewproduct_form_submit ($form, &$form_state) {
// Store values
$form_state['storage']['addnewproduct_productname'] = $form_state['values']['productname'];
// Rebuild the form
$form_state['rebuild'] = TRUE;
}
然后您的表单构建器功能将变为:
function addnewproduct_form(&$form_state) {
$form = array();
$form['productname'] = array (
'#type' => 'textfield',
'#title' => t('Product Name'),
'#required' => TRUE,
'#size' => '20',
);
if (isset($form_state['storage']['addnewproduct_productname'])) {
$form['productname']['#default_value'] = $form_state['storage']['addnewproduct_productname'];
}
return $form;
}
请记住,只要填写$ form_state ['storage'],您的表单就会一直生成。因此,当准备好将值保存到数据库等时,您需要调整提交处理程序并取消设置($ form_state ['storage'])。
如果您的表单更像是过滤器,即。用于显示而不是存储信息,那么你可以只用
逃脱function addnewproduct_form_submit ($form, &$form_state) {
// Rebuild the form
$form_state['rebuild'] = TRUE;
}
当表单重建时,它可以访问上一次迭代中的$ form_state ['values']。
答案 1 :(得分:1)
如果您包含以下内容,Drupal将默认执行此操作:
$formproductname['#redirect'] = FALSE;
在$ formproductname数组中。
答案 2 :(得分:0)
当我们谈论复杂形式时,我更喜欢一次性保存所有值:
foreach ($form_state['values'] as $form_state_key => $form_state_value) {
$form_state['storage'][$form_state_key] = $form_state['values'][$form_state_value];
}
答案 3 :(得分:0)
对于那些在使用webform时寻找答案的人(我刚刚挣扎过),这就是我最终要做的事情:
//in hook_form_alter
$form['#submit'][] = custom_booking_form_submit;
function custom_booking_form_submit($form, &$form_state) {
// drupal_set_message("in form submit");
// dpm($form_state, 'form_state');
foreach ($form_state['values']['submitted_tree'] as $form_state_key => $form_state_value) {
$form_state['storage'][$form_state_key] = $form_state_value;
}
}
注意:添加'因为它丢失了
答案 4 :(得分:0)
只需添加rebuilt = true即可完成工作:
$form_state['rebuild'] = TRUE;
版本:Drupal 7
答案 5 :(得分:0)
在我的情况下,我有几个下拉菜单。提交表单回发到同一页面,我可以在其中过滤视图,我想显示以前选择的选项。在提交表单时,我在submit hook中构建了一个查询字符串:
function myform_submit($form, &$form_state) {
$CourseCat = $form_state['values']['coursecat'];
drupal_goto("courses" , array('query' =>
array('cat'=>$CourseCat))
);
}
在表单构建钩子中,我所做的只是获取当前查询字符串并将其用作默认值,如下所示:
function myform_form($form, &$form_state) {
$Params = drupal_get_query_parameters ();
$CatTree = taxonomy_get_tree(taxonomy_vocabulary_machine_name_load ('category')->vid);
$Options = array ();
$Options ['all'] = 'Select Category';
foreach ($CatTree as $term) {
$Options [$term->tid] = $term->name;
}
$form['cat'] = array(
'#type' => 'select',
'#default_value' => $Params['cat'],
'#options' => $Options
);
$form['submit'] = array(
'#type' => 'submit',
'#default_value' => 'all',
'#value' => t('Filter'),
);
return $form;
}
答案 6 :(得分:-1)
我通常通过将提交的值放在提交钩子中的$ _SESSION变量中来解决这个问题。然后在下次加载表单时,我检查$ _SESSION变量以获取相应的键,如果存在任何值,则将值放入#default_value槽中。
答案 7 :(得分:-1)
不确定这是否适合您,但您可以尝试将#default_value
键添加到表单数组
$form['productname'] = array (
'#type' => 'textfield',
'#title' => t('Product Name'),
'#required' => TRUE,
'#size' => '20',
'#default_value' => variable_get('productname', ''),
);
这样一来,如果变量被设置,它将抓住它的任何东西,但如果没有,你可以使用默认值。