我正在更新我从D6写到D7的模块,因此必须通过表格中的新#ajax交换旧的AHAH。
我正在执行ajax请求,该请求会创建结果并用它替换表单元素。这基本上可以正常工作,但在第一次请求之后,结果会被缓存,并且不会考虑表单中的更改。我认为这可能是一个浏览器问题,但可能是Drupal发送了一个过期标头,导致浏览器采用缓存版本?还有其他想法吗?
hook_cache()中的片段:
$form['fieldset']['mybutton'] = array(
'#type' => 'button',
'#value' => t('Send request'),
'#ajax' => array(
'callback' => 'mycallback',
'wrapper' => 'mywrapper',
'method' => 'replace',
'effect' => 'fade',
)
回调的片段:
function mycallback($form, $form_state) {
[..]
$form['fieldset']['mywrapper']['#markup'] = 'test';
return $form['fieldset']['mywrapper']['#markup'];
}
答案 0 :(得分:9)
我遇到过这个问题几次,这不是缓存问题。问题是你最初会在<div>
元素周围放置一个mywrapper
,但是在你的ajax回调中你用字符串替换它...因此<div>
包装器被替换下次按下按钮时,脚本无法找到需要替换的<div>
,因为它不再存在!
此外,您的mycallback
函数的参数需要通过引用传入,因此请将签名更改为:function mycallback(&$form, &$form_state) {
。
尝试让代码看起来更像这样:
function mymodule_my_form($form, &$form_state) {
$form['fieldset'] = array(
'#type' => 'fieldset'
);
$form['fieldset']['my_element'] = array(
'#markup' => 'Some initial markup',
'#prefix' => '<div id="mywrapper">',
'#suffix' => '</div>'
);
$form['fieldset']['mybutton'] = array(
'#type' => 'button',
'#value' => t('Send request'),
'#ajax' => array(
'callback' => 'mymodule_mycallback',
'wrapper' => 'mywrapper',
'method' => 'replace',
'effect' => 'fade',
)
);
return $form;
}
function mymodule_mycallback(&$form, &$form_state) {
$form['fieldset']['my_element']['#markup'] = 'New Markup';
// Always, always, always return an element here, not a string.
// This makes sure the form state stays consistent.
return $form['fieldset']['my_element'];
}
如果有疑问,请查看examples module,特别是ajax_example_submit_driven_ajax()
模块中的ajax_example
示例。
答案 1 :(得分:1)
借助第一个答案计算出来
再次添加包装
function mymodule_mycallback(&$form, &$form_state) {
$form['fieldset']['my_element']['#prefix'] = '<div id="mywrapper">';
$form['fieldset']['my_element']['#suffix'] = '</div>';
// Always, always, always return an element here, not a string.
// This makes sure the form state stays consistent.
return $form['fieldset']['my_element'];
}
我不认为你必须使用指针(&amp;)至少drupal示例模块不会