Cannot read an undeclared property App\Forms\SignInForm::$onSuccess

rom%lax%
Člen | 3
+
0
-

Zdravím.

Mám menší problém. Snažím se postupovat podle tutorialu jak na generované továrničky (https://doc.nette.org/…tion/factory) ale nedaří se mi to na mém příkladě zprovoznit. Myslím že to bude nějaká volovina… Kdyby mi někdo dokázal pomoc, budu mu vděčný.

Komponenta formuláře

<?php

namespace App\Forms;

use Nette;
use Nette\Security\User;
use Nette\Application\UI\Form;

class SignInForm extends Nette\Application\UI\Control {

    use Nette\SmartObject;

    /** @var User */
    private $user;

    /** @var Form */
    private $form;

    public function __construct(User $user) {
        parent::__construct();
        $this->form = new Form();
        $this->user = $user;
    }

    /**
     * @return Form
     */
    public function create() {
        $this->form->setRenderer(new \App\Forms\BootstrapFormRenderer());

        $this->form->addGroup('Sign in');
        $this->form->addText('username', 'Username')
                ->setRequired('Enter your username');
        $this->form->addPassword('password', 'Password')
                ->setRequired('Enter your password');

        $this->form->addCheckbox('remember', ' Remember me');
        $this->form->addSubmit('signIn', 'Sign In');

        $this->form->onSuccess[] = array($this, 'formSucceeded');
        return $this->form;
    }

    public function formSucceeded(Form $form, $values) {
        if ($values->remember) {
            $this->user->setExpiration('14 days', NULL, FALSE);
        } else {
            $this->user->setExpiration('20 minutes', NULL, TRUE);
        }

        try {
            $this->user->login($values['username'], $values['password']);
        } catch (Nette\Security\AuthenticationException $e) {
            $form->addError($e->getMessage());
        }
    }

}

interface ISignInFormFactory {

    /** @return SignInForm */
    function create();
}

Presenter

namespace App\Presenters;

use App\Forms\ISignInFormFactory;

class SignPresenter extends BasePresenter {

    /** @var ISignInFormFactory @inject */
    public $signInFormFactory;

    public function createComponentSignInForm() {
        $form = $this->signInFormFactory->create();
        $form->onSuccess[] = function () {
            $this->redirect("Homepage:default");
        };
        return $form;
    }

    public function actionOut() {
        $this->getUser()->logout(true);
        $this->redirect('Homepage:default');
    }

}
David Matějka
Moderator | 6445
+
+1
-

ahoj, spise koukni na tento clanek: https://doc.nette.org/…s/form-reuse#…

norbe
Backer | 405
+
-1
-

ISignInFormFactory::create ti vytvoří instanci SignInForm, nevolá na ní metodu create, která by vytvořila formulář.

Kdyby jsi to chtěl tak jak to máš nyní, musíš upravit továrnu na komponentu:

public function createComponentSignInForm() {
        $form = $this->signInFormFactory->create()->create();
        $form->onSuccess[] = function () {
            $this->redirect("Homepage:default");
        };
        return $form;
    }

Nicméně úplně nechápu význam toho interfacu (osobně bych ho úplně vyhodil a do DI zaregistroval rovnou SignInForm, který bych ještě přejmenoval na SignInFormFactory)…

David Matějka
Moderator | 6445
+
0
-

@norbe jde o formular obaleny komponentou, to nemuzes registrovat primo do DI, ale musis to vytvaret pres tovarnu

rom%lax%
Člen | 3
+
0
-

norbe napsal(a):

ISignInFormFactory::create ti vytvoří instanci SignInForm, nevolá na ní metodu create, která by vytvořila formulář.

Kdyby jsi to chtěl tak jak to máš nyní, musíš upravit továrnu na komponentu:

public function createComponentSignInForm() {
        $form = $this->signInFormFactory->create()->create();
        $form->onSuccess[] = function () {
            $this->redirect("Homepage:default");
        };
        return $form;
    }

Nicméně úplně nechápu význam toho interfacu (osobně bych ho úplně vyhodil a do DI zaregistroval rovnou SignInForm, který bych ještě přejmenoval na SignInFormFactory)…

@norbe Snažím se dosáhnout toho, co je v odkazovaném článku. :)

@DavidMatějka Jdu na to mrknout :) Však já to nějak vymyslím. Aspoň se zase něco přiučím.

norbe
Backer | 405
+
+1
-

@DavidMatějka Vím že nemůže registrovat přímo formulář, ale tak jak to má v prvním příspěvku tak s tou komponentou pracuje jako kdyby se mu ta generovaná továrna (ISignInFormFactory ) vracela formulář, ne komponentu. Ta komponenta je navíc napsaná jako továrna na UI\Form. Prostě mixuje tam 2 různé postupy, proto píšu, že nechápu význam toho interfacu. Tak jak ho použil v tom příkladu je nadbytečný, stejně jako dědění od UI\Control.

Editoval norbe (31. 7. 2018 11:56)