【问题标题】:Drupal Form:want to show previous form value as default_value on pageDrupal 表单:想要在页面上显示以前的表单值作为 default_value
【发布时间】:2009-07-03 04:54:22
【问题描述】:

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

【问题讨论】:

    标签: forms drupal


    【解决方案1】:

    您可以在提交处理程序中使用 $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'] 被填充,您的表单就会不断生成。因此,当您准备好将值保存到数据库等时,您需要调整提交处理程序和 unset($form_state['storage'])。

    如果您的表单更像是一个过滤器,即。用于显示而不是存储信息,那么您只需

    function addnewproduct_form_submit ($form, &$form_state) {
      // Rebuild the form
      $form_state['rebuild'] = TRUE;    
    }
    

    当表单重建时,它将可以访问上一次迭代中的 $form_state['values']。

    【讨论】:

    • 很好的答案我已经找了好几天了! +1
    【解决方案2】:

    如果您包含以下内容,Drupal 将默认执行此操作:

    $formproductname['#redirect'] = FALSE;
    

    在您的 $formproductname 数组中。

    【讨论】:

      【解决方案3】:

      当我们谈论复杂的形式时,我更喜欢一次性保存所有值:

      foreach ($form_state['values'] as $form_state_key => $form_state_value) {
          $form_state['storage'][$form_state_key] = $form_state['values'][$form_state_value];
      }
      

      【讨论】:

        【解决方案4】:

        只需添加 rebuilt = true 即可:

          $form_state['rebuild'] = TRUE;
        

        版本:Drupal 7

        【讨论】:

          【解决方案5】:

          对于任何在使用网络表单时在这里寻找答案的人(我只是在努力通过),这就是我最终做的事情:

          //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;
              }
          }
          

          注意:添加 ' 因为它丢失了

          【讨论】:

            【解决方案6】:

            就我而言,我有几个下拉菜单。将表单提交回同一页面,在那里我可以过滤视图并且我想显示之前选择的选项。在提交表单时,我在提交挂钩中构建了一个查询字符串:

            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;
            }
            

            【讨论】:

              【解决方案7】:

              我通常通过将提交的值放在提交挂钩的 $_SESSION 变量中来解决这个问题。然后下次加载表单时,我会检查 $_SESSION 变量中是否有适当的键,如果存在任何内容,则将值放入 #default_value 槽中。

              【讨论】:

                【解决方案8】:

                不确定这是否适合您,但您可以尝试将 #default_value 键添加到表单数组中

                $form['productname'] = array (
                '#type' => 'textfield',
                '#title' => t('Product Name'),
                '#required' => TRUE,
                '#size' => '20',
                '#default_value' => variable_get('productname', ''),
                );
                

                这样,如果设置了变量,它将抓取它的任何值,但如果没有,您可以使用默认值。

                【讨论】:

                • GLOBAL 解决方案太多了,过分了
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-04-26
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多