Mam cztery pola odniesienia encji do encji użytkownika w formularzu. Formularz hosta to formularz edycji węzła. Trzy z nich to wybrane listy, ostatnia to formularz podmiotu wbudowanego .
Po dodaniu encji użytkownika za pośrednictwem IEF próbuję zaktualizować wartości wybranych list:
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);
}
Działa, ale kiedy próbuję dodać innego użytkownika za pośrednictwem IEF, otrzymuję:
Wykryto nielegalny wybór. Proszę skontaktować się z administratorem serwisu.
Related
pytań tutaj wymienionych po prawej stronie rozwiązało to?Odpowiedzi:
--- Oryginalna odpowiedź. Jest źle, sprawdź aktualizację poniżej.
Właśnie ustawiłem
Na wybranych, które będą aktualizowane za pomocą AJAX.
Kasa „Wykryto nielegalny wybór”
--- Aktualizacja 17 grudnia 2019 ---
Właściwie to nie była dobra rada, dawno temu, teraz wiem lepiej.
Funkcja wywołania zwrotnego Ajax ma zwracać tylko zmieniony formularz lub niektóre komendy ajax.
W takim przypadku należy zmodyfikować formularz w funkcji formularza lub haka do zmiany formularza. Funkcje budowania formularzy i sprawdzania poprawności są uruchamiane za każdym razem, gdy wywoływane jest wywołanie zwrotne ajax. Po prostu sprawdź $ form_state w funkcji budowania lub zmieniania formularzy i odpowiednio dostosuj wartości.
Zobacz Rozwiązywanie błędu „Wykryto nielegalny wybór ...”
źródło
Wiele razy napotykałem ten problem w Drupal 6, zmieniając wartości listy Select przez Ajax.
Oto, co możesz zrobić
array_merge
Jeśli pierwsze rozwiązanie zadziała, zaoszczędzisz dużo czasu na kodowaniu i testowaniu. ALE jeśli lista rozwijana jest dynamiczna i nie masz nad nią kontroli, być może będziesz musiał wybrać drugie rozwiązanie.
Napisz, jeśli napotkasz jakiekolwiek problemy, wykonałem sporo pracy nad tym problemem, w moim projekcie i wykonałem ~ 50 formularzy, PHEW !!! :)
źródło
Znalazłem najlepszy sposób, aby to ustawić
#value
na liście wyboru.Jeśli mamy wartość w formstate i jest ona w naszych opcjach, nie otrzymamy błędu. Jeśli naszej wartości nie ma w opcjach, wybierz pierwszą opcję w naszych opcjach i skorzystaj z niej.
źródło
Moje rozwiązanie:
źródło
W wywołaniu zwrotnym ajax dodaj:
Ze względów bezpieczeństwa
_form_validate()
funkcja podstawowa sprawdza, czy klucz #options elementu zmienił się w stosunku do tego, co ustawiono w oryginalnej kompilacji (którą mają). Dzwoniącdrupal_get_messages()
i poform_get_errors()
prostu mówimy Drupalowi, aby ignorował wszelkie błędy / komunikaty podczas uruchamiania naszego żądania ajax. :)źródło