Drupal表单:希望在页面上将以前的表单值显示为default_value

时间:2009-07-03 04:54:23

标签: forms drupal

我的目标是,如果用户提交的此表单的“产品名称”值为“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;
}

8 个答案:

答案 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', ''),
);

这样一来,如果变量被设置,它将抓住它的任何东西,但如果没有,你可以使用默认值。