В Drupal 7, почему автозаполнение не прикрепляется к этому списку элементов формы? - PullRequest
0 голосов
/ 23 ноября 2011

Я бы хотел прикрепить автозаполнение к определенному списку полей в 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';
    }
}

Ответы [ 3 ]

0 голосов
/ 29 ноября 2011

Попробуйте:

1) замените ['mymodule'] ['und'] [$ index] ['value'] в вашем коде на идентификатор вашего примера ввода текстовой формы

$form['search_form_block']
['#autocomplete_path']='yourcall_back_function_which_returns_data';

Я думаю, что ошибка в том, что вы пытаетесь заменить значение поля, но вам нужно изменить значение виджета формата.В этом случае поле ввода.

2) Также убедитесь, что обратный вызов api / node / title работает с использованием x debug.

Дайте мне знать, сработало ли это.

Ура, вишал

0 голосов
/ 11 октября 2012

Я решил проблему, вручную перечислив свои индексы, а не программно, например, $form['mymodule']['und'][0]... - похоже, это проблема PHP, связанная с областью видимости переменных в foreach, а не проблема Drupal.

0 голосов
/ 23 ноября 2011

Вы написали это #autcomplete_path ... это должно быть #autocomplete_path:)

Если вы сами определяете поле (и виджет), вам нужно просто добавить автозаполнение в реализацию вашего модуля hook_field_widget_form(), а не изменять форму.

Если вы не определяете виджет самостоятельно, взгляните на hook_field_widget_form_alter() и hook_field_widget_WIDGET_TYPE_form_alter(), которые позволят вам изменить форму виджета для определенного поля.

...