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