Formulář jako komponenta, redirect

theacastus
Člen | 81
+
0
-

Zdravím,

mám ve vývoji aplikaci kde byl paskvil s autentizacemi (UNION dvou tabulek a každá měla jinak hashovaná hesla…) takže jsem to rozdělil na FrontAuthenticator a AdminAuthenticator.

A musel jsem trochu upravit i login formuláře, no a protože admin má jeden formulář pro přihlášení na <host>/admin/sign/in a je renderovaný přes FormFactory (díky bohu za makeBoostrapX() :D ). Tak to je vyřešené, funkční.

Ale…

Front login je komponenta (sice použitá jen na dvou místech, ale má vlastní UI a fakt se mi nechtělo to psát v PHP, takže jsem vytvořil latte šablonu).

Po přečtení pár článků, vláken na f=oru jsem něco stvořil, ale někde mám chybu a už s ní nehnu, prosím o další oči které ji sice uvidí hned, ale já si už sedím na vedení :D

SignInForm a ISignInFormFactory:

class SignInForm extends Control
{
    use \Nette\SmartObject;

    /**
     * @var FormFactory
     */
    private $factory;

    /**
     * @var FrontAuthenticator
     */
    private $authenticator;

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

    /**
     * @var Logger
     */
    private $logger;

    /**
     * SignInFormFactory constructor.
     * @param User $user
     * @param FrontAuthenticator $authenticator
     * @param Logger $logger
     */
    public function __construct(
        FormFactory $factory,
        User $user,
        FrontAuthenticator $authenticator,
        Logger $logger
    )
    {
        $this->factory = $factory;
        $this->user = $user;
        $this->authenticator = $authenticator;
        $this->logger = $logger;
    }

    public function render()
    {
        $this->template->setFile(__DIR__ . '/templates/SignInForm.form.latte');
        $this->template->render();
    }

    /**
     * @param callable $onSuccess
     * @return SignInFormFactory
     */
    public function createComponentSignInForm()
    {
        $form = new Form;

        $form->addText('username', 'Přijímení a jméno')
            ->setRequired('Zadejte prosím přijímení a jméno')
            ->setAttribute('required')
            ->setAttribute('placeholder', 'Novák Jan');

        $form->addPassword('password', 'Heslo')
            ->setRequired('Zadejte prosím vaše heslo')
            ->setAttribute('required');

        $form->addCheckbox('remember', 'Zůstan přihlášen');

        $form->addSubmit('submit', 'Přihlásit se');

        $form->addProtection('Vypršel časový limit pro odeslání formuláře!');

        $form->onSuccess[] = [$this, 'processForm'];

        return $form;

    }

    public function processForm(Form $form)
    {
        $values = $form->getValues();

        $this->user->getStorage()->setNamespace('front');
        $this->user->setAuthenticator($this->authenticator);

        if ($values->remember)
        {
            $this->user->setExpiration('+ 14 days');
        }
        else
        {
            $this->user->setExpiration('+ 20 minutes');
        }

        try
        {
            $this->user->login($values->username, $values->password);
        }
        catch (FrontAuthenticationException $exception)
        {
            $form->addError("Jméno nebo heslo není správné.");
            $this->logger = $this->logger->channel('auth.front');
            $this->logger->addInfo($exception->getMessage());
            return;
        }

        $this->onLoginSuccess($this);
    }
}

interface ISignInFormFactory
{
    /**
     * @return SignInForm
     */
    function create();
}

A presenter:

class PostListPresenter extends BasePresenter
{

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

	//nějaký kód, ale smazaný abych se vešel s postem

    protected function createComponentSignInForm()
    {
        $form = $this->signInFormFactory->create();

        $form->onLoginSuccess[] = function(SignInForm $form)
        {
            $this->flashMessage("Přihlášení proběhlo úspěšně.", "success");
            $this->redirect('this');
        };

        return $form;
    }
}

A tracy mi hází chybu Cannot read an undeclared property App\Front\Forms\SignInForm::$onLoginSuccess. Ale nějak mi už nezapíná mozek, proč to hází když jsem ji definoval (ale asi špatně že…)

Jinak druhý presenter má stejný createComponent jen jiný redirect…

Nemůžu se hnout a je to celkem frustrující už.

Díky všem za odpovědi

CZechBoY
Člen | 3608
+
0
-

Nějak nevidim definovanou App\Front\Forms\SignInForm::$onLoginSuccess… Kde je jako definovaná?

theacastus
Člen | 81
+
0
-

V processForm v SignInForm třídě.

Šel jsem podle tohoto: https://doc.nette.org/…s/form-reuse

rkor
Člen | 62
+
+1
-
class SignInForm extends Control
{
    use \Nette\SmartObject;

	public onLoginSuccess;

    /**
     * @var FormFactory
     */
    private $factory;

...
theacastus
Člen | 81
+
0
-

Díky

facepalm