saiba se você está reconstruindo o formulário inteiro ou apenas parte dele e agrupe o formulário de acordo com o elemento div que possui o atributo ID que você usará na definição #ajax no elemento acionador como 'wrapper'. Use os atributos #prefix e #suffix para isso ( $form['#prefix'] = '<div id="myform-ajax-wrapper">'; $form['#suffix'] = '</div>';
). Lembre-se também de que, se você tiver um modelo personalizado para o seu formulário NÃO renderizar o prefixo e o sufixo nesse caso ( {{ form|without('#prefix', '#suffix') }}
), eles serão renderizados duas vezes - pelo seu modelo e também pelo wrapper do tema do formulário. Você não pode impedir isso definindo #theme_wrappers como matriz vazia, pois o modelo de formulário contém o elemento html real do formulário.
no manipulador de envio do ajax, retorne todo o formulário ou parte dele que você agrupou e deseja reconstruir ( return $form
ou return $form['myelement']
). Além disso, você pode usar comandos ajax em vez de apenas retornar a estrutura do formulário, mas isso é algo mais avançado.
armazene todos os valores no armazenamento do estado do formulário até você enviar o formulário. Faça isso no manipulador de envio ( $form_state->set('somevalue', $form_state->getValue('somevalue'))
) e sempre ligue $form_state->setRebuild()
se você não estiver fazendo o envio final do formulário. Prefiro ter manipuladores de envio personalizados, mas ter mais lógica no manipulador de envio primário também é totalmente aceitável.
sempre use o #name
atributo no botão que está enviando e, se você tiver apenas um único manipulador de envio de formulário, use $for_state->getTriggeringElement()['#name']
para detectar qual elemento enviou o formulário.
se você estiver usando 'trigger_as' na definição de #ajax, caso deseje enviar o formulário com o elemento select, por exemplo, sempre use a mesma definição de #ajax usada no botão. Na minha experiência, é necessário - embora não esteja indicado na documentação.
#limit_validation_errors
Às vezes, usar pode ser muito complicado e descobrir por que o formulário não está funcionando pode demorar um pouco, portanto, use-o com cuidado (isso é bom para isolar erros de formulário apenas no (s) elemento (s) que você está realmente reconstruindo para que seu código não influencia outras partes do formulário).
sempre use botões para enviar o formulário e, se quiser ter algo sofisticado, como selecionar ser o elemento acionador, use a opção 'trigger_as' da configuração #ajax e oculte o botão real com a classe 'js-hide' para obter uma boa interface do usuário.
na definição do formulário, obtenha os valores padrão do armazenamento do estado do formulário, se existirem, ou atribua-os ao armazenamento, se não existirem. Caso contrário, o formulário não funcionará corretamente.
não use $ this ou qualquer outra coisa à qual você não tenha acesso externamente; caso contrário, isso quebrará o ajax. sempre use manipuladores estáticos de ajax.
quando finalmente enviar o formulário, dependendo do fato de você (não) ter um manipulador de envio de formulário personalizado para o ajax, desative a reconstrução do formulário chamando $form_state->setRebuild(FALSE)
.
você pode usar as chamadas de taquigrafia :: no elemento de envio do ajax ( $element['#ajax']['callback'] = '::ajaxFormRebuild';
e $element['#submit'] = [['::ajaxFormSubmitHandler'];
).
o retorno de chamada do ajax serve apenas para retornar o formulário reconstruído ou os comandos do ajax. Nunca retorne formulário alterado (ou seja, não altere a matriz do formulário nesse retorno de chamada).