«Обнаружен неправильный выбор ...» с выпадающим списком динамических c I Drupal8 - PullRequest
0 голосов
/ 13 марта 2020

Я написал этот код для динамического c выпадающего списка выбора в hook_form_alter. Опции заполняются внешней БД.

function car2db_annuncio_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'node_annuncio_form') {
    $options_type = car2db_annuncio_type_dropdown_options();
    $form['field_marca']['#prefix'] = '<div id="field_marca">';
    $form['field_marca']['#suffix'] = '</div>';
    $form['field_tipologia']['widget']['#options'] = $options_type;
    $form['field_tipologia']['widget']['#ajax'] = array(
      'event' => 'change',
      'callback' => 'car2db_annuncio_make_ajax_callback',
      'wrapper' => 'field_marca',
      'disable-refocus' => FALSE,
      'progress' => [
        'type' => 'throbber',
        'message' => t('Verify...'),
      ]
    );
  }
}

function car2db_annuncio_type_dropdown_options() {
  $connection = Database::getConnection('default', 'migrate');

  $dropdown_type = ['none' => '- Seleziona - '];
  $sql_type = "SELECT * FROM `car_type`";
  $query_type = $connection->query($sql_type);
  $res_type = $query_type->fetchAll();
  foreach ($res_type as $row){
    $key = $row->id_car_type;
    $value = $row->name;

    $dropdown_type[$key] = $value;
  }
  return $dropdown_type;
}

function car2db_annuncio_make_dropdown_options($key_type) {
  $connection = Database::getConnection('default', 'migrate');

  $dropdown_make = ['none' => '- Seleziona - '];
    $sql_make = "SELECT * FROM `car_make` WHERE `id_car_type` = :tipo";
    $query_make = $connection->query($sql_make, [':tipo' => $key_type]);
    $res_make = $query_make->fetchAll();
    foreach ($res_make as $row){
      $Key_make = $row->id_car_make;
      $Make_value = $row->name;

      $dropdown_make[$Key_make] = $Make_value;
    }

  return $dropdown_make;
}

function car2db_annuncio_make_ajax_callback(array &$form, FormStateInterface $form_state) {
  if ($selectedValue = $form_state->getValue('field_tipologia')) {
    $selectedValue = (int) $selectedValue[0]['value'] ? (int) $selectedValue[0]['value'] : 0;
    $options_marca = car2db_annuncio_make_dropdown_options($selectedValue);
    $form['field_marca']['widget']['#options'] = $options_marca;
  }
  return $form['field_marca'];
}

Теперь при нажатии кнопки «Сохранить» всегда появляется ошибка «Обнаружен неправильный выбор ....». Я также пытался загрузить опции в hook_form alter, но он всегда возвращает ошибку. Где я не прав?

1 Ответ

0 голосов
/ 13 марта 2020

Я помню, как это чертовски запутало меня в тот день, когда я впервые начал играть с ajax формами в Drupal.
Надеюсь, я правильно это запомнил.
По сути, вы должны переместить свою логику c для добавления параметров Dynami c в функцию построения формы (но в вашем случае это функция alter).
Когда вызывается функция ajax, форма все еще перестраивается, и ваша функция alter Вызван (и имеет текущее состояние формы).
Ваша ajax функция просто вернет новый элемент формы.
Пример ниже (не проверено)

function car2db_annuncio_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'node_annuncio_form') {
    $options_type = car2db_annuncio_type_dropdown_options();
    $form['field_marca']['#prefix'] = '<div id="field_marca">';
    $form['field_marca']['#suffix'] = '</div>';
    $form['field_tipologia']['widget']['#options'] = $options_type;
    $form['field_tipologia']['widget']['#ajax'] = array(
      'event' => 'change',
      'callback' => 'car2db_annuncio_make_ajax_callback',
      'wrapper' => 'field_marca',
      'disable-refocus' => FALSE,
      'progress' => [
        'type' => 'throbber',
        'message' => t('Verify...'),
      ]
    );
    // Check selected value here.
    if ($selectedValue = $form_state->getValue('field_tipologia')) {
      $selectedValue = (int) $selectedValue[0]['value'] ? (int) $selectedValue[0]['value'] : 0;
      $options_marca = car2db_annuncio_make_dropdown_options($selectedValue);
      $form['field_marca']['widget']['#options'] = $options_marca;
    }
  }
}

function car2db_annuncio_type_dropdown_options() {
  $connection = Database::getConnection('default', 'migrate');

  $dropdown_type = ['none' => '- Seleziona - '];
  $sql_type = "SELECT * FROM `car_type`";
  $query_type = $connection->query($sql_type);
  $res_type = $query_type->fetchAll();
  foreach ($res_type as $row){
    $key = $row->id_car_type;
    $value = $row->name;

    $dropdown_type[$key] = $value;
  }
  return $dropdown_type;
}

function car2db_annuncio_make_dropdown_options($key_type) {
  $connection = Database::getConnection('default', 'migrate');

  $dropdown_make = ['none' => '- Seleziona - '];
    $sql_make = "SELECT * FROM `car_make` WHERE `id_car_type` = :tipo";
    $query_make = $connection->query($sql_make, [':tipo' => $key_type]);
    $res_make = $query_make->fetchAll();
    foreach ($res_make as $row){
      $Key_make = $row->id_car_make;
      $Make_value = $row->name;

      $dropdown_make[$Key_make] = $Make_value;
    }

  return $dropdown_make;
}

function car2db_annuncio_make_ajax_callback(array &$form, FormStateInterface $form_state) {
  // Just return the form element (that has been rebuilt in the form_alter)
  return $form['field_marca'];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...