xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Динамический url ajax-ссылок

Опубликовано в

После загрузки страницы для каждой ссылки с классом use-ajax создаётся объект Drupal.Ajax, в котором фиксируется адрес, на который по клику отправится ajax запрос. После создания этого объекта менять href ссылки уже бесполезно, надо вручную лезть в Drupal.ajax.instances и менять options.url у нужного объекта.

Ниже пример того, как можно перед отправкой ajax запроса автоматически менять его адрес на значение атрибута ссылки data-ajax-url:

(function ($, Drupal) {
  var originalAjaxBeforeSerialize = Drupal.Ajax.prototype.beforeSerialize;
 
  Drupal.Ajax.prototype.beforeSerialize = function (element, options) {
    var elementAjaxUrl = $(this.element).data('ajax-url');
 
    if (elementAjaxUrl) {
      var wrapperFormatIndex = options.url.indexOf(Drupal.ajax.WRAPPER_FORMAT);
 
      if (wrapperFormatIndex > 0) {
        elementAjaxUrl += (elementAjaxUrl.indexOf('?') === -1) ? '?' : '&';
        elementAjaxUrl += options.url.substring(wrapperFormatIndex);
      }
 
      options.url = elementAjaxUrl;
    }
 
    originalAjaxBeforeSerialize.apply(this, arguments);
  };
})(jQuery, Drupal);

Так же это будет полезно, когда нужно чтобы ссылка вела на один адрес, а ajax запрос отправлялся на другой:

<a href="/node/1#body" data-ajax-url="/ajax/show-node-body/1" class="use-ajax">
  Показать содержимое
</a>

Или можно создавать ajax-ссылки совсем без адреса:

<a href="#" data-ajax-url="/ajax/show-node-body/1" class="use-ajax">
  Показать содержимое
</a>
Написанное актуально для Drupal 8
Похожие записи

Комментарии RSS

Норм вариант. Я делал так проверку запроса на ajax в контроллере:

$request = \Drupal::request();
$is_ajax = $request->isXmlHttpRequest();

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании