Рейтинг:0

перестроить форму с помощью ajax (решено)

флаг gb

В хуке я использую 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']

без всякого успеха.Как сделать так, чтобы заменить существующий, а не создавать новый?

cocq avatar
флаг gb
Я решил две проблемы. Чтобы заменить существующий виджет (то есть: чтобы избежать создания нового): используйте идентификатор div виджета, а не идентификатор самого виджета. Чтобы заменить массив опций: выберите «html» в качестве метода вместо «заменить».

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.