Рейтинг:-1

Почему я получаю сообщение «Обнаружен неверный выбор». из формы, которую создает мой код?

флаг ng

Я использую следующий код для формы.

общедоступная функция buildForm (массив $ form, FormStateInterface $ form_state) {
  $region_options = static::getFirstDropdownOptions();
  $form['vvv_region'] = [
    '#тип' => 'выбрать',
    '#title' => $this->t('поле выбора региона'),
    '#options' => $region_options,
    '#empty_option' => t('- Выберите регион -'),
    '#ajax' => [
      'обратный вызов' => '::myAjaxCallback',
      'отключить-перефокусировку' => ЛОЖЬ,
      'событие' => 'изменить',
      'обертка' => 'вывод-редактирование',
      'прогресс' => [
        'тип' => 'пульсирующий',
        'message' => $this->t('Проверка записи...'),
      ],
    ]
  ];
    
  $region_selected = $form_state->getValue('vvv_region');
  $city_options = static::getSecondDropdownOptions($region_selected);
    
  $ форма ['выход'] = [
    '#тип' => 'выбрать',
    '#title' => $this->t('поле выбора города'),
    '#options' => $city_options,     
    '#prefix' => '<div id="edit-output">',
    '#суффикс' => '</div>',
    '#empty_option' => t('- Выберите город -'),
    '#значение_по_умолчанию' => '',
    '#ajax' => [
      'обратный вызов' => '::cityAjaxCallback',
      'отключить-перефокусировку' => ЛОЖЬ,
      'событие' => 'изменить',
      'обертка' => 'город редактирования',
      'прогресс' => [
        'тип' => 'пульсирующий',
        'message' => $this->t('Проверка записи...'),
      ],
    ]
  ];
    
  $city_select = $form_state->getValue('output');
  $suburb_options = static::getSuburbDropdownOptions($city_select);
        
  $ форма ['sur'] = [
    '#тип' => 'выбрать',
    '#options' => $suburb_options,     
    '#prefix' => '<div id="edit-city">',
    '#суффикс' => '</div>',
    '#empty_option' => t('- Выберите сурб -'),
    '#default_value' => массив(''),
  ];
  вернуть $ форму;
}

публичная функция myAjaxCallback (массив и $ форма, FormStateInterface $ form_state) {
  $region_selected = $form_state->getValue('vvv_region');
  $city_options = static::getSecondDropdownOptions($region_selected);

  если ($form_state->getErrors()) {
    \Drupal::messenger()->addError($region_selected);
    $form_state->setRebuild();
  }
  
  $form['outpout']['#options'] = $city_options;
          
  возврат $ форма ['выход']; 
}
    
публичная функция cityAjaxCallback (массив и $ форма, FormStateInterface $ form_state) {
  $city_select = $form_state->getValue('output');
  $sur_data = static::getSuburbDropdownOptions($city_select);

  если ($form_state->getErrors()) {
    \Drupal::messenger()->addError($city_select);
    $form_state->setRebuild();
  }

  $form['sur']['#options'] = $sur_data;

  возврат $form['sur']; 
}

При отправке формы я получаю следующую ошибку.

Обнаружен недопустимый выбор. Пожалуйста свяжитесь с администратором сайта.

Что не так с кодом, который я использую?

Jaypan avatar
флаг de
Вы не можете изменить значение параметров в обратном вызове ajax. Это должно быть сделано в определении формы. Вы можете прочитать пример того, как это сделать, в этом руководстве, которое я написал: https://www.jaypan.com/tutorial/drupal-form-api-ajax-form-and-results-same-page.
apaderno avatar
флаг us
В первом обратном вызове опечатка: `$form['outpout']['#options'] = $city_options;`. Это должен быть *выход*, а не *выход*.
Рейтинг:2
флаг us

В коде, показанном в вопросе, есть две ошибки.

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

Обнаружен недопустимый выбор. Пожалуйста свяжитесь с администратором сайта.

Обратный вызов AJAX просто возвращает элемент формы, который необходимо изменить. В вашем случае код следующий.

публичная функция myAjaxCallback (массив и $ форма, FormStateInterface $ form_state) {
  возврат $ форма ['выход']; 
}
    
публичная функция cityAjaxCallback (массив и $ форма, FormStateInterface $ form_state) {
  возврат $form['sur']; 
}

Обратный вызов AJAX для формы обычно не обрабатывает ошибки проверки.

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

$region_selected = $form_state->getValue('vvv_region');

Когда форма впервые построена, $form_state->getValue('vvv_region') не возвращает никакого значения, так как форма еще не отправлена, даже через AJAX. Только когда форма отправляется через AJAX, $form_state->getValue('vvv_region') возвращает значение. Эту строку необходимо изменить следующим образом.

$region_selected = $form_state->hasValue('vvv_region') ? $form_state->getValue('vvv_region'): ключ($region_options);

Сходным образом, $city_select = $form_state->getValue('output'); нужно изменить.

$city_select = $form_state->hasValue('output') ? $form_state->getValue('output'): ключ($city_options);

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

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