Místo vykonání callbacků formuláře dostanu 303

Bulldog
Člen | 110
+
0
-

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)

netteman
Člen | 122
+
0
-

Pokud bude v presenteru
public function createComponentMyForm()

v šabloně potřebuješ
{control myForm}

Bulldog
Člen | 110
+
0
-

@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
+
0
-

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
+
0
-

@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ě.