registrace v modálním okně
- Neo-Mike
- Člen | 22
Zdravím, snažím se udělat registraci v modálním okně s využitím
SignFormFactory.php, SignPresenter.php ze Sandboxu. Neustále mám problém
s hláškou: Argument 1 passed to App\Forms\SignFormFactory::__construct()
must be an instance of Nette\Security\User, none given, called in
C:\dev\localhost_www\vinicola\app\presenters\HomepagePresenter.php on line
20 and defined
Modální okno bych rád měl jakou součást menu, které je definované v
@layout.latte. Laděnka mi vypisuje chybu v souboru SignFormFactory.php,
konkrétně na řádku public function __construct(User $user). Děkuji
za rady.
Kód SignFormFactory.php
<?php
namespace App\Forms;
use Nette;
use Nette\Application\UI\Form;
use Nette\Security\User;
class SignFormFactory extends Nette\Object
{
/** @var User */
private $user;
public function __construct(User $user)
{
$this->user = $user;
}
/**
* @return Form
*/
public function create()
{
$form = new Form;
$form->addText('username', 'Uživatelské jméno: ')
->setRequired('Please enter your username.');
$form->addPassword('password', 'Heslo:')
->setRequired('Please enter your password.');
$form->addCheckbox('remember', ' Zapamatuj si mě');
$form->addSubmit('send', 'Sign in');
$form->onSuccess[] = array($this, 'formSucceeded');
return $form;
}
public function formSucceeded(Form $form, $values)
{
if ($values->remember) {
$this->user->setExpiration('14 days', FALSE);
} else {
$this->user->setExpiration('20 minutes', TRUE);
}
try {
$this->user->login($values->username, $values->password);
} catch (Nette\Security\AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
}
Kód HomepagePresenter.php
<?php
namespace App\Presenters;
use Nette;
use App\Forms\SignFormFactory;
class HomepagePresenter extends BasePresenter
{
/**
* Sign-in form factory.
* @return Nette\Application\UI\Form
*/
protected function createComponentSignInForm()
{
$form = (new SignFormFactory())->create();
$form->onSuccess[] = function ($form) {
$form->getPresenter()->redirect('Homepage:');
};
return $form;
}
public function actionOut()
{
$this->getUser()->logout();
$this->flashMessage('You have been signed out.');
$this->redirect('in');
}
}
- Matey
- Člen | 142
ahoj,
je potrebné zaregistrovať si to v config.neon
services:
- App\Forms\SignFormFactory
a v presenteri potom
/** @var \App\Forms\SignFormFactory @inject */
public $signFormFatory;
protected function createComponentSignInForm()
{
$form = $this->signFormFactory->create();
$form->onSuccess[] = function ($form) {
$form->getPresenter()->redirect('Homepage:');
};
return $form;
}
- Neo-Mike
- Člen | 22
V config.neon to mám. Zde to už bylo při vytvoření projektu.
services:
- App\Model\UserManager
- App\Forms\SignFormFactory
Pokud potom v presenteru použiji $form = $this->signFormFactory->create(); dostávám chybu Cannot read an undeclared property App\Presenters\HomepagePresenter::$signFormFactory.. Podle toho co jsem si nastudoval v dokumentaci, by se měl formulář volat právě pomocí $form = (new SignFormFactory())->create();.
- Neo-Mike
- Člen | 22
Vycházel jsem z této dokumentace: https://doc.nette.org/cs/forms#… – konkrétně sekce: Formuláře v presenterech. Takže jsem asi něco špatně pochopil.
EDIT: Takže už to funguje. Díky za nastrčení k získání závislostí. Problém byl v tom. Konkrétně jsem špatně vytvářel nový formulář (neměl jsem uvedené /** @var SignFormFactory @inject */ u proměnné SignFormFactory).
Editoval Neo-Mike (6. 3. 2016 11:58)