Я бы хотел прикрепить автозаполнение к определенному списку полей в Drupal 7. Поля имеют FIELD_CARDINALITY_UNLIMITED
, поэтому их может быть от 1 до чего угодно. Я использую следующий код:
function mymodule_form_alter(&$form, &$form_state, $form_id) {
if (array_key_exists('mymodule', $form)) {
$indices = array_filter(
array_keys($form['mymodule']['und']),
function($item) {
return is_numeric($item);
}
);
foreach($indices as $index) {
$form['mymodule']['und'][$index]['value']['#autocomplete_path'] = 'api/node/title';
}
}
}
... однако, мое автозаполнение не привязано. Я использовал точно такой же код в аналогичной ситуации - единственное отличие состоит в том, что я добавлял автозаполнение в поле, которое имело бы 1, а не неограниченное количество элементов. Кажется, это ничего не должно изменить. Я проверил, что автозаполнение подключается, выполнив debug($form['mymodule'])
после оператора присваивания, и оно определенно есть. Я также отладил точный путь массива, который я пытаюсь получить в каждой итерации цикла foreach, и это определенно правильное значение формы.
РЕДАКТИРОВАТЬ: Возможно, проблема в том, что более чем один модуль изменяет эту форму с помощью hook_form_alter()
? Я выполняю ту же операцию, что и выше (но для одного поля), в другом модуле, в той же форме.
EDIT2: я заметил, что если я помещаю оператор отладки в цикл foreach, я вижу, что значение автозаполнения устанавливается на правильное значение каждую итерацию. Если я помещу оператор отладки вне цикла foreach, путь автозаполнения больше не будет установлен. Каким-то образом, или в ходе итерации, или после итерации, похоже, что мои изменения уничтожаются? Я проверил это, приняв $index
равным 0 и написав жестко запрограммированный оператор для добавления автозаполнения - это позволило автозаполнению работать правильно. Чтобы было ясно, я вижу что-то вроде следующего:
function mymodule_form_alter(&$form, &$form_state, $form_id) {
if (array_key_exists('mymodule', $form)) {
$indices = array_filter(
array_keys($form['mymodule']['und']),
function($item) {
return is_numeric($item);
}
);
foreach($indices as $index) {
$form['mymodule']['und'][$index]['value']['#autocomplete_path'] = 'api/node/title';
// Debug statements here show that the value '#autocomplete_path' is set properly
debug($form)['mymodule']['und'][$index]['value']);
}
// Now, the '#autocomplete_path' key does not exist
debug($form)['mymodule']['und'][0]['value']);
// This will make autocomplete attach correctly
$form['mymodule']['und'][0]['value']['#autocomplete_path'] = 'api/node/title';
}
}