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

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

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

Системный автокомплит умеет отправлять на сервер только введённый текст. Послать вместе с текстом какие-то данные, например значение поля или 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
Похожие записи

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

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

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