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

09.04.2019

После загрузки страницы для каждой ссылки с классом 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
Похожие записи

Комментарии

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

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

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