2013-06-02 20 views
0

我想實現一個AJAX回調來改變一個下拉列表選項基於另一個下拉列表的值。我已經看到在線示例和示例模塊中的示例。我正試圖在其中一個管理頁面表單上實現該示例。Drupal管理窗體AJAX回調不工作

爲了簡化,我嘗試實現以下操作:只需在第一個下拉列表發生更改後使用隨機數字更改第二個下拉列表的標題。請注意,我正在使用字段收集字段。

function myaction_form_alter(&$form, &$form_state, $form_id) { 

$form['field_programme_permission']['und']['0']['field_programme']['und']['#ajax']=array(
     'event' => 'change', 
     'callback' => 'programmes_ajax_callback', 
     'method' => 'replace', 
     'wrapper' => 'countries_wrapper' 
    ); 


$form['field_programme_permission']['und']['0']['field_countries']['und']['#title']=rand(1,100); 
return $form; 
} 

function programmes_ajax_callback($form, $form_state) {  
return $form['field_programme_permission']['und']['0']['field_countries']; 
} 

就好像programmes_ajax_callback根本沒有被觸發。我看到這個Drupal AJAX請等待消息,但沒有發生實際情況。奇怪的是,如果我提交表單並且它沒有通過驗證,我甚至不會看到這個Drupal AJAX「請稍候」的消息。我儘可能簡化了代碼,試圖指出問題所在,但它不起作用...

任何想法?

+0

您是否收到錯誤消息?嘗試在回調中使用error_log('something'),以確保你甚至不會到達那裏。 – carmel

+0

嘗試返回一個簡單的字符串,而不是$ form數組。在回調中返回'

Test
'。順便說一句你使用調試器? – carmel

+1

頁面上是否存在'countries_wrapper'?可能的問題。 – Sumoanand

回答

0

這個問題是由於這樣的事實造成的:countries_wrapper實際上並不存在,因爲我實際上將它稱爲countries-wrapper別的地方。

查找下面我實際使用的代碼。此代碼涵蓋了一個多值(最多10個)字段集合,其中字段集合中的一個字段(國家/地區)依賴於另一個字段(程序)。希望它能證明對某人有用。

function mymodule_form_alter(&$form, &$form_state, $form_id) { 

      for($i=0;$i<10;$i++) { 
      if(($form_id=='user_register_form') || ($form_id=='user_profile_form')) { 

       if(isset($form_state['values']['field_programme_permission'][LANGUAGE_NONE][$i]['field_programme'][LANGUAGE_NONE][0]['tid'])) { 
       $programme_selected= $form_state['values']['field_programme_permission'][LANGUAGE_NONE][$i]['field_programme'][LANGUAGE_NONE][0]['tid']; 
       } else { 
       $programme_selected=0; 
       } 

       if(isset($form_state['field']['field_programme_permission']['und']['entity'][$i]->field_programme['und'][0]['tid'])){ 
       $programme_selected=$form_state['field']['field_programme_permission']['und']['entity'][$i]->field_programme['und'][0]['tid']; 
       } 

      $form['field_programme_permission'][LANGUAGE_NONE][$i]['field_programme'][LANGUAGE_NONE]['#ajax']=array(
      'event' => 'change', 
      'callback' => '_programmes_ajax_callback', 
      'method' => 'replace', 
      'wrapper' => 'countries_wrapper'.$i 
     ); 
      $form['field_programme_permission'][LANGUAGE_NONE][$i]['field_countries'][LANGUAGE_NONE]['#title']='Countries'; 

      $form['field_programme_permission'][LANGUAGE_NONE][$i]['field_countries'][LANGUAGE_NONE]['#prefix']='<div id="countries_wrapper'.$i.'">'; 
      $form['field_programme_permission'][LANGUAGE_NONE][$i]['field_countries'][LANGUAGE_NONE]['#suffix']='</div>'; 
      $form['field_programme_permission'][LANGUAGE_NONE][$i]['field_countries'][LANGUAGE_NONE]['#options']=_countries_ajax_callback($programme_selected); 

     } 
     } 
return $form; 
} 

function _programmes_ajax_callback($form, $form_state) { 
//we first need to know the triggering element, to know the index of the countries field that we need to affect. 
$index= $form_state['triggering_element']['#field_parents'][2]; 
return $form['field_programme_permission'][LANGUAGE_NONE][$index]['field_countries']; 
} 

function _countries_ajax_callback($selected) { 

    $programme_value = $selected; 
    $options=array(); 
    if(taxonomy_term_load($programme_value)){ 
    $programme_taxonomy=taxonomy_term_load($programme_value); 
    if(isset($programme_taxonomy->field_countries[LANGUAGE_NONE])) { 
    $countries=$programme_taxonomy->field_countries[LANGUAGE_NONE]; 
    foreach($countries as $country) { 
    $country_tid = $country['tid']; 
    $country_term = taxonomy_term_load($country_tid); 
    $country_name = $country_term->name; 
    $options[$country_tid]=$country_name; 
    } 
    } 
    } 
    return $options; 
}