Drupal → Отсылка на сервер дополнительных данных в системном автокомплите

25.11.2018

Системный автокомплит умеет отправлять на сервер только введённый текст. Послать вместе с текстом какие-то данные, например значение поля или js-переменной, нельзя.

Решение с подменой функции Drupal.ACDB.prototype.search:

autocomplete-fix.js

(function ($) {
  // Override Drupal.ACDB.prototype.search
  Drupal.ACDB.prototype.search = function (searchString) {
    var db = this;
    this.searchString = searchString;

    searchString = searchString.replace(/^\s+|\.{2,}\/|\s+$/g, '');
    if (searchString.length <= 0 || searchString.charAt(searchString.length - 1) == ',') {
      return;
    }

    // New code
    var data = {};
    $(db.owner.input).trigger('autocomplete-data', data);
    // end

    if (this.timer) {
      clearTimeout(this.timer);
    }
    this.timer = setTimeout(function () {
      db.owner.setStatus('begin');

      $.ajax({
        type: 'GET',
        url: db.uri + '/' + Drupal.encodePath(searchString),
        data: data, // New code
        dataType: 'json',
        success: function (matches) {
          if (typeof matches.status == 'undefined' || matches.status != 0) {
            if (db.searchString == searchString) {
              db.owner.found(matches);
            }
            db.owner.setStatus('found');
          }
        },
        error: function (xmlhttp) {
          Drupal.displayAjaxError(Drupal.ajaxError(xmlhttp, db.uri));
        }
      });
    }, this.delay);
  };
}(jQuery));

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

modulename.module

/**
 * Implements hook_library_alter().
 */
function modulename_library_alter(&$libraries, $module) {
  if ($module == 'system' && isset($libraries['drupal.autocomplete'])) {
    $module_path = drupal_get_path('module', 'modulename');
    $libraries['drupal.autocomplete']['js'][$module_path . '/autocomplete-fix.js'] = array(
      'group' => JS_DEFAULT,
    );
  }
}

После этого можно будет делать так:

(function ($) {
  Drupal.behaviors.modulename = {
    attach: function (context, settings) {
      $('.my-autocomplete-field', context).on('autocomplete-data', function (event, data) {
        data['foo'] = 'bar';
      });
    }
  };
}(jQuery));

При написании текста в .my-autocomplete-field, на сервер, помимо текста, будет уходить параметр $_GET['foo'] с значением bar.

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

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