Drupal Autocomplete передача двух параметров, name|id



Иногда бывают случаи, когда в Друпале в поле с автозаполнением нужно передать и сохранить несколько параметров, например, название и его уникальный идентификатор. Но стандартными средствами Друпала, к сожалению, это сделать нельзя. Чтоб это получилось, нужно переопределить одну функцию в скрипте А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 Star2 Stars3 Stars4 Stars5 Stars (голосов 8, в среднем: 5.00 из 5)
Loading ... Loading ...


Рекомендую посмотреть:
- Drupal 6. Хук перед выводом блока.
  1. #1 krock - Октябрь 24th, 2011 at 04:01

    А если надо, чтобы список вариантов показывался полный и сразу?

  2. #2 nice - Октябрь 25th, 2011 at 21:33

    Немного не понял какой полный и где сразу?

  3. #3 Василий - Май 20th, 2013 at 11:33

    Спасибо, друг. Огромное

(will not be published)

Spam Protection by WP-SpamFree Plugin

  1. No trackbacks.