Иногда бывают случаи, когда в Друпале в поле с автозаполнением нужно передать и сохранить несколько параметров, например, название и его уникальный идентификатор. Но стандартными средствами Друпала, к сожалению, это сделать нельзя. Чтоб это получилось, нужно переопределить одну функцию в скрипте Аutocomplete. На заметку вкратце опишу, как это сделать...
Например, нам нужно сделать поле с автозаполнением улиц.
Для начала создаем форму с текстовым полем для ввода названия улицы со свойством #autocomplete_path, в котором укажем путь для получения данных и скрытым полем hidden для сохранения ID идентификатора улицы в хуке_form:
$form['search']['street'] = array( '#type' => 'textfield', '#autocomplete_path' => 'mymodule/autocomplete/s', '#title' => "Улица", '#required' => FALSE, ); $form['search']['scode'] = array( '#type' => 'hidden', '#default_value' => '', );
Не забываем зарегистрировать callback вызова функции для autocomplete в хуке_menu:
$items['mymodule/autocomplete/s'] = array(
'page callback' => 'autocomplete_s',
'type' => MENU_CALLBACK,
'access arguments' => array('access content'),
);
Далее сама функция для autocomplete, которая будет возвращать результат в выпадающий список в поле с автозаполнением:
function autocomplete_s($string = '') {
$matches = array();
$matches['Кутузова|1'] = "Кутузова";
$matches['Коперника|2'] = "Коперника";
$matches['Кравченко|3'] = "Кравченко";
drupal_json($matches);
}
Здесь немного поясню. Когда мы в поле с автозаполнением вводим какой-нибудь текст, на сервер отсылается GET запрос на адрес, который мы определили в хуке_menu. А в ответ от сервера приходят данные в json формате. В нашем случае: { "Кутузова|1": "Кутузова", "Коперника|2": "Коперника", "Кравченко|3": "Кравченко" }.
Как видим, при формировании ответа через разделитель “|” мы подставили ID улицы.
Теперь переопределим одну функцию скрипта Аutocomplete. Для этого создадим файл street.js со следующим содержанием:
$(document).ready(function() {
if(Drupal.jsAC){
Drupal.jsAC.prototype.hidePopup = function (keycode) {
if (this.selected && ((keycode && keycode != 46 && keycode != 8 && keycode != 27) || !keycode)) {
// вызов функции обработки рекультата.
my_function(this.selected.autocompleteValue);
}
// Hide popup
var popup = this.popup;
if (popup) {
this.popup = null;
$(popup).fadeOut('fast', function() {
$(popup).remove();
});
}
this.selected = false;
};
}
});
function my_function(v)
{
var values = v.split('|');
$('input#edit-street').val(values[0]);
$("input#edit-scode").val(values[1]);
}
И подключим его в начале модуля.
drupal_add_js('street.js');
В функции hidePopup которая прячет выпадающий список после выбора нужного значения, мы просто вызываем небольшую дополнительную функцию my_function которой передаем выбранное значение. В нашей дополнительной функции мы обрабатываем полученное значение и вставляем нужные данные в нужные места.
В результате у нас получится поле с автозаполнением, с которого мы можем получит список ключей и значений.
Надеюсь, эта небольшая заметка кому-то пригодится!

#1 - Октябрь 24th, 2011 at 04:01
А если надо, чтобы список вариантов показывался полный и сразу?
#2 nice - Октябрь 25th, 2011 at 21:33
Немного не понял какой полный и где сразу?