Formulář jako komponenta, redirect
- theacastus
- Člen | 81
Zdravím,
mám ve vývoji aplikaci kde byl paskvil s autentizacemi (UNION dvou tabulek a každá měla jinak hashovaná hesla…) takže jsem to rozdělil na FrontAuthenticator a AdminAuthenticator.
A musel jsem trochu upravit i login formuláře, no a protože admin má jeden formulář pro přihlášení na <host>/admin/sign/in a je renderovaný přes FormFactory (díky bohu za makeBoostrapX() :D ). Tak to je vyřešené, funkční.
Ale…
Front login je komponenta (sice použitá jen na dvou místech, ale má vlastní UI a fakt se mi nechtělo to psát v PHP, takže jsem vytvořil latte šablonu).
Po přečtení pár článků, vláken na f=oru jsem něco stvořil, ale někde mám chybu a už s ní nehnu, prosím o další oči které ji sice uvidí hned, ale já si už sedím na vedení :D
SignInForm a ISignInFormFactory:
class SignInForm extends Control
{
use \Nette\SmartObject;
/**
* @var FormFactory
*/
private $factory;
/**
* @var FrontAuthenticator
*/
private $authenticator;
/**
* @var User
*/
private $user;
/**
* @var Logger
*/
private $logger;
/**
* SignInFormFactory constructor.
* @param User $user
* @param FrontAuthenticator $authenticator
* @param Logger $logger
*/
public function __construct(
FormFactory $factory,
User $user,
FrontAuthenticator $authenticator,
Logger $logger
)
{
$this->factory = $factory;
$this->user = $user;
$this->authenticator = $authenticator;
$this->logger = $logger;
}
public function render()
{
$this->template->setFile(__DIR__ . '/templates/SignInForm.form.latte');
$this->template->render();
}
/**
* @param callable $onSuccess
* @return SignInFormFactory
*/
public function createComponentSignInForm()
{
$form = new Form;
$form->addText('username', 'Přijímení a jméno')
->setRequired('Zadejte prosím přijímení a jméno')
->setAttribute('required')
->setAttribute('placeholder', 'Novák Jan');
$form->addPassword('password', 'Heslo')
->setRequired('Zadejte prosím vaše heslo')
->setAttribute('required');
$form->addCheckbox('remember', 'Zůstan přihlášen');
$form->addSubmit('submit', 'Přihlásit se');
$form->addProtection('Vypršel časový limit pro odeslání formuláře!');
$form->onSuccess[] = [$this, 'processForm'];
return $form;
}
public function processForm(Form $form)
{
$values = $form->getValues();
$this->user->getStorage()->setNamespace('front');
$this->user->setAuthenticator($this->authenticator);
if ($values->remember)
{
$this->user->setExpiration('+ 14 days');
}
else
{
$this->user->setExpiration('+ 20 minutes');
}
try
{
$this->user->login($values->username, $values->password);
}
catch (FrontAuthenticationException $exception)
{
$form->addError("Jméno nebo heslo není správné.");
$this->logger = $this->logger->channel('auth.front');
$this->logger->addInfo($exception->getMessage());
return;
}
$this->onLoginSuccess($this);
}
}
interface ISignInFormFactory
{
/**
* @return SignInForm
*/
function create();
}
A presenter:
class PostListPresenter extends BasePresenter
{
/**
* @var ISignInFormFactory @inject
*/
public $signInFormFactory;
//nějaký kód, ale smazaný abych se vešel s postem
protected function createComponentSignInForm()
{
$form = $this->signInFormFactory->create();
$form->onLoginSuccess[] = function(SignInForm $form)
{
$this->flashMessage("Přihlášení proběhlo úspěšně.", "success");
$this->redirect('this');
};
return $form;
}
}
A tracy mi hází chybu
Cannot read an undeclared property App\Front\Forms\SignInForm::$onLoginSuccess.
Ale nějak mi už nezapíná mozek, proč to hází když jsem ji definoval (ale
asi špatně že…)
Jinak druhý presenter má stejný createComponent jen jiný redirect…
Nemůžu se hnout a je to celkem frustrující už.
Díky všem za odpovědi
- theacastus
- Člen | 81
V processForm
v SignInForm třídě.
Šel jsem podle tohoto: https://doc.nette.org/…s/form-reuse