【问题标题】:Drupal Ajax CacheDrupal Ajax 缓存
【发布时间】:2011-09-20 07:43:54
【问题描述】:

我正在将我编写的模块从 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',  
    )

回调的sn-p:

function mycallback($form, $form_state) {

        [..]

        $form['fieldset']['mywrapper']['#markup'] = 'test';
        return $form['fieldset']['mywrapper']['#markup'];
    }

【问题讨论】:

  • 你能告诉我们代码或你的回调函数吗?
  • 我添加了回调的sn-p

标签: php drupal drupal-7 drupal-modules


【解决方案1】:

我遇到过几次这个问题,这不是缓存问题。问题是您最初将有一个 <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 模块中的ajax_example_submit_driven_ajax() 示例。

【讨论】:

  • 完美,谢谢!解决方案基本上是您在代码中的最后一条评论:返回标记项是问题。
  • 我偶尔也会遇到这种情况,并认为“它只是需要缓存”,因为它对匿名用户的显示方式,但它总是最终成为 $form 处理方式或返回数据。
  • 我通过 chrome 开发控制台检查了响应,并在我看来像这里描述的情况,正确的数据正在输入,但我的替换不起作用,尽管我尝试了 #markup 解决方法
  • 有人给@Clive一块饼干!
【解决方案2】:

在第一个答案的帮助下想通了

再次添加包装器

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 示例模块不需要

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多