我真的很难过。我有一个带按钮的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'];
}
答案 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'];
}