Drupal → Как программно навесить на элемент друпаловский AJAX-обработчик

17.04.2014

AJAX-обработчики можно навешивать как из PHP, так и из Javascript. Ниже пример AJAX-ификации клика по заголовку блока #block-menu-devel:

Способ с помощью PHP:

$ajax_settings = array(
  'block-menu-devel-title' => array(
    'selector' => '#block-menu-devel h2',
    'event' => 'click',
    'url' => url('my/custom/ajax/path'),
  ),
);
drupal_add_js(array('ajax' => $ajax_settings), 'setting');
drupal_add_library('system', 'drupal.ajax');

Способ с помощью Javascript:

(function ($) {
  Drupal.behaviors.modulename = {
    attach: function (context, settings) {
      $('#block-menu-devel h2', context).once('ajax', function () {
        var base = 'block-menu-devel-title';
        Drupal.ajax[base] = new Drupal.ajax(base, this, {
          event: 'click',
          url: Drupal.settings.basePath + 'my/custom/ajax/path',
        });
      });
    }
  };
})(jQuery);

Для javascript способа так же нужно не забыть предварительно подключить либу drupal.ajax, как это сделано в первом способе.

Так же, если навешиваете ajax на элемент формы, то дополнительно нужно подключить либу jquery.form.

Подробнее.

Написанное актуально для
Drupal 7
Похожие записи

Комментарии

Спасибо, очень интересно ) Чувствую, что нужно, но вот как это использовать? Вот привязал обработчик, создал hook_menu, callback что-то выводит. И куда я это вставлю? Извините за тупость, но маленький пример, плз.

Это аналог #ajax для тех элементов, к которым нельзя прицепиться из альтер и препроцесс-хуков. Пример — в обычном блоке есть ссылка "Обратная связь", нужно по клику показать диалог с формой.

Игорь
30.03.2015, 13:38

У меня как всегда вопрос:
Мне сам аякс запрос не нужен, но элементы созданные из аякс запроса или вновь созданные javascriptом - обычно обрабатываются live() или on().. А как правильно написать обработчик для друпала?
Здесь вот про это - http://xandeadx.ru/blog/javascript/355 - но только в комментах, могли бы вы написать функцию?! Спасибо.

Игорь
30.03.2015, 20:43

о нём. Только вот не понимаю я как он работает?

$('.example', context).click(function () {
        $(this).next('ul').toggle('show');
      });

фишка - context - передавать? Или нет, в другом?
Drupal.behaviors.exampleModule - и должен по умолчанию с любыми элементами (не существовавшими в коде html изначально) работать? Чё та не выходит аленький цветок ;-)

behavior срабатывает в двух случаях:

1. domready (context = document)
2. в момент вызова Drupal.attachBehaviors (context = обновлённый/добавленный html)

Добавить комментарий