Authenticator a zjištění ajaxového volání
- besir
- Člen | 170
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
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.
- besir
- Člen | 170
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
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
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!