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

09.04.2019

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

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

(function (Drupal) {
  /**
   * Override AJAX "beforeSerialize" callback.
   */
  var originalAjaxBeforeSerialize = Drupal.Ajax.prototype.beforeSerialize;
  Drupal.Ajax.prototype.beforeSerialize = function (element, options) {
    // Change request url to url from element data-ajax-url attribute
    if (this.element) {
      var elementAjaxUrl = this.element.dataset.ajaxUrl;
      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;
      }
    }

    // Call original callback
    return originalAjaxBeforeSerialize.apply(this, arguments);
  };
})(Drupal);

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

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

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

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

Комментарии

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

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

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