У меня есть четыре поля ссылки на сущность пользователя в форме. Форма хоста - это форма редактирования узла. Три из них являются списками выбора, последний - Inline Entity Form .
После добавления пользовательского объекта через IEF я пытаюсь обновить значения списков выбора:
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);
}
Это работает, но когда я пытаюсь добавить другого пользователя через IEF, я получаю:
Обнаружен незаконный выбор. Пожалуйста свяжитесь с администратором сайта.
Related
вопросов, перечисленных здесь, чтобы решить эту проблему?Ответы:
--- Оригинальный ответ. Неправильно, проверьте обновление ниже.
Просто установите
На выбор, который будет обновлен с AJAX.
Оформить заказ "Незаконный выбор был обнаружен"
--- Обновление 17 декабря 2019 года ---
На самом деле это был не очень хороший совет, это было давно, теперь я знаю лучше.
Функция обратного вызова Ajax должна возвращать только часть измененной формы или некоторые команды ajax.
В этом случае необходимо изменить форму в функции формы или в хуке изменения формы. Функции построения и проверки форм выполняются каждый раз, когда вызывается обратный вызов ajax. Просто проверьте $ form_state в вашей сборке формы или измените функцию и измените значения соответствующим образом.
См. Устранение ошибки «Обнаружен незаконный выбор ...»
источник
Я сталкивался с этой проблемой несколько раз в Drupal 6, меняя значения списка выбора через Ajax.
Вот что вы можете сделать, это
array_merge
Если первое решение работает для вас, вы сэкономите много времени на программировании и тестировании. НО, если список в раскрывающемся списке является динамическим, и вы не можете его контролировать, возможно, вам придется использовать второе решение.
Пишите, если у вас возникнут какие-либо проблемы, я проделал довольно много работы над этой проблемой для своего проекта, и я сделал для ~ 50 форм, PHEW !!! :)
источник
Я нашел лучший способ обойти это, чтобы установить
#value
в списке выбора.Если у нас есть значение в formtate и оно есть в наших параметрах, мы не получим ошибку. Если наше значение отсутствует в параметрах, выберите первый вариант в наших параметрах и используйте его.
источник
Мое решение:
источник
В ваш обратный вызов ajax добавьте:
В качестве меры безопасности основная
_form_validate()
функция проверяет, изменился ли ключ элемента #options по сравнению с тем, что было установлено в исходной сборке (которая у них есть). Позвонивdrupal_get_messages()
иform_get_errors()
мы в основном сказать Drupal , чтобы игнорировать любые ошибки / сообщения во время работы нашего AJAX запроса. :)источник