Přihlášení uživatele z komponenty

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

Ahoj,

začínám s Nette ale chci to dělat pořádně, když už.

Takže, mám komponentu CAsideComponent

<?php
use Nette\Application\UI\Control;
use Nette\Application\UI\Form;
use Nette\Forms\Controls\SubmitButton;

class CAsideComponent extends Control
{

    protected function createComponentLoginForm ( ) {
        $loginForm = new CUserLoginForm( );
        $loginForm -> onSuccess [] = callback( new CUserLoginFormHandler(), "logIn" );
        return $loginForm;
    }

    public function render ( )
    {
        $template = parent::createTemplate();
        $template -> setFile ( __DIR__ . '/CAsideComponent.phtml' );

        $template -> loginForm = $this -> getComponent('loginForm');

        $template -> render ( );
    }

}
?>

a v ní CUserLoginForm což je formulář

<?php
use Nette\Application\UI\Form;

class CUserLoginForm extends Form;
?>

Handler formuláře je v další třídě CUserLoginFormHandler a při onSuccess [] se zavolá metoda logIn.

<?php

use Nette\Security as NS;

class CUserLoginFormHandler {

    /**
     * Přihlášení z přihlašovacího formuláře ( Handler CUserLoginFormu )
     * @param CUserLoginForm $form
     */
    public function logIn ( CUserLoginForm $form ) {

        try {
            $values = $form -> getValues ( );

            if ( $values -> remember ) {
                    **Nette\Environment::getUser()** -> setExpiration ( '+ 14 days', FALSE );
            } else {
                    **Nette\Environment::getUser()** -> setExpiration ( '+ 20 minutes', TRUE );
            }

            **Nette\Environment::getUser()** -> login ( $values -> login, $values -> password );


        } catch ( NS\AuthenticationException $e ) {
            $form -> addError ( $e -> getMessage ( ) );
        }

    }

}
?>

Prolbém je, že obsloužení logIn formuláře by mělo přihlásit uživatele. Což jak jsem pochopil je možné jenom z presenteru? V každém presenteru je možné zavolat $this → getUser (); Sice jsem našel, že se to nechá obejít přes Environment ale ten je deprecated.

Poradíte jak na to? Nebo to dělám nějak uplně špatně? Objevil jsem nějaké zmínky o appForm případně o signálech presenteru, ale moc nechápu.

Chtěl bych nastínit „správné“ řešení, abych se neučil od začátku prasárny :-) Moc díky

Michal Vyšinský
Člen | 608
+
0
-

V komponentách používej $this->presenter->getUser(). To samé platí o contextu, zjištění jestli to byl ajax a taky invalidace control.

Editoval CherryBoss (15. 4. 2012 0:08)

SvvimX
Člen | 65
+
0
-

CherryBoss napsal(a):

V komponentách používej $this->presenter->getUser(). To samé platí o contextu, zjištění jestli to byl ajax a taky invalidace control.

Já ale nemám metodu která se zavolá při odeslání formuláře v komponentě, ale ve tříde CUserLoginFormHandler. V ní $this → preseneter není. viz výše CUserLoginFormHandler :: logIn ()

Michal Vyšinský
Člen | 608
+
0
-

Ok promiň. Tak si presenter do třídy CUserLoginFormHandler předej.
CAsideComponent:

protected function createComponentLoginForm ( ) {
        $loginForm = new CUserLoginForm( );
        $loginForm -> onSuccess [] = callback( new CUserLoginFormHandler($this->presenter), "logIn" );
        return $loginForm;
    }

A třídě CUserLoginFormHandler přidej property, kterou v constructoru nastav. Takže ve třídě CUserLoginFormHandler udělej toto:

public function __construct(Nette\Application\UI\Presenter $presenter) {
	$this->presenter = $presenter;
}

A pak už můžeš v CUserLoginFormHandler volat $this->presenter->getUser()

SvvimX
Člen | 65
+
0
-

OK díky moc,

možná že už trochu překombinovávám s tím, že každý formulář má další třídu s handlerem, ale zase sem někde tady četl, že to je více flexibilní, na změny a i přehlednější, že obsluha formuláře není v nějakém presenteru (login by musel být asi v BasePresenteru).