Drupal.Behaviors + .ajax запрос в функцию модуля

Главные вкладки

Аватар пользователя Shefarik Shefarik 1 сентября 2014 в 13:06

Здраствуйте. Вообщем нужно создать что то подобное до зависимых полей кастомно. Решение было написать скрипт который при изменении значении селекта брал его значение (сделано что значение = tid родителя термина таксономии ) и по .ajax отправлял это значение в кастомный модуль в определенную функцию, дальше там же выбирались дочерние елементы и возвращать в другой селект. Вот не могу никак отправить .ajax запрос в нужную функцию модуля и назад принять данные. Кто знает напишите плиз пример что мне нужно сделать...

Вот пока что у меня есть работающие:))))

(function ($) {
Drupal.behaviors.MultistepFormSelectModelName = {
attach: function (context, settings) {
$('form#multistep-add-ad-form-fourth select#edit-brand').bind('change paste keyup', function(){
var selectValue = $(this).val();
});
}
};
})(jQuery);

Комментарии

Аватар пользователя nitskel nitskel 2 сентября 2014 в 19:01

Если коротко используй в своем модуле или template.php хук hook_form_FORM_ID_alter
В нем добавь ajax к элементу селект с ссылкой на функцию в модуле

MYMODULE_form_FORM_ID_alter(&$form, &$form_state){
 //добавим ajax событие к селекту. По умолчанию событие change, метод replace
 $form['parent_select']['#ajax'] = array(
   'callback' => 'ajax_myfunction_callback', //ajax функция.
   'wrapper' => 'div_wrapper', //id div элемента в который обернут зависимый селект
 ),

 //добавим обертку зависимому селекту
 $form['child_select']['#prefix'] = '<div id="div_wrapper">';
 $form['child_select']['#suffix'] = '</div>';

 //здесь проверим значение 1 селекта. Если оно имеется то тогда 2 селекту дадим наши значения
 if(isset($form_state['values']['parent_select'])){
      //Передаем в нашу функцию значение первого селекта, делаем выборку и возвращаем массив для второго селекта. Думаю справишся.
      $options = get_options_myfunc($form_state['values']['parent_select']);
      $form['child_select']['#options'] = $options;
 }
}
function ajax_myfunction_callback($form, $form_state) {
  //при желании здесь можно много чего навертеть (http://xandeadx.ru/blog/drupal/492)
  //но мы просто вернем один элемент.
  return $form['child_select'];
}

Вся штука в том, что после изменение селекта форма построится по новой, но вернет только значения второго селекта. Благодоря div-обертке, старый селект замениться новым.

А благодоря хуку тебе не нужно лезть в код самой формы. ID формы и название полей можно узнать через dsm или print_r($form). Массив элемента может быть и другой. Там, где #options вполне может еще втиснуться язык какой-нибудь.

Вот здесь все подробно описано https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.h...