我真的被难住了。我有一个带有按钮的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'];
}