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?
<input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
formularz był w stanie poprawnie przesłać.Odpowiedzi:
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.
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
.źródło
mymod_main()
.Błąd oznacza, że
form_token
potrzeby 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 :Jeśli chodzi o obejście polegające na wymuszeniu regeneracji tokena formularza w form_alter, sprawdź następujący przykład:
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 :
Sprawdź, czy błąd występuje w twoim formularzu, tak jak w innym formularzu (np. Formularz w formularzu).
drupal_valid_token()
.źródło