Authenticator a zjištění ajaxového volání

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
besir
Člen | 170
+
0
-

Ahoj,
tusil by nekdo, jak se da v authenticatoru zjsitit, jestli dotaz prisel ajaxove, nebo normalne? Jde mi o to, zebych v pripade volani ajaxem potreboval pri spatnych udajich vratit do prohlizece json ktery si uz pak prevezme JS.

zkousel jsem klasicke $this->isAjax(), ale do onzole mi to vrati chybu 500 a to bez jakekoli vyjimky. Takze ani netusim na cem to skape.

Diky za napady.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Kde jsi zkoušel $this->isAjax()? Jestli v instanci autentikátoru, proč by měl takovou metodu mít?

Pokud provádíš přihlašování, určitě musíš někde v presenteru volat $this->user->login(..., ...);, tak z toho volání odchytávej výjimky a v případě chyby se v presenteru můžeš na $this->isAjax() zeptat zcela standardně a stejně tak i odeslat JSON.

Majkl578
Moderator | 1364
+
0
-

To je špatné řešení. Authenticator by měl být na tomhle nezávislý (tj. vždy při chybě házet příslušnou exception). To, o co se snažíš, bys měl řešit na úrovni presenteru – chytit výjimku a dle podmínky (je/není AJAX) zpracovat a odeslat na výstup.

besir
Člen | 170
+
0
-

To jsem zkoušel jako první, ale to prostě mnou „narizeny“ response ignoruje.

public function signInFormSubmitted($form)
    {
        try {
                $values = $form->getValues();
                if ($values->remember) {
                        $this->getUser()->setExpiration('+ 14 days', FALSE);
                } else {
                        $this->getUser()->setExpiration('+ 20 minutes', TRUE);
                }
                if($this->getUser()->login($values->username, $values->password))
                {
                    if($this->isAjax())
                    {
                        $this->sendResponse(new \Nette\Application\Responses\JsonResponse(array('foo' => 'bar')));
                    }
                    else
                    {
                        die('neni ajax');
                    }
                }
                else
                {
                    if($this->isAjax())
                    {
                    $this->sendResponse(new \Nette\Application\Responses\JsonResponse(array('foo' => 'barbar')));
                    }
                    else
                    {
                        die('neni ajax bad cred');
                    }
                }


        } catch (NS\AuthenticationException $e) {
                $form->addError($e->getMessage());
        }
    }

Jenze pri kdyz zadam udaje spravne tak me to refreshne, coz je ready, ale pokud jsou spatne tak mi to nevrati json, ale prihlasovaci stranku…

Editoval besir (24. 8. 2012 13:09)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Když catchneš autentifikační výjimku, tak akorát přidáš error k formuláři, viz poslední řádky tvého kódu. Musíš obalit pouze volání $this->user->login – jeho návratová hodnota je irelevantní. Případně přidej rozdvojku if ($this->isAjax()) do toho bloku catch.

besir
Člen | 170
+
0
-

No tak ten catch mi vubec nedotekl :D

Takze vysledek:

public function signInFormSubmitted($form)
    {
        try {
                $values = $form->getValues();
                if ($values->remember) {
                        $this->getUser()->setExpiration('+ 14 days', FALSE);
                } else {
                        $this->getUser()->setExpiration('+ 20 minutes', TRUE);
                }
                $this->getUser()->login($values->username, $values->password);
                $this->redirect('Dashboard:');


        } catch (NS\AuthenticationException $e) {
                if($this->isAjax())
                {
                    $this->sendResponse(new \Nette\Application\Responses\JsonResponse(array('err' => 'InvalidCredentials')));
                }
                else
                {
                    $form->addError($e->getMessage());
                }
        }
    }

Vojtěchu díky!