Cannot read an undeclared property App\Forms\SignInForm::$onSuccess
- rom%lax%
- Člen | 3
Zdravím.
Mám menší problém. Snažím se postupovat podle tutorialu jak na generované továrničky (https://doc.nette.org/…tion/factory) ale nedaří se mi to na mém příkladě zprovoznit. Myslím že to bude nějaká volovina… Kdyby mi někdo dokázal pomoc, budu mu vděčný.
Komponenta formuláře
<?php
namespace App\Forms;
use Nette;
use Nette\Security\User;
use Nette\Application\UI\Form;
class SignInForm extends Nette\Application\UI\Control {
use Nette\SmartObject;
/** @var User */
private $user;
/** @var Form */
private $form;
public function __construct(User $user) {
parent::__construct();
$this->form = new Form();
$this->user = $user;
}
/**
* @return Form
*/
public function create() {
$this->form->setRenderer(new \App\Forms\BootstrapFormRenderer());
$this->form->addGroup('Sign in');
$this->form->addText('username', 'Username')
->setRequired('Enter your username');
$this->form->addPassword('password', 'Password')
->setRequired('Enter your password');
$this->form->addCheckbox('remember', ' Remember me');
$this->form->addSubmit('signIn', 'Sign In');
$this->form->onSuccess[] = array($this, 'formSucceeded');
return $this->form;
}
public function formSucceeded(Form $form, $values) {
if ($values->remember) {
$this->user->setExpiration('14 days', NULL, FALSE);
} else {
$this->user->setExpiration('20 minutes', NULL, TRUE);
}
try {
$this->user->login($values['username'], $values['password']);
} catch (Nette\Security\AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
}
interface ISignInFormFactory {
/** @return SignInForm */
function create();
}
Presenter
namespace App\Presenters;
use App\Forms\ISignInFormFactory;
class SignPresenter extends BasePresenter {
/** @var ISignInFormFactory @inject */
public $signInFormFactory;
public function createComponentSignInForm() {
$form = $this->signInFormFactory->create();
$form->onSuccess[] = function () {
$this->redirect("Homepage:default");
};
return $form;
}
public function actionOut() {
$this->getUser()->logout(true);
$this->redirect('Homepage:default');
}
}
- David Matějka
- Moderator | 6445
ahoj, spise koukni na tento clanek: https://doc.nette.org/…s/form-reuse#…
- norbe
- Backer | 405
ISignInFormFactory::create ti vytvoří instanci SignInForm, nevolá na ní metodu create, která by vytvořila formulář.
Kdyby jsi to chtěl tak jak to máš nyní, musíš upravit továrnu na komponentu:
public function createComponentSignInForm() {
$form = $this->signInFormFactory->create()->create();
$form->onSuccess[] = function () {
$this->redirect("Homepage:default");
};
return $form;
}
Nicméně úplně nechápu význam toho interfacu (osobně bych ho úplně vyhodil a do DI zaregistroval rovnou SignInForm, který bych ještě přejmenoval na SignInFormFactory)…
- David Matějka
- Moderator | 6445
@norbe jde o formular obaleny komponentou, to nemuzes registrovat primo do DI, ale musis to vytvaret pres tovarnu
- rom%lax%
- Člen | 3
norbe napsal(a):
ISignInFormFactory::create ti vytvoří instanci SignInForm, nevolá na ní metodu create, která by vytvořila formulář.
Kdyby jsi to chtěl tak jak to máš nyní, musíš upravit továrnu na komponentu:
public function createComponentSignInForm() { $form = $this->signInFormFactory->create()->create(); $form->onSuccess[] = function () { $this->redirect("Homepage:default"); }; return $form; }
Nicméně úplně nechápu význam toho interfacu (osobně bych ho úplně vyhodil a do DI zaregistroval rovnou SignInForm, který bych ještě přejmenoval na SignInFormFactory)…
@norbe Snažím se dosáhnout toho, co je v odkazovaném článku. :)
@DavidMatějka Jdu na to mrknout :) Však já to nějak vymyslím. Aspoň se zase něco přiučím.
- norbe
- Backer | 405
@DavidMatějka Vím že nemůže registrovat přímo formulář, ale tak jak to má v prvním příspěvku tak s tou komponentou pracuje jako kdyby se mu ta generovaná továrna (ISignInFormFactory ) vracela formulář, ne komponentu. Ta komponenta je navíc napsaná jako továrna na UI\Form. Prostě mixuje tam 2 různé postupy, proto píšu, že nechápu význam toho interfacu. Tak jak ho použil v tom příkladu je nadbytečný, stejně jako dědění od UI\Control.
Editoval norbe (31. 7. 2018 11:56)