繁体   English   中英

Drupal Ajax缓存

[英]Drupal Ajax Cache

我正在更新我从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'];
    }

我遇到过这个问题几次,这不是一个缓存问题。 问题是你最初有一个<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'];
}

如有疑问看看在实例模块 ,特别是ajax_example_submit_driven_ajax()中示例ajax_example模块。

在第一个答案的帮助下计算出来

再次添加包装器

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

我不认为你必须使用指针(&)至少drupal示例模块不会

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM