Vícenásobné použití samostatného formuláře
Máte formulář v samostatné třídě? A chcete ho použít na více místech?
Třída formuláře
class LoginForm extends \Nette\Application\UI\Form
{
/** @var \Nette\Security\User */
private $user;
/**
* @param \Nette\Security\User
*/
public function __construct(\Nette\Security\User $user)
{
parent::__construct();
$this->user = $user;
$this->addText('username', "Username");
$this->addPassword('password', "Password");
$this->addSubmit('sub', "Login");
$this->onSuccess[] = callback($this, 'process');
}
public function process()
{
$values = $this->getValues();
try {
$this->user->login($values->username, $values->password);
} catch (\Nette\Security\AuthenticationException $e) {
$this->addError($e->getMessage());
}
}
}
Při inicializaci zaregistrujeme callback, který nám zpracuje formulář.
Použití v presenteru:
class LoginPresenter extends \Nette\Application\UI\Presenter
{
/**
* @return LoginForm
*/
protected function createComponentLoginForm()
{
$form = new LoginForm($this->getUser());
$presenter = $this;
$form->onSuccess[] = function($form) use($presenter) {
if ($form->valid) {
$presenter->restoreRequest($presenter->backlink);
}
}
return $form;
}
}
V továrničce si zaregistrujeme druhý callback, který nám provede akci po úspěšném zpracování formuláře.