“检测到非法选择…”错误,动态下拉选择列表I Drupal8

问题描述 投票:0回答:1

我为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中,但是它总是返回错误。我在哪里错了?

ajax callback drupal-8
1个回答
0
投票

我记得当我第一次开始在Drupal中使用Ajax形式的日子时,这让我感到困惑。希望我能正确记住这一点。基本上,您必须移动将动态选项添加到表单构建函数中的逻辑(但在您的情况下,这是alter函数)。调用ajax函数时,仍然会重建表单,并调用您的alter函数(并具有当前的form_state)。您的ajax函数将仅返回新的form元素。(unested)

下面的内容
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'];
}
© www.soinside.com 2019 - 2024. All rights reserved.