Làm thế nào để tránh được Một sự lựa chọn bất hợp pháp đã được phát hiện ra khi cập nhật các giá trị danh sách chọn qua ajax?


10

Tôi có bốn trường tham chiếu thực thể cho thực thể người dùng trong một biểu mẫu. Hình thức lưu trữ là hình thức chỉnh sửa nút. Ba trong số đó là danh sách chọn lọc, cuối cùng là Mẫu Thực thể Nội tuyến .

Sau khi thêm một thực thể người dùng thông qua IEF, tôi đang cố gắng cập nhật các giá trị danh sách chọn:

function ebep_users_feature_users_list_ajax($form, $form_state) {

  $ief = array_shift($form_state['inline_entity_form']);
  $options = array('_node' => t('- None -'));
  $commands = array();

  foreach($ief['entities'] as $data) {
    $options[$data['entity']->uid] = $data['entity']->name;
  }

  foreach(_ebep_users_feature_getUserListFieldNames() as $fieldName) {
    $form[$fieldName]['und']['#options'] = $options;
    $commands[] = ajax_command_replace('#'.$fieldName.'_wrapper', drupal_render($form[$fieldName]));
  }

  return array('#type' => 'ajax', '#commands' => $commands);
}

Nó hoạt động, nhưng khi tôi cố gắng thêm người dùng khác qua IEF tôi sẽ nhận được:

Một sự lựa chọn bất hợp pháp đã bị phát hiện. Vui lòng liên hệ với quản lý.


Có bất kỳ Relatedcâu hỏi trên đây được liệt kê cho quyền giải quyết này?
Jimajamma

@Jimajamma có vẻ như trên ajax gọi lại hình thức xây dựng lại không hoạt động. Làm thế nào tôi có thể kích hoạt nó? $ form_state ['xây dựng lại]] = TRUE không làm gì cả ...
Codium

@Jimajamma vì vậy các giải pháp liên quan không hoạt động
Codium

Tôi đã trả lời câu hỏi của bạn ở đây vì nó là một câu hỏi trùng lặp drupal.stackexchange.com/questions/15989/...
Sina Salek

Câu trả lời:


15

--- Câu trả lời gốc. Là sai, kiểm tra cập nhật dưới đây.

Chỉ cần đặt

$bla['#validated'] = TRUE

Trên lựa chọn sẽ được cập nhật với AJAX.

Thanh toán "Lựa chọn bất hợp pháp đã được phát hiện"

--- Cập nhật ngày 17 tháng 12 năm 2019 ---

Thật ra đó không phải là lời khuyên tốt, đó là một thời gian dài trước đây, bây giờ tôi biết rõ hơn.

Hàm gọi lại Ajax được cho là chỉ trả về phần của biểu mẫu đã thay đổi hoặc một số lệnh ajax.

Trong trường hợp này, sửa đổi biểu mẫu phải được thực hiện trên hàm biểu mẫu hoặc một móc thay đổi biểu mẫu. Xây dựng biểu mẫu và các chức năng xác nhận được chạy mỗi khi gọi lại ajax. Chỉ cần kiểm tra $ form_state trên biểu mẫu xây dựng hoặc thay đổi chức năng và điều chỉnh các giá trị tương ứng.

Xem Giải quyết lỗi "Đã phát hiện lựa chọn bất hợp pháp ..."


1
Nếu tôi nhớ rõ tôi đã thử điều này, nhưng không thành công trong trường hợp của tôi, cảm ơn
Codium

1
Tôi sợ điều này cũng không hiệu quả với tôi.
kevin.coyle

Điều này không làm cho hình thức kém an toàn?
Binny

Vâng, tất cả các ý kiến ​​trước đó là đúng. Câu trả lời đã được cập nhật.
jaimealsilva

3

Tôi đã phải đối mặt với vấn đề này nhiều lần trong Drupal 6, thay đổi các giá trị của danh sách Chọn qua Ajax.

Đây là những gì bạn có thể làm là

  1. Nếu có thể, hãy thử chèn tất cả các giá trị có thể vào API trường, bạn cần chỉnh sửa trường đó và sau đó khi bạn thay đổi các giá trị, bạn sẽ phải đảm bảo rằng chỉ có các giá trị được liệt kê trong danh sách.
  2. Giải pháp mà tôi đã triển khai là, bạn có thể thay đổi loại trường từ Chọn danh sách thành trường văn bản, từ API trường và yêu cầu Drupal lưu giá trị như hiện tại. Bây giờ, trong thời gian chạy biểu mẫu, bạn sẽ phải thay đổi biểu mẫu, thay đổi loại để chọn danh sách và đẩy vào các tùy chọn mà bạn muốn. Trong khi gửi cũng vậy, bạn sẽ phải gán giá trị chính xác theo yêu cầu của trường, điều đó sẽ được lưu trong DB. Đảm bảo trình xử lý gửi của bạn được gọi trước trình xử lý biểu mẫu mặc định, để bạn có thể sử dụngarray_merge

Nếu giải pháp đầu tiên phù hợp với bạn, bạn sẽ tiết kiệm được rất nhiều thời gian mã hóa và thử nghiệm mọi thứ. NHƯNG nếu danh sách trong danh sách thả xuống là động và bạn không kiểm soát được nó, bạn có thể phải đi với giải pháp thứ hai.

Hãy đăng bài nếu bạn gặp phải bất kỳ vấn đề nào, tôi đã thực hiện khá nhiều công việc về vấn đề này, cho dự án của tôi và tôi đã làm cho ~ 50 mẫu, THỬ !!! :)


3

Tôi đã tìm ra cách tốt nhất để làm điều này là đặt #valuedanh sách chọn.

Nếu chúng tôi có giá trị trong formstate và nó nằm trong tùy chọn của chúng tôi thì chúng tôi sẽ không gặp lỗi. Nếu giá trị của chúng tôi không nằm trong các tùy chọn thì hãy chọn tùy chọn đầu tiên trong các tùy chọn của chúng tôi và sử dụng tùy chọn đó.

$form['example'] = array(
    '#type' => 'select',
    '#title' => t('Example'),
    '#options' => $options,
    '#value' => isset($form_state['values']['example']) && in_array($form_state['values']['example'],$options)?$form_state['values']['example']:key($options),
  );

2

Giải pháp của tôi:

/**
 * Implements hook_form_FORM_ID_alter()
 */
function ebep_users_feature_form_ebep_exhibitor_profile_node_form_alter(&$form, &$form_state, $form_id) {

  foreach(_ebep_users_feature_getUserListFieldNames() as $fieldName) {
    $form[$fieldName]['und']['#prefix'] = '<div id="'.$fieldName . '_wrapper">';
    $form[$fieldName]['und']['#suffix'] = '</div>';
    $form[$fieldName]['und']['#options'] = _ebep_users_feature_getOptionsValuesFromIEFList($form_state);
  }

  $form['#attached']['css'] = array(
    drupal_get_path('module', 'ebep_users_feature') . '/assets/styles.css',
  );

  $form['#attached']['js'] = array(
    drupal_get_path('module', 'ebep_users_feature') . '/assets/scripts.js',
  );

  $form['users_refresh'] = array(
    '#type' => 'submit',
    '#value' => t('Refresh users list'),
    '#ajax' => array(
      'callback' => 'ebep_users_feature_users_list_ajax',
    ),
  );
}

function ebep_users_feature_users_list_ajax($form, $form_state) {

  $commands = array();

  foreach(_ebep_users_feature_getUserListFieldNames() as $fieldName) {
    $form[$fieldName]['und']['#options'] = _ebep_users_feature_getOptionsValuesFromIEFList($form_state);
    $commands[] = ajax_command_replace('#'.$fieldName.'_wrapper', drupal_render($form[$fieldName]));
  }

  return array('#type' => 'ajax', '#commands' => $commands);
}

function _ebep_users_feature_getOptionsValuesFromIEFList($form_state) {
  static $options = array();

  if (empty($options)) {
    $ief = array_shift($form_state['inline_entity_form']);
    $options['_node'] = t('- None -');

    foreach($ief['entities'] as $data) {
      $options[$data['entity']->uid] = $data['entity']->name;
    }
  }

  return $options;
}

-1

Trong cuộc gọi lại ajax của bạn, thêm:

...

drupal_get_messages();
form_get_errors();

return array('#type' => 'ajax', '#commands' => $commands);

Để phòng ngừa bảo mật, _form_validate()chức năng cốt lõi sẽ kiểm tra xem khóa #options của một phần tử có thay đổi so với những gì được đặt trong bản dựng gốc (mà chúng có) không. Bằng cách gọi drupal_get_messages()form_get_errors()về cơ bản, chúng tôi sẽ nói với Drupal bỏ qua mọi lỗi / tin nhắn trong khi chạy yêu cầu ajax của chúng tôi. :)


Thông báo lỗi không còn nhưng phần tử chọn vẫn chứa lớp lỗi. Làm thế nào để loại bỏ hoặc ngăn chặn điều đó?
Tejas Vaidya

Đây là tương đương với Drupal khi dán băng dính trên đèn cảnh báo trên bảng điều khiển của xe bạn.
Frank Robert Anderson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.