Рейтинг:0

Как пропустить вызов пользовательской функции проверки в форме с раскрывающимися списками AJAX?

флаг in

Я использую безголовый Drupal с промежуточным программным обеспечением .NET. У меня есть форма Drupal 9.Эта форма содержит два раскрывающихся элемента, которые заполняются в зависимости от значения, выбранного в третьем раскрывающемся списке. У меня есть собственный обработчик проверки сразу после этих раскрывающихся элементов AJAX, где я храню некоторые данные в базе данных .NET.

Это мой код для крючок_form_alter().

$form['тип_технологии'] = [
  '#тип' => 'выбрать',
  '#title' => t('Тип технологии'),
  '#options' => $tech_type_options,
  '#default_value' => $t_selected_option,
  '#ajax' => [
    'обратный вызов' => 'techlistDropdownCallback',
    'wrapper' => 'techlist-fieldset-container',
    'событие' => 'изменить',
  ],    
];

если ($t_selected_option != '') {
  $tech_options = массив (0 => '- Нет -');
  $tech_options = custom_authorization_tech_options($t_selected_option);
}
еще {
  $tech_options = массив (0 => '- Нет -');
}

$form['techlist-select-fieldset-container']= [
  '#type' => 'контейнер',
  '#attributes' => ['id' => 'techlist-fieldset-container'],
];

$form['techlist-select-fieldset-container']['source_tech'] = [
  '#тип' => 'выбрать',
  '#title' => t('Исходная технология'),
  '#options' => $tech_options,
  '#default_value' => !пусто($source_tech_value) ? $source_tech_value : $form_state->getValue('source_tech'),
  '#множественный' => правда,
];

$form['techlist-select-fieldset-container']['target_tech'] = [
  '#тип' => 'выбрать',
  '#title' => t('Целевая технология'),
  '#options' => $tech_options,
  '#default_value' => !пусто($target_tech_value) ? $target_tech_value : $form_state->getValue('target_tech'),
  '#множественный' => правда,
];

если ($t_selected_option == 0) {
  $form['techlist-select-fieldset-container']['source_tech']['#title'] = t('Исходная технология (сначала необходимо выбрать тип технологии)');
  $form['techlist-select-fieldset-container']['source_tech']['#disabled'] = TRUE;
  $form['techlist-select-fieldset-container']['target_tech']['#title'] = t('Целевая технология (сначала необходимо выбрать тип технологии)');
  $form['techlist-select-fieldset-container']['target_tech']['#disabled'] = TRUE;
}

array_unshift($form['#validate'],'custom_authorization_mak_form_validate');

Всякий раз, когда эти зависимые раскрывающиеся списки заполняются значениями, функция проверки каким-то образом вызывается, и неполные данные автоматически сохраняются в базе данных, даже без нажатия кнопки сохранения в форме.

Как избежать этой странной проблемы?

Я просто хочу заполнить раскрывающиеся элементы с помощью AJAX, а затем вызвать обработчик проверки для сохранения данных в базе данных.

apaderno avatar
флаг us
*Headless Drupal* означает, что Drupal не используется для отображения страниц и форм пользователям. Ваш код изменяет форму, которую Drupal не должен показывать пользователям. Кроме того, *безголовый Drupal* не записывает в таблицы базы данных, созданные другим программным обеспечением.
sonfd avatar
флаг in
Разве вы не должны писать в таблицу после того, как форма была успешно отправлена? Не во время проверки?
taggartJ avatar
флаг cn
На самом деле проверка вызывается каждый раз, когда происходит изменение ajax, вы должны изменить свой собственный код проверки, чтобы проверить, существуют ли значения, если выполните проверку, если нет.
Raja Chakraborty avatar
флаг in
Привет @apaderno, пожалуйста, найдите мои разъяснения- 1. Безголовый Drupal означает, что Drupal не используется для отображения страниц или форм пользователям. Интерфейс моего приложения содержит меню, которое направляет пользователей к формам drupal. 2. Безголовый Drupal не записывает в таблицы базы данных, созданные другим программным обеспечением. В функции проверки у меня есть один API, который отправляет данные формы в базу данных .net.
Raja Chakraborty avatar
флаг in
Привет @taggartJ, функция проверки вызывается каждый раз, когда происходит вызов ajax?
apaderno avatar
флаг us
Если пользователям доступны страницы или формы Drupal, то это не безголовый Drupal. Да, обработчики проверки и отправки также вызываются, когда задействован AJAX; даже метод построителя формы вызывается после события AJAX.
taggartJ avatar
флаг cn
да, так и должно быть
Рейтинг:0
флаг cn

Чтобы предотвратить отправку формы, когда форма отправляется с помощью AJAX (когда вы меняете состояние формы с помощью AJAX), в обработчике проверки используйте $form_state->setRebuild();

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

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