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

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

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)

marioff
Člen | 69
+
0
-

lenze ja mam spracovanie loginForm-u v tovarnicke ktoru si injektujem cez anotaciu a tam redirect urcite nepojde :( ..

Jan Endel
Člen | 1016
+
0
-

č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");
		};
	}
}