在AJAX回调中更改$ form_state


16

我正在创建一个使用表单API '#ajax'属性的表单,我需要对$form_state按下启用AJAX的按钮的时间进行更改。这是我得到的:

在我的表单构建器函数中:

...
$form['some_fieldset']['add_more'] = array(
      '#type' => 'button',
      '#value' => t('Add more rows'),
      '#ajax' => array(
        'wrapper' => 'some-fieldset',
        'callback' => 'my_module_settings_ajax',
        'method' => 'replace',
        'effect' => 'fade',
      ),
    );

...

这是回调函数:

function my_module_settings_ajax($form, $form_state) { 
  // Make a change to $form_state
  if ($form_state['some_fieldset']['add_more']) {
    $form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
                                                                'second_field' => '');
  }

  return $form['some_fieldset'];
}

$form_state回调完成后,我所做的更改似乎丢失了。是否有任何方法可以$form_state对此功能进行更改,或者我应该为此使用其他任何功能?

编辑

事实证明,回调是执行此逻辑的错误位置。相反,在表单构建器功能的顶部,我添加了以下内容:

// Respond to AJAX-triggger:
// Add new row
if ($form_state['triggering_element']['#name'] == 'add_more') {
  $form_state['values']['some_fieldset']['table'][] = array('first_field' => '',
                                                                'second_field' => '');
}

当然,我必须给按钮起一个名字:

$form['some_fieldset']['add_more'] = array(
  '#type' => 'button',
  '#name' => 'add_more', // <-- Right here
  '#value' => t('Add more rows'),
  '#ajax' => array(
    'wrapper' => 'some-fieldset',
    'callback' => 'my_module_settings_ajax',
    'method' => 'replace',
    'effect' => 'fade',
  ),
);

现在就可以了!

Answers:


3

您需要通过$form_state作为参考;需要按照以下示例定义AJAX函数:

function mymodule_settings_ajax($form, &$form_state) { /* … */ } 

为了明确起见,您需要&通过引用而不是按值传递。没有它,您仅修改$ form_state的副本。
马尔克斯,2011年

是的,如果不这样做,则只需修改局部变量。
nourcy 2011年

1
当然,没想到。不幸的是,它没有任何作用-对$ form_state所做的任何更改都会在表单生成器中被忽略,并且在下次进行AJAX调用时,将还原$ form_state。可能是在执行回调时已经生成了表单吗?有没有一种方法可以为此按钮运行自定义提交处理程序?
兆瓦。

尝试将类型从按钮更改为提交
nourcy 2011年

0

我不确定这是否直接回答了您的问题,但它可能适用于您的用例:不必更改$ form_state即可将值添加到$ form中。如果您不希望它们显示,请使用#hidden

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.