$form->onSuccess[] nastavá před stisknutím tlačítka
- White-dracke
- Člen | 3
Při dostání se na stránku se ihned volá $form->onSuccess[] = $this->signInFormSucceeded($form); bez toho aniž by bylo stisknuto na tlačítko.
Funkce přihlašovacího presenteru
protected function createComponentSignInForm()
{
$form = new Form;
$form->setMethod('post');
$form->addText('username', 'Login:')
->setAttribute('placeholder', 'Přihlašovací jméno')
->setRequired('Vložte prosím svůj login.');
$form->addPassword('password', 'Heslo:')
->setAttribute('placeholder', 'Heslo')
->setRequired('Vložte prosím své heslo.');
$form->addCheckbox('remember', 'Zapamatovat heslo')
->setDefaultValue(TRUE);
$form->addSubmit('send', 'Přihlásit se');
if ($form->isSuccess()) {
$this->signInFormSucceeded($form);
}
return $form;
}
Tělo late souboru:
<body class="login">
<div id="container">
{form signInForm class =>'form-signin', role=>'form'}
<h2 class="form-signin-heading">Evidence výpočetní techniky</h2>
<div class="errors" n:if="$form->hasErrors()">
<div n:foreach="$form->errors as $error">{$error}</div>
</div>
{label username /}
{input username class => 'form-control', autofocus => TRUE}
{label password /}
{input password class => 'form-control'}
<div class="checkbox">
<label>
{input remember}{label remember /}
</label>
</div>
{input send class => "btn btn-lg btn-primary btn-bloc"}
{/form}
</div>
</body>
EDIT: Funkce $form->onSuccess[] = $this->signInFormSucceeded; nefunguje; s funkci if ($form->isSuccess()) { $this->signInFormSucceeded($form); } se dostanu o trochu dale.
Přidávám kód funkce signInFormSucceeded
public function signInFormSucceeded($form)
{
$values = $form->getValues();
if ($values->remember) {
$this->getUser()->setExpiration('14 days', FALSE);
} else {
$this->getUser()->setExpiration('20 minutes', TRUE);
}
try {
$this->getUser()->login($values->username, $values->password);
$this->redirect('Homepage:default');
} catch (Nette\Security\AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
Zde pokud zadám správné heslo, tak mi to končí na $this->redirect(‚Homepage:default‘); Nette vyhodí Nette\Application\AbortException, pokud zadám špatné heslo, tak mi nette vyhodí Nette\Security\AuthenticationException #1 asi se mi ji nedari zachytit (i pokud jsem odchytaval vsechny chyby)…
Editoval White-dracke (22. 11. 2014 18:29)
- Michal Vyšinský
- Člen | 608
ten řádek má vypadat takto:
$form->onSuccess[] = $this->signInFormSucceeded;
- White-dracke
- Člen | 3
V tomto případě se při vyplnění hesla a odeslání na konec adresy přidá ?username=asd&password=asd&remember=on&send=Přihlásit+se, ale funkce signInFormSucceeded se vůbec nezavolá.
Editoval White-dracke (22. 11. 2014 16:55)
- Michal Vyšinský
- Člen | 608
Nekontroloval jsem kód formuláře: ten <form></form> odstraň. O začátek a konec formuláře se ti postará {form} makro.
Pokud tam potřebuješ tu třídu a roli formuláře tak takto:
{form signInForm class=>'form-signin', role=>'form'}
Editoval Michal Vyšinský (22. 11. 2014 17:05)
- White-dracke
- Člen | 3
Asi jsem se dostal trochu dál, ale stále je to příliš zabuggované.
Dal jsem podrobnosti do EDIT otazky.
Editoval White-dracke (22. 11. 2014 18:52)
- castamir
- Člen | 629
To je ale správné chování. Voláním příkazu redirect ukončuješ životní cyklus aktuálního presenteru.
Doporučuju ti si přečíst dokumentaci. A přečti si také tutoriál. Získáš tím chybějící informace. Pokud i přesto budeš mít dotazy, tak se zeptej. Prvně si to ale nastuduj prosím.
- Caine
- Člen | 216
Na tohle bacha
$form->onSuccess[] = $this->signInFormSucceeded;
tohle
normalne PHP nepodporuje (v Nette pro to podpora je, ale ted nevim, jestli
u vseho, co dedi od Nette\Object nebo jen v presenterech). Radsi bych pouzival
PHP way
tj: $form->onSuccess[] = array($this, 'signInFormSucceeded');