Điểm:-1

Tại sao tôi nhận được "Lựa chọn không hợp lệ đã được xác định." từ biểu mẫu mà mã của tôi tạo ra?

lá cờ ng

Tôi đang sử dụng đoạn mã sau cho biểu mẫu.

chức năng công khai buildForm(mảng $form, FormStateInterface $form_state) {
  $region_options = tĩnh::getFirstDropdownOptions();
  $form['vvv_region'] = [
    '#type' => 'chọn',
    '#title' => $this->t('trường chọn vùng'),
    '#options' => $region_options,
    '#empty_option' => t('- Chọn khu vực -'),
    '#ajax' => [
      'gọi lại' => '::myAjaxCallback',
      'vô hiệu hóa lấy nét lại' => SAI,
      'sự kiện' => 'thay đổi',
      'trình bao bọc' => 'đầu ra chỉnh sửa',
      'tiến bộ' => [
        'gõ' => 'đập',
        'tin nhắn' => $this->t('Đang xác minh mục nhập...'),
      ],
    ]
  ];
    
  $region_sered = $form_state->getValue('vvv_region');
  $city_options = static::getSecondDropdownOptions($region_selected);
    
  $form['đầu ra'] = [
    '#type' => 'chọn',
    '#title' => $this->t('trường chọn thành phố'),
    '#options' => $city_options,     
    '#prefix' => '<div id="edit-output">',
    '#suffix' => '</div>',
    '#empty_option' => t('- Chọn thành phố -'),
    '#default_value' => '',
    '#ajax' => [
      'gọi lại' => '::cityAjaxCallback',
      'vô hiệu hóa lấy nét lại' => SAI,
      'sự kiện' => 'thay đổi',
      'trình bao bọc' => 'thành phố chỉnh sửa',
      'tiến bộ' => [
        'gõ' => 'đập',
        'tin nhắn' => $this->t('Đang xác minh mục nhập...'),
      ],
    ]
  ];
    
  $city_select = $form_state->getValue('đầu ra');
  $suburb_options = static::getSuburbDropdownOptions($city_select);
        
  $form['sur'] = [
    '#type' => 'chọn',
    '#options' => $suburb_options,     
    '#prefix' => '<div id="edit-city">',
    '#suffix' => '</div>',
    '#empty_option' => t('- Chọn suurb -'),
    '#default_value' => mảng(''),
  ];
  trả về biểu mẫu $;
}

hàm công khai myAjaxCallback(mảng &$form, FormStateInterface $form_state) {
  $region_sered = $form_state->getValue('vvv_region');
  $city_options = static::getSecondDropdownOptions($region_selected);

  nếu ($form_state->getErrors()) {
    \Drupal::messenger()->addError($region_sered);
    $form_state->setRebuild();
  }
  
  $form['outpout']['#options'] = $city_options;
          
  trả về $form['đầu ra']; 
}
    
chức năng công cộng cityAjaxCallback(mảng &$form, FormStateInterface $form_state) {
  $city_select = $form_state->getValue('đầu ra');
  $sur_data = static::getSuburbDropdownOptions($city_select);

  nếu ($form_state->getErrors()) {
    \Drupal::messenger()->addError($city_select);
    $form_state->setRebuild();
  }

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

  trả về $form['sur']; 
}

Khi biểu mẫu được gửi, tôi gặp lỗi sau.

Một lựa chọn không hợp lệ đã được xác định. Vui lòng liên hệ với quản lý.

Có gì sai với mã tôi đang sử dụng?

Jaypan avatar
lá cờ de
Bạn không thể thay đổi giá trị của các tùy chọn trong lệnh gọi lại ajax. Nó phải được thực hiện trong định nghĩa biểu mẫu. Bạn có thể đọc một ví dụ về cách thực hiện điều đó trong hướng dẫn này mà tôi đã viết: https://www.jaypan.com/tutorial/drupal-form-api-ajax-form-and-results-same-page
apaderno avatar
lá cờ us
Có lỗi đánh máy trong lần gọi lại đầu tiên: `$form['outpout']['#options'] = $city_options;`. Nó phải là *đầu ra*, không phải *đầu ra*.
Điểm:2
lá cờ us

Có hai lỗi trong mã được hiển thị trong câu hỏi.

Chỉ trình tạo biểu mẫu mới có thể thêm các tùy chọn để tạo thành phần tử. Khác biệt, bạn sẽ nhận được lỗi mà bạn đã trích dẫn.

Một lựa chọn không hợp lệ đã được xác định. Vui lòng liên hệ với quản lý.

Những gì cuộc gọi lại AJAX thực hiện chỉ đơn giản là trả về phần tử biểu mẫu cần được thay đổi. Trong trường hợp của bạn, mã là mã sau đây.

hàm công khai myAjaxCallback(mảng &$form, FormStateInterface $form_state) {
  trả về $form['đầu ra']; 
}
    
chức năng công cộng cityAjaxCallback(mảng &$form, FormStateInterface $form_state) {
  trả về $form['sur']; 
}

Một cuộc gọi lại AJAX cho một biểu mẫu thường không xử lý các lỗi xác thực.

Lỗi thứ hai là trong trình tạo biểu mẫu, sử dụng đoạn mã sau.

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

Khi biểu mẫu được tạo lần đầu tiên, $form_state->getValue('vvv_region') không trả lại bất kỳ giá trị nào vì biểu mẫu chưa được gửi, ngay cả thông qua AJAX. Chỉ khi biểu mẫu được gửi qua AJAX thì $form_state->getValue('vvv_region') trả về một giá trị. Dòng đó cần được thay đổi như sau.

$region_sered = $form_state->hasValue('vvv_region') ? $form_state->getValue('vvv_region') : key($region_options);

Tương tự, $city_select = $form_state->getValue('đầu ra'); cần phải được thay đổi.

$city_select = $form_state->hasValue('output') ? $form_state->getValue('đầu ra'): key($city_options);

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.