Form – rozlicne udalosti pri chybe
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- marioff
- Člen | 69
Ahojte uz sa dlhsie trapim s tymto:
mam v presenteri:
public function loginFormError()
{
....
$this->redirect($redirect);
....
}
public function loginFormSuccess()
{
....
$this->redirect($redirect);
....
}
/**
* @return \Nette\Application\UI\Form
*/
protected function createComponentLoginForm()
{
......
$form->onSuccess[] = $this->loginFormSuccess;
$form->onError[] = $this->loginFormError;
......
}
- injektnutu tovarnicku na loginForm
a authenticator:
class PasswordAuthenticator extends Nette\Object implements Nette\Security\IAuthenticator
public function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$user = $this->dao->findOneBy([$this->username => $username]);
if ($user==NULL) {
throw new AuthenticationException('Zadané meno nie je správne.', self::IDENTITY_NOT_FOUND);
}
if ($this->isUserBlocked($user)) {
throw new AuthenticationException('Účet je dočasne zablokovaný.', self::NOT_APPROVED);
}
if ($user->password !== $this->calculateHash($password, $user->password)) {
throw new AuthenticationException('Zadané heslo nie je správne.', self::INVALID_CREDENTIAL);
}
}
a prave ked nastane situacia ze je uzivatel blokovany $this->isUserBlocked == TRUE by som potreboval presmerovat inde ako mam v udalosti $form->onError[] = $this->loginFormError; .. teda asi vytvorit nejaku novu udalost na ten loginForm.. ale neviem ako toto efektivne a jednoducho docielit
Editoval marioff (22. 12. 2014 11:28)
- Ot@s
- Backer | 476
Nepotřebuješ další druh události. Doplň si obsah loginFormSuccess. Jde
jen o zachycení té vyjímky, kterou genereujes v
PasswordAuthenticator
. Douprav si jen názvy formulářových polí
a případné namespace vyjímky.
public function loginFormSuccess($form)
{
try {
$values = $form->getValues();
$this->user->login($values->username, $values->password);
$this->redirect("...");
} catch (Nette\Security\AuthenticationException $e) {
$form->addError($e->getMessage());
// nebo $this->redirect("...") nekam jinam
}
}
Editoval Ot@s (22. 12. 2014 14:11)
- Jan Endel
- Člen | 1016
čistější by imho bylo něco takovéhoto:
nadefinovat možnou eventu ve třídě:
/**
* @method onBan(LoginForm $form)
*/
class LoginForm extends Nette\Application\UI\Form
{
/**
* array
*/
public $onBan = [];
}
protected function createComponentLoginForm()
{
$form = new LoginForm;
//......
$form->onSuccess[] = $this->loginFormSuccess;
$form->onError[] = $this->loginFormError;
$form->onValidate[] = function (Form $form) {
$values = $form->getValues();
if ($this->banChecker->isUserBlocked($values->email) {
$this->addError('Sorry bro.');
$form->onBan(Form $form); // pokud máš tenhle kód v továrničce, pokud v presenteru tak rovnou redirect
}
};
//......
}
A pak použití:
class Presenter extends \Nette\Application\UI\Presenter
{
protected function createComponentLoginForm()
{
$form = $this->loginFormFactory->create();
$form->onBan[] = function (Form $form) {
$this->redirect(":BanHammer:ban");
};
}
}