Diskuze: Nette\Security\AuthenticationException() výjimka a url odkaz
Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Proč to psát do zprávy vyjímky? Navíc, je to runtime vyjímka a chyba už je poznat z názvu vyjímky, takže tam nepotřebuješ psát žádnou zprávu. Tu vyjímku si odchyť a zprávu napiš do Flash Message
Jinak ten text s odkazem do flash message dostanes tak, ze si vytvoris Html element a ten pak jenom predas ty flash message. Neco na zpusob:
try {
// tady se neco provede
} catch (Nette\Security\AuthenticationException $e) {
// a pokud to skonci chybou, tak presmerujeme a vypiseme zpravu
$odkaz = Nette\Utils\Html::el('a');
$odkaz->href('http://www.seznam.cz'); // url odkazu
$odkaz->setText('odkazem'); // text odkazu
$zprava = Nette\Utils\Html::el();
$zprava->add('Nějaký text s ')->add($odkaz)->add(' na jinou stránku.');
$this->flashMessage($zprava);
$this->redirect('Homepage:abcd');
Jednodussi moznost je vypnout escapovani flashmessage, ale to bych nedelal.
Jojo, todle chápu, díky, ale já si tady takhle vytvářim výjimky (v UserManager), je tam i napsáno kam by tak měl směřovat ten odkaz, jen nevim ja toho docílit.
if (!$row) {
throw new Nette\Security\AuthenticationException('Špatná Emailová adresa.', self::IDENTITY_NOT_FOUND);
} elseif (!Passwords::verify($password, $row[self::COLUMN_PASSWORD_HASH])) {
throw new Nette\Security\AuthenticationException('Špatné heslo.', self::INVALID_CREDENTIAL);
}elseif($row[self::COLUMN_STATUS]==1){
throw new Nette\Security\AuthenticationException("Váš účet není aktivní. Nový aktivační email si můžete nechat poslat kliknutím na následující odkaz <a n:href='Login:Resend'>odkaz</a>", self::NOT_APPROVED); // nějak takhle by měl vypadat ten odkaz
} elseif($row[self::COLUMN_STATUS]==0){
throw new Nette\Security\AuthenticationException('Váš účet je zablokován.', self::NOT_APPROVED);
} elseif (Passwords::needsRehash($row[self::COLUMN_PASSWORD_HASH])) {
$row->update(array(
self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
));
}
Potom si přidávám v SignFormFactory ty zprávy z výjimek jako errory do formuláře. Jen nevim vůbec jak na ten odkaz.
try {
$this->user->login($values->username, $values->password);
} catch (Nette\Security\AuthenticationException $e) {
$form->addError($e->getMessage());
}
Zkus to takhle. Tu AuthenticationException si nech pouze u kontroly E-mailu a hesla i se zprávou (Nebo si taky můžeš vytvorit vlastni vyjimky pro tyhle dva stavy). U tech dalsich stavu si vytvoris vlastni konkretni vyjimky, ktere pote zachytis pri zpracovani prihlaseni. Takže by to mohlo vypadat nejak takhle napriklad:
if (!$row) {
throw new Nette\Security\AuthenticationException('Špatná Emailová adresa.',
self::IDENTITY_NOT_FOUND);
} elseif (!Passwords::verify($password, $row[self::COLUMN_PASSWORD_HASH])) {
throw new Nette\Security\AuthenticationException('Špatné heslo.', self::INVALID_CREDENTIAL);
}elseif($row[self::COLUMN_STATUS]==1){
throw new Runtime\InactiveAccountException;
} elseif($row[self::COLUMN_STATUS]==0){
throw new Runtime\InaccessibleAccountException;
} elseif (Passwords::needsRehash($row[self::COLUMN_PASSWORD_HASH])) {
$row->update(
array(self::COLUMN_PASSWORD_HASH => Passwords::hash($password))
);
}
No a potom to muzes zpracovat napriklad takhle:
try {
$this->user->login($values->username, $values->password);
} catch (Nette\Security\AuthenticationException $e) {
$form->addError($e->getMessage());
return;
} catch (Runtime\InactiveAccountException $i) {
$odkaz = Nette\Utils\Html::el('a');
$odkaz->href($this->link('Login:resend')); // url odkazu
$odkaz->setText('odkaz'); // text odkazu
$zprava = Nette\Utils\Html::el();
$zprava->add('Váš účet není aktivní. Nový aktivační email si můžete nechat poslat kliknutím na
následující ')->add($odkaz);
$form->addError($zprava);
return;
} catch (Runtime\InaccessibleAccountException $ia) {
$form->addError('Váš účet je zablokován.');
return;
}
Proste jde o to, ze ten text vyjimky, ktery se tam snazis nacpat, se ti vzdycky prelozi spatne a ten odkaz se ti bude bude zobrazovat jako escapovany text. Jediny reseni by potom bylo vypnout escapovani ty message v sablone, coz je fuj. Tohle je asi jediny validni zpusob, jak toho dosahnout. Alespon tedy co vim ja.
Zobrazeno 6 zpráv z 6.