Nefunkční $form->onSuccess[]

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

V Nette teprve začínám.

Mám problém s tím, že se nechce volat událost onSuccess po odeslání formuláře.
Továrna:

<?php

namespace App;

class LoginForm extends \Nette\Application\UI\Form {

    public function __construct() {

	parent::__construct();

	$this->setAction("/sign");

        $this->addText("email", "Váš email");
        $this->addPassword("password", "Heslo");
        $this->addSubmit("send");

        $this->onSuccess[] = callback($this, 'SignInFormSubmitted');
	// $this->onSuccess[] = array($this, 'SignInFormSubmitted');
	// $this->onSuccess[] = $this->SignInFormSubmitted;
	// Žádná z těch tří nefunguje

    }

    public function SignInFormSubmitted (\Nette\Application\UI\Form $form) {

	$values = $form->getValues();

	$this->getUser()->login($values->name, $values->password);
	$this->redirect("Sign");

    }


}
?>

A použití v presenteru:

<?php

namespace App\Presenters;

class SignPresenter extends \Nette\Application\UI\Presenter {

    public $authenticator;
    public $user;
    public $loginForm;

    public function __construct(\Nette\Security\User $user, \App\Authenticator $authenticator, \App\LoginForm $loginForm) {

	$this->authenticator = $authenticator;

	$this->user = $user;
	$this->user->setAuthenticator($authenticator);

	$this->loginForm = $loginForm;
    }


    public function createComponentSignInForm () {

	return $this->loginForm;

    }


    public function renderDefault () {



	$this->template->ok = "No Login";

	if ($this->getUser()->isLoggedIn()) {

	    $this->template->ok = "Logged";

	}


    }

    public function renderOut () {

	$this->getUser()->logout();

    }


}

?>

Sice jsem už pročítal fóra, něco už jsem objevil, ale stále to nefunguje.
Zkoušel jsem to i bez továrny v presenteru, ale nic.
Díky moc.

s4muel
Člen | 92
+
0
-

skus dat prec to $this->setAction(„/sign“);

one-two
Člen | 80
+
0
-

Tady je víc problémů

  1. To první neni továrna, ale obyčejná poděděná třída. Továrna je popsaná zde
  2. Pokud nechceš továrnu viz odkaz, tak musíš mít v createComponentForm return new LoginForm();
  3. Co se týče metody co zpracovává formulář, tak pak fungovat taky nebude, jelikož v $this nemáš Presenter ale Form, takže bys měl mít případně $this->getPresenter()->redirect() atd
  • bych dal pryč to ruční nastavení action
thirdknown
Člen | 26
+
0
-

Díky moc vám oběma.

  1. Chápu, opravil jsem.
  2. Opraveno

Nefunkčnost byla dána nastavením $form->setAction(). Sice zatím nechápu proč, ale jsem rád, že to funguje!

one-two
Člen | 80
+
0
-

setAction použiješ v případě, že chceš formulář poslat například někam ven. Pokud ho zpracováváš v Nette tak ti stačí nastavit příslušné callbacky (onSuccess atd) a cestu „si to samo najde“ :)