Błąd „Formularz stał się nieaktualny”

12

Mam wieloetapową formę węzła. W połowie formularza poprzez wyskakujące okienko dialogowe użytkownik jest proszony o zalogowanie się, jeśli nie zalogował się wcześniej.

Po pomyślnym zalogowaniu podczas przechodzenia do następnej strony formularza węzła pojawia się błąd sprawdzania poprawności:

Formularz stał się nieaktualny. Skopiuj wszelkie niezapisane prace w poniższym formularzu, a następnie załaduj ponownie tę stronę.

Rozumiem, że to dlatego, że drupal_validation_form()weryfikuje $form['#token']i $form_state['values']['form_token']są takie same.

Jak tego uniknąć, ponieważ jest to specjalny przypadek użycia (i nie jest to fałszerstwo przez niektóre elementy zewnętrzne).

Jakiś wkład na tym froncie?

zadanie
źródło
1
Może jest już za późno na odpowiedź, ale zachęciłem do tego samego problemu. Znalazłem problem z $ form ["# token"] = drupal_get_token ($ form ['# form_id']); kiedy przygotowuję formularz $.
1
Właściwie kodowałem formularz na stronie i musiałem dodać token. Dodając <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>formularz był w stanie poprawnie przesłać.
trzecient

Odpowiedzi:

2

Twój post właśnie uratował mnie przed poważną nędzą. Nie bardzo wiem, jak to połączenie zostało nawiązane, ale twój post doprowadził mnie do niewielkiej zmiany w kodzie modułu. Łatwo zrozumieć, dlaczego pojawił się błąd „Formularz stał się nieaktualny”. Sprawdź, czy to może pobudzić twoje myśli i pomóc w twojej sprawie.

Mój administrator / strona mymod skonfigurowała pozycję menu obejmującą następujące elementy.

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

W mymod_main($op = '')warunkowo buduję jedną z 2 form, ale każda kompilacja jest oczywiście nową formą, np . $build['mymod_admin'] = drupal_get_form('mymod_admin')Lub $build['mymod_delete'] = drupal_get_form('mymod_delete').

Nie ma problemu, gdy strona admin / mymod została załadowana po raz pierwszy i wywołano mymod_admin. Ale kiedy kliknięty zostanie przycisk wysyłania utworzony w mymod_admin, wywoływany jest mymod_delete i tworzona jest jego forma. Pojawia się błąd „Formularz stał się nieaktualny”, który zrujnował przetwarzanie formularza. Poprawka polega na użyciu mymod_main()jako wywołania zwrotnego strony.

Teraz nie ma krzyżowania formularzy, gdy strona admin / mymod ładuje się ponownie dla każdego formularza, ponieważ nie ma formularza początkowego z wywołania zwrotnego manu, a następnie drugiego formularza zdefiniowanego w $build.

Randy Skretka
źródło
Czy możesz wyjaśnić swoją „poprawkę”, myślę, że mam ten sam problem, ale nie rozumiem, co masz na myśli przez „---” i „+++”, dziękuję
iain maitland
Oznacza to, że wywołanie zwrotne strony zostało zmienione na mymod_main().
kiamlaluno
0

Błąd oznacza, że form_tokenpotrzeby są nieprawidłowe i należy je zregenerować. Jest to w zasadzie ukryte pole formularza (zwykle używane do ochrony przed fałszywymi witrynami).

Zwykle element tokena jest automatycznie dodawany do każdej formy Drupala drupal_prepare_form(), więc na ogół nie musisz go dodawać samodzielnie, chyba że piszesz własny kod.

Jeśli próbujesz zaprogramować formularz wielostronicowy, prawdopodobnie musisz ponownie wygenerować token przy każdym przesłaniu drupal_get_token(), np. Jak pokazano tutaj :

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

Jeśli chodzi o obejście polegające na wymuszeniu regeneracji tokena formularza w form_alter, sprawdź następujący przykład:

/**
 * 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'),
      );
    }
}

Rozwiązywanie problemów

  • Sprawdź dokładnie, czy Twój formularz nie jest zakodowany na stałe, w przeciwnym razie dodaj token zgodnie z sugestią @thirdender :

    <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
  • Sprawdź, czy błąd występuje w twoim formularzu, tak jak w innym formularzu (np. Formularz w formularzu).

  • Debug drupal_valid_token().
kenorb
źródło