Обратный вызов 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'];
}

Как будтоprograms_ajax_callback вообще не срабатывает. Я вижу это сообщение Drupal AJAX, пожалуйста, подождите, но на самом деле ничего не происходит. Странная вещь. Если я отправлю форму, и она не пройдет проверку, я даже не увижу это сообщение Drupal AJAX «пожалуйста, подождите». Я максимально упростил код, чтобы попытаться определить проблему, но это не сработало...

Любые идеи?


person perpetual_dream    schedule 02.06.2013    source источник
comment
Вы получаете ошибку? Попробуйте error_log('something') в своем обратном вызове, чтобы убедиться, что вы даже не доберетесь туда.   -  person carmel    schedule 03.06.2013
comment
Попробуйте вернуть простую строку вместо массива $form. вернуть '‹div›Test‹/div›' в обратном вызове. Кстати, вы используете отладчик?   -  person carmel    schedule 03.06.2013
comment
Действительно ли countries_wrapper существует на странице? Возможная проблема.   -  person Sumoanand    schedule 03.06.2013


Ответы (1)


Проблема была вызвана тем фактом, что country_wrapper на самом деле не существовало, так как я фактически где-то еще называл его country-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;
}
person perpetual_dream    schedule 22.06.2013