Drupal7 Forms API:Ajax按钮不会触发回调

时间:2016-03-23 18:36:08

标签: ajax forms drupal drupal-7 ajaxform

我真的很难过。我有一个带按钮的ajax表单 - 实际上,下面有一个按钮和一个select对象,它们都调用相同的回调函数。

我想要的:调用回调的按钮,但不提交表单。

我拥有的东西:选择调用回调就好了,但是提交按钮没有任何东西。

思想?

function my_module_pane_checkout_form($form, $form_state, $checkout_pane, $order) {
  $pane_form = array(); 

  $pane_form['codes'] = array(
    '#prefix' => '<div id="codes-fieldset-wrapper">',
    '#suffix' => '</div>',
  );

  $pane_form['codes']['add_code_0'] = array(
    '#type' => 'radios',
    '#options' => array(1 => 'One', 2 => 'Two'),
    '#ajax' => array(
      'callback' => 'my_module_pane_callback',
      'wrapper' => 'codes-fieldset-wrapper',
    ),
    '#default_value' => 1,
  );

  $pane_form['codes']['add_code'] = array(
    '#type' => 'submit',
    '#value' => 'Add Code',
    '#ajax' => array(
      'callback' => 'my_module_pane_callback',
      'wrapper' => 'codes-fieldset-wrapper',
    ),
  );

  return $pane_form;
}

function my_module_pane_callback($form, $form_state) {
  watchdog('php', 'inside callback');
  return $form['my_module'];
}

1 个答案:

答案 0 :(得分:2)

我添加了'#limit_validation_errors' => array()并将submit更改为button并使其正常运行,但是在经历了一次非常头痛(并且整整一天的工作丢失)后却没有。

此表单位于商务结帐窗格中。使用提交按钮,表单始终即将提交(在ajax_form_callback函数中,$ form_state对象始终提交= 1),无论我是否设置了'prevent'=&gt; #ajax数组中的'click'(因为Drupal ajax在mousedown上触发)或者设置了'#executes_submit_handler'=&gt;假。因此,表格总是在验证,因为并非所有内容都被填写,所以它没有通过。

使用该按钮,表单仍在运行验证(并且失败),但表单未标记为已提交。

因此,JSON有效负载没有按钮的任何命令,因为验证失败。由于select(或任何其他对象)没有提交表单或检查验证,因此该元素的ajax调用正在运行。

由于我们需要传递两个检查来构建表单和ajax命令数组,我们需要将元素类型设置为一个按钮,我们需要将限制验证错误设置为空数组 - Drupal将只会对数组中传递的元素进行检查 - 为此我们什么都不需要。

再次:将'#type' => 'submit'更改为'#type' => 'button'并添加'#limit_validation_errors' => array()

function my_module_pane_checkout_form($form, $form_state, $checkout_pane, $order) {
  $pane_form = array(); 

  $pane_form['codes'] = array(
    '#prefix' => '<div id="codes-fieldset-wrapper">',
    '#suffix' => '</div>',
  );

  $pane_form['codes']['add_code_0'] = array(
    '#type' => 'radios',
    '#options' => array(1 => 'One', 2 => 'Two'),
    '#ajax' => array(
      'callback' => 'my_module_pane_callback',
      'wrapper' => 'codes-fieldset-wrapper',
    ),
    '#default_value' => 1,
  );

  $pane_form['codes']['add_code'] = array(
    '#type' => 'button',
    '#value' => 'Add Code',
    '#limit_validation_errors' => array(),
    '#ajax' => array(
      'callback' => 'my_module_pane_callback',
      'wrapper' => 'codes-fieldset-wrapper',
    ),
  );

  return $pane_form;
}

function my_module_pane_callback($form, $form_state) {
  watchdog('php', 'inside callback');
  return $form['my_module'];
}