Místo vykonání callbacků formuláře dostanu 303
- Bulldog
- Člen | 110
Ahoj, jsem docela v pasti.
Tvořil jsem aplikaci a když přišlo na první formulář, tak začal docela
problém. Místo vykonávání callbacků formuláře mě totiž Nette po
odeslání formuláře rovnou přesměruje na stejnou stránku
s 303 kódem.
Tak jsem si osekal aplikaci na totální minimum, kdy mám vlastně jen
presenter a v něm toto:
public function createComponentMyForm(): Nette\Application\UI\Form
{
$form = new Nette\Application\UI\Form();
$form->addEmail('email', 'mail');
$form->onValidate[] = function () {
bdump('ve validate');
};
$form->onSuccess[] = function () {
bdump('v success');
};
$form->addSubmit('submit', 'submit');
return $form;
}
Šablona:
{block content}
{control myForm}
A to je všechno.
I tak, ale když kliknu na tlačítko odeslat, tak místo vykonání
onSuccess
, nebo onValidate
mě Nette automaticky
přesměruje na stejnou stránku s HTTP kódem 303.
Co dělám špatně?
PHP 8.1, Nette nainstalováno jako čistá instalace přes
composer create-project nette/web-project nette-blog
, takže
závislosti jsou stejné jako v čisté instalaci a konkrétní verze
Nette/Forms je 3.1.7
EDIT
ještě doplním, co Nette posílá v post datech po odeslání prázdného
formuláře na server:
[
'email' => '',
'_submit' => 'submit',
'_do' => 'myForm-submit',
]
a ano opravdu se to posílá POSTem.
A BTW neprovede se ani validace prvků, takže když zadám neplatný mail, tak se to stejně přesměruje, takže přesměrování se vykoná ještě dřív, než se začne validovat, ale formulář se vytvoří.
EDIT 2
už aspoň vím, kde je chyba. Nette mi nenastavuje cookie _nss
bohužel nemám tušení proč…
Editoval Bulldog (11. 9. 2022 12:30)
- Bulldog
- Člen | 110
@netteman
Díky za upozornění na chybu v otázce. Už opraveno. V kódu to mám
samozřejmě jednotně. Kdyby ne dostal bych error 500 a formulář by se ani
nevykreslil.
Můj problém je, že se nenastavuje cookie _nss a tedy se
formulář v klidu vykreslí, ale po odeslání to Nette vyhodnotí jako CSRF a
tedy místo vykonání formuláře se provede redirect 303
- Bulldog
- Člen | 110
Ještě je asi nutné doplnit, že jsem zkusil do formuláře přidat
$form->allowCrossOrigin();
a stejně to neprojde a dojde
k přesměrování s http kódem 303, což nechápu proč, jelikož to pořád
neprojde přes to, že není nastaveno _nss.
U jiných aplikací ale vše funguje normálně.. :D
Editoval Bulldog (11. 9. 2022 12:50)
- wardmaster
- Člen | 1
@Bulldog Narazil jsem na úplně stejnou chybu, objevila se poté co jsem si začal hrát s HTTPS. Příčina byla v tom, že když jsem jednou otevřel aplikaci v HTTPS, nastavila se _nss cookie a to jako secure (tj. funguje pouze přes HTTPS). Od té doby můžu k appce přistoupit jen přes HTTPS. Přes HTTP to dělá výše popsané chování s kódem 303.
Navíc se ani nemusím připojit přesně k téhle aplikaci, stačí jednou otevřít danou URL přes HTTPS a pokud na serveru jakákoli appka odpoví a nastaví mi cookie, je problém na světě.