Eu tenho um formulário de nó de várias etapas. No meio do formulário, por meio de uma caixa de diálogo pop-up, é solicitado que o usuário efetue login, se ainda não tiver efetuado login.
Após o login bem-sucedido ao prosseguir com a próxima página do formulário do nó, recebo este erro de validação:
O formulário ficou desatualizado. Copie qualquer trabalho não salvo no formulário abaixo e recarregue esta página.
Eu entendo que é porque drupal_validation_form()
verifica $form['#token']
e $form_state['values']['form_token']
é o mesmo.
Como evito isso, pois esse é um caso de uso especial (e não é falsificação por alguns materiais externos).
Alguma entrada nessa frente?
<input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
o formulário foi possível enviar corretamente.Respostas:
Sua postagem me salvou de uma grave miséria. Não sei bem como essa conexão foi feita, mas sua postagem me levou a uma pequena alteração no código do meu módulo. É fácil entender por que o erro "O formulário ficou desatualizado" estava ocorrendo agora. Portanto, veja se isso pode estimular seus pensamentos e ajudar no seu caso.
Minha página admin / mymod tinha um item de menu configurado que incluía o seguinte.
Em
mymod_main($op = '')
Estou condicionalmente construindo uma das 2 formas, mas cada construção é, naturalmente, uma nova forma, por exemplo,$build['mymod_admin'] = drupal_get_form('mymod_admin')
ou$build['mymod_delete'] = drupal_get_form('mymod_delete')
.Não há problema quando a página admin / mymod é carregada pela primeira vez e mymod_admin é chamado. Mas quando o botão de envio criado em mymod_admin é clicado, mymod_delete é chamado e cria seu formulário. Chega o erro "O formulário está desatualizado" que arruinou o processamento do formulário. A correção é simplesmente usar
mymod_main()
como retorno de chamada da página.Agora não há cruzamento de formulários quando a página admin / mymod é recarregada para cada um dos formulários, pois não há um formulário inicial a partir do retorno de chamada do manu e, em seguida, o segundo formulário definido em
$build
.fonte
mymod_main()
.O erro significa que as
form_token
necessidades são inválidas e precisam ser regeneradas. Este é basicamente um campo de formulário oculto (geralmente usado para proteger contra falsificações entre sites).Normalmente, um elemento token é automaticamente adicionado a cada formulário Drupal
drupal_prepare_form()
, para que você geralmente não precise adicionar um, a menos que esteja escrevendo seu próprio código.Se você estiver tentando programar algum formulário de várias páginas, provavelmente precisará gerar novamente o token em cada envio usando
drupal_get_token()
, por exemplo, como mostrado aqui :Quanto à solução alternativa para forçar a regeneração do token de formulário em form_alter, verifique o seguinte exemplo:
Solução de problemas
Verifique se o seu formulário não está codificado, caso contrário, adicione o token conforme sugerido por @thirdender :
Verifique se o erro ocorre no seu formulário, como poderia em outro formulário (por exemplo, formulário dentro do formulário).
drupal_valid_token()
.fonte