Obtendo o erro "O formulário está desatualizado"


12

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?


1
Talvez seja tarde demais para responder, mas eu encorajei o mesmo problema. Eu encontrei um problema com $ form ["# token"] = drupal_get_token ($ form ['# form_id']); quando eu preparo meu formulário $.

1
Na verdade, eu estava codificando um formulário em uma página e precisava adicionar o token. Ao adicionar <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>o formulário foi possível enviar corretamente.
Terceira-

Respostas:


2

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.

'page callback' => 'drupal_get_form', 
'page arguments' => 'mymod_main',

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.


Você pode explicar sua 'correção', eu acho que eu tenho o mesmo problema, mas eu não entendo o que você quer dizer com '---' e '+++', obrigado
iain maitland

Isso significa que o retorno de chamada da página foi alterado para ser mymod_main().
kiamlaluno

0

O erro significa que as form_tokennecessidades 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 :

$form_state['input']['form_token'] = drupal_get_token($form['#token']);

Quanto à solução alternativa para forçar a regeneração do token de formulário em form_alter, verifique o seguinte exemplo:

/**
 * Implements hook_form_alter().
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
    if ($form_id === 'your_form_entityform_edit_form' && !empty($form_state['input']['form_id'])) {
      $form_id = $form_state['input']['form_id'];
      $form ['#token'] = $form_id;
      $form ['form_token'] = array(
        '#id' => drupal_html_id('edit-' . $form_id . '-form-token'),
        '#type' => 'token',
        '#default_value' => drupal_get_token($form['#token']),
        '#parents' => array('form_token'),
      );
    }
}

Solução de problemas

  • Verifique se o seu formulário não está codificado, caso contrário, adicione o token conforme sugerido por @thirdender :

    <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
  • Verifique se o erro ocorre no seu formulário, como poderia em outro formulário (por exemplo, formulário dentro do formulário).

  • Depurar drupal_valid_token().
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.