vlastni trida na vyrobu formularu
- vosy
- Člen | 532
ahoj, chtel jsem si udelat oddelenout tridu na vyrobu formularu aby se mi toto nepletlo v Presenteru.
mam tedy
namespace AdminModule;
use \Nette\Application\UI\Form;
use \Nette\Security as NS;
class LoginBoardPresenter extends BasePresenter
{
public function startup()
{
parent::startup();
$this->session->start();
}
/* component factoriew */
protected function createComponentSignInForm()
{
$FormFactory = new FormFactory;
return $FormFactory->loginForm();
}
}
a FormFactory vypada takto:
namespace AdminModule;
use \Nette\Application\UI\Form;
class FormFactory extends Form
{
public function loginForm()
{
$form = new Form;
$form->addText('username', 'Login:')
->setRequired('Vyplňte prosím Login.')
->setAttribute('placeholder', 'Vaše přihlašovací jméno');
$form->addPassword('password', 'Heslo:')
->setRequired('Vyplňte prosím heslo.')
->setAttribute('placeholder', 'Vaše heslo');
$form->addSubmit('send', 'Přihlásit se')
->setAttribute('class', 'btn btn-large btn-warning fS140p');
$form->addCheckbox('remember', 'Zůstat přihlášen');
$form->onSuccess[] = callback($this, 'signInFormSubmitted');
$form->addProtection('Vypršel časový limit, odešlete formulář znovu');
return $form;
}
public function signInFormSubmitted($form)
{
try
{
$user = $this->getUser();
$values = $form->getValues();
if($values->remember)
{
$user->setExpiration('+30 days', FALSE);
}
$user->login($values->username, $values->password);
$this->flashMessage('Přihlášení proběhlo úspěšně jako "'.$user->identity->jmeno.'"', 'success');
$this->redirect('Dashboard:');
}catch(NS\AuthenticationException $e)
{
$form->addError($e->getMessage());
}
}
}
ale pri odeslani formulare se nemohu dostat na getUser()
Nette\MemberAccessException
Call to undefined method AdminModule\FormFactory::getUser().
problem na
try
36: {
37: $user = $this->getUser();
38: $values = $form->getValues();
39:
40: if($values->remember)
41: {
- Vojtěch Dobeš
- Gold Partner | 1316
Třída Form
ani ta tvoje třída nemá metodu
getUser()
. Můžeš si do té továrny v konstruktoru předávat
instanci Nette\Security\User
a tu metodu si dopsat.
- Marek Šneberger
- Člen | 130
Třeba nějak takhle…
namespace AdminModule;
use \Nette\Application\UI\Form;
class FormFactory extends Form
{
/**
* @var \Nette\Security\User
*/
private $user;
/**
* @param\Nette\Security\User
*/
public function __construct(\Nette\Security\User $user)
{
parent::__construct();
$this->user = $user;
}
// Zbytek Tvé třídy
}
- vosy
- Člen | 532
mel jsem to podobne:
namespace AdminModule;
use \Nette\Application\UI\Form;
use \Nette\Security as NS;
class FormsFactory
{
/** @var NS\User */
public $user;
function __construct(NS\User $user)
{
$this->user = $user;
}
ale hazi mi to chybu
Recoverable Error
Argument 1 passed to AdminModule\FormFactory::__construct() must be an instance of Nette\Security\User, none given, called in /Volumes/ext1/wwwServer/vosyAdmin/v1/app/AdminModule/presenters/LoginBoardPresenter.php on line 19 and defined
protoze v prezenteru mam
class LoginBoardPresenter extends BasePresenter
{
public function startup()
{
parent::startup();
$this->session->start();
}
/* component factoriew */
protected function createComponentSignInForm()
{
$FormsFactory = new FormsFactory;
return $FormsFactory->loginForm();
}
takze bych mel predavat NS\User i v konstructoru?
nejak:
$FormsFactory = new FormsFactory($user);
ale kde tu $user promenou vzit v prezenteru?
- vosy
- Člen | 532
dix, ale stale se nemohu dohrabat k $this->getUser.
namespace AdminModule;
use \Nette\Application\UI\Form;
use \Nette\Security as NS;
class FormsFactory extends \Nette\Object
{
public function loginForm()
{
$form = new Form;
$form->addText('username', 'Login:')
->setRequired('Vyplňte prosím Login.')
->setAttribute('placeholder', 'Vaše přihlašovací jméno');
$form->addPassword('password', 'Heslo:')
->setRequired('Vyplňte prosím heslo.')
->setAttribute('placeholder', 'Vaše heslo');
$form->addSubmit('send', 'Přihlásit se')
->setAttribute('class', 'btn btn-large btn-warning fS140p');
$form->addCheckbox('remember', 'Zůstat přihlášen');
// $form->onSuccess[] = callback($this, 'signInFormSubmitted');
$form->addProtection('Vypršel časový limit, odešlete formulář znovu');
return $form;
}
}
namespace AdminModule;
use \Nette\Application\UI\Form;
use \Nette\Security as NS;
class LoginBoardPresenter extends BasePresenter
{
/** @var \FormsFactory */
public $FormsFactory;
public function inject(FormsFactory $formFactory)
{
$this->FormsFactory = $formFactory;
}
public function startup()
{
parent::startup();
$this->session->start();
}
/* component factoriew */
protected function createComponentSignInForm()
{
$form = $this->FormsFactory->loginForm();
$form->onSuccess[] = function (Form $form)
{
try
{
$user = $this->getUser();
$values = $form->getValues();
// print_r($values);
if($values->remember)
{
$user->setExpiration('+30 days', FALSE);
}
$user->login($values->username, $values->password);
$this->flashMessage('Přihlášení proběhlo úspěšně jako "'.$user->identity->jmeno.'"', 'success');
// $this->redirect('Dashboard:');
}catch(NS\AuthenticationException $e)
{
$form->addError($e->getMessage());
}
};
return $form;
}
}
chyba:
Fatal Error
Using $this when not in object context
to jest na radku
$user = $this->getUser();
- Jiří Nápravník
- Člen | 710
místo
$form->onSuccess[] = function (Form $form)
{
udělej:
$presenter = $this;
$form->onSuccess[] = function (Form $form) use ($presenter)
{
a v těle té funkce potom místo $this->getUser() zavolej $presenter->getUset();