Drupal7Formsneneneba API:Ajax按钮未触发回调



我真的被难住了。我有一个带有按钮的ajax表单——实际上,下面的表单有一个按钮和一个选择对象,两者都调用相同的回调函数。

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

我所拥有的:select调用回调很好,但submit按钮什么都不做

想法?

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

我添加了'#limit_validation_errors' => array(),并将submit更改为button,使其正常工作,但在经历了巨大的头痛(以及一整天的工作损失)之后。

此表单位于商务结账窗格上。有了提交按钮,无论我在#ajax数组中设置了"prevent"=>"click"(因为Drupal ajax在mousedown上触发),还是设置了"#executes_submit_handler"=>FALSE,表单总是提交(在ajax_form_callback函数中,$form_state对象总是submit=1)。因此,表格总是在验证,而且由于不是所有的东西都填好了,所以它不会通过。

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

因此,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'];
}

相关内容

  • 没有找到相关文章

最新更新