2013-05-16 51 views
2

問題:Drupal的7 - #AJAX刷新不顯示drupal_set_message錯誤

在的Drupal 7的Form API,使用#AJAX刷新字段時,從驗證錯誤消息沒有顯示,直到整個頁面被刷新。我看到我刷新的字段在錯誤狀態下突出顯示,但是用戶沒有看到關聯的消息,直到它們太晚(它們重新加載頁面或轉到另一頁面)。

我開始在這個莊園裏手動處理錯誤堆棧:Drupal.org -- Filter out specific errors during validation,但是我有一個複雜的表單和一個小的預算來完成這個任務。必須有一些方法來刷新堆棧&將消息顯示給用戶而不用手動處理所有內容。

注意: 我使用帶回調的多指令,所以利用這是我的選擇。

$commands[] = ajax_command_replace("#my_wrapper", render($form['test']['field_a'])); 
    $commands[] = ajax_command_replace("#another_wrapper", render($form['test']['field_b'])); 

    return array('#type' => 'ajax', '#commands' => $commands); 

想法?

回答

5

解決方案:

顯然,當你使用多回調方法,Drupal沒有更新的消息給你。您可以手動執行此操作,如下所示:

// Remove the old messages div, clearing existing messages. 
    $commands[] = ajax_command_remove('#messages'); 
    // Append a new messages div with our latest errors and messages. 
    $commands[] = ajax_command_after('#header-region', '<div id="messages">' . theme('status_messages') . '</div>'); 

只需將它添加到任何回調命令[]你有數組,你是好去。

感謝Drupal.org -- AJAX commands and Drupal Messages爲正確的方向!

3

感謝atomox!只是對於那些不到多命令對應的又一個更全面的例子:

$form['ld']['letterdrop_allocations_submit'] = array(
    '#type' => 'submit', 
    '#value' => 'Letterdrop allocations update', 
    //  '#name' => 'Letterdrop allocations update', 
    '#name' => 'agc_letterdrop_submit', 
    '#ajax' => array(
     'callback' => 'agc_ems_form_letterdrop_submit_ajax', 
     ), 
    ); 

... 

function agc_ems_form_letterdrop_submit_ajax($form, &$form_state) { 
    drupal_set_message('here i am world', 'ok'); 
    $commands = array(); 
    $commands[] = ajax_command_replace('#messages', 
     '<div id="messages">' . theme('status_messages') . '</div>'); 
    $commands[] = ajax_command_alert('submitted via handler'); 
    return array( 
     '#type' => 'ajax', 
     '#commands' => $commands); 
} 

而且有點更簡潔並刪除的消息座標題區下面的假設:

$commands[] = ajax_command_replace('#messages', '<div id="messages">' . theme('status_messages') . '</div>'); 
+0

大,多個上下文的例子。謝謝,埃裏克! – Atomox