Eu tenho quatro campos de referência de entidade para entidade de usuário em um formulário. O formulário do host é o formulário de edição do nó. Três deles são listas de seleção; o último é o formulário de entidade embutida .
Depois de adicionar uma entidade de usuário via IEF, estou tentando atualizar os valores das listas de seleção:
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);
}
Funciona, mas quando tento adicionar outro usuário via IEF, estou recebendo:
Uma escolha ilegal foi detectada. Entre em contato com o administrador do site.
Related
perguntas aqui listadas à direita resolveu isso?Respostas:
--- Resposta original. Está errado, verifique a atualização abaixo.
Basta definir
Na seleção que será atualizada com o AJAX.
Caixa "A escolha ilegal foi detectada"
--- Atualização 17 dez 2019 ---
Na verdade, esse não foi um bom conselho, isso foi há muito tempo, agora eu sei melhor.
A função de retorno de chamada do Ajax deve retornar apenas o pedaço de formulário que foi alterado ou alguns comandos do ajax.
Nesse caso, a modificação do formulário deve ser feita na função de formulário ou em um gancho de alteração de formulário. As funções de criação e validação de formulário são executadas sempre que um retorno de chamada ajax é chamado. Basta verificar $ form_state na criação de seu formulário ou alterar a função e ajustar os valores de acordo.
Consulte Resolver o erro "Foi detectada uma escolha ilegal ..."
fonte
Já enfrentei esse problema várias vezes no Drupal 6, alterando os valores da lista de seleção via Ajax.
Aqui está o que você pode fazer é
array_merge
Se a primeira solução funcionar para você, você economizará muito tempo codificando e testando as coisas. MAS, se a lista suspensa for dinâmica e você não tiver controle sobre ela, talvez seja necessário usar a segunda solução.
Poste se você enfrentar algum problema, eu trabalhei bastante nesse problema, no meu projeto, e fiz em ~ 50 formulários, PHEW !!! :)
fonte
Eu encontrei a melhor maneira de contornar isso é definir
#value
na lista de seleção.Se tivermos o valor no formstate e estiver em nossas opções, não receberemos um erro. Se nosso valor não estiver nas opções, selecione a primeira opção em nossas opções e use-a.
fonte
Minha solução:
fonte
No seu retorno de chamada ajax, adicione:
Como medida de precaução, a
_form_validate()
função principal verifica se a chave #options de um elemento foi alterada em relação ao que foi definido na compilação original (que possui). Ligandodrupal_get_messages()
eform_get_errors()
basicamente dizemos ao Drupal para ignorar quaisquer erros / mensagens enquanto executa nossa solicitação ajax. :)fonte