В хуке я использую ajax в поле формы, разработанном с помощью пользовательского интерфейса drupal. Объявлено так:
$form['field_unite_de_recherche']['виджет']['#ajax'] = массив(
'обратный вызов' => 'ajax_equipes_from_unites_callback',
'событие' => 'изменить',
'метод' => 'заменить',
'wrapper' => 'edit-field-equipe-membre2',
);
В функции обратного вызова я получаю некоторые значения в базе данных из выбранного значения в field_unite_de_recherche:
$selected = $form_state->getValue('field_unite_de_recherche');
$query = \Drupal::database()->select(...);
$результат = $запрос->выполнить();
в то время как ($row = $result->fetchAssoc()) {
$options[] = $row['title'];
}
Затем в этой функции обратного вызова я создаю новую версию виджета:
$form['field_equipe_membre2'] = [
'#тип' => 'выбрать',
'#title' => 'Надеть член2',
'#options' => $options,
];
возврат $form['field_equipe_membre2'];
В первый раз, когда я выбираю значение в поле «field_unite_de_recherche», поле «field_equipe_membre2» перестраивается с правильными значениями из базы данных.
При новом выборе в поле «field_unite_de_recherche» значения хорошо извлекаются из базы данных, но поле «field_equipe_membre2» не обновляется новыми значениями.
Я уверен, что значения хорошо извлекаются из этого второго выбора, потому что я записываю их в файл, как показано ниже.
$handle = fopen('debug.txt','w');
в то время как ($row = $result->fetchAssoc()) {
$options[] = $row['title'];
fputs($handle, $row['title']."\n");
}
fclose ($ дескриптор);
Вопрос: почему "field_equipe_membre2" перестраивается только в первый раз?
Я прочитал ряд сообщений на этом форуме:
- Команда «перестроить» не требуется, потому что она «включена» в ajax.
команда
- нет кеша для ajax
Я также смотрю модуль примеров ajax, но они не касаются способа хука
Может ли кто-нибудь дать мне совет?
Кроме того, даже с
'метод' => 'заменить',
в объявлении ajax мне не удалось избежать создания нового поля "field_equipe_membre2" в форме. я пытался вернуться
$form['field_equipe_membre2']['#options']
без всякого успеха.Как сделать так, чтобы заменить существующий, а не создавать новый?