2011-09-20 37 views
2

我正在更新我從D6寫入D7的模塊,因此必須在窗體中使用新的#ajax交換舊的AHAH。Drupal Ajax Cache

我正在執行一個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

你能告訴我們代碼或你的回調函數嗎? – yvan

+0

我添加了一個回調片段 – schneck

回答

8

我碰到這個問題了幾次,它不是一個緩存的問題。問題是你最初有一個<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()例子。

+0

完美,謝謝!解決方案基本上是您在代碼中的最後一條評論:返回標記項是問題所在。 – schneck

+0

我偶爾遇到這種情況,並認爲「它只是要緩存」,因爲它出現在匿名用戶身上,但它總是成爲處理$表單或返回數據的具體內容。 –

+0

我通過chrome dev控制檯檢查了響應,看起來像我這裏描述的情況,正確的數據進來了,但我的替換不起作用,儘管我嘗試了#markup工作 – Dukeatcoding

0

想通了與第一個答案

的幫助下添加的包裝再次

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

而且我不認爲u必須至少使用指針(&)Drupal的示例模塊沒有按't