$form->onSuccess[] nastavá před stisknutím tlačítka

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
White-dracke
Člen | 3
+
0
-

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
+
+1
-

ten řádek má vypadat takto:

$form->onSuccess[] = $this->signInFormSucceeded;
White-dracke
Člen | 3
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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');

Quinix
Člen | 108
+
+1
-

Nevytváříš náhodou instanci Nette\Forms\Form místo Nette\Application\UI\Form?