Přihlášení uživatele z komponenty
- SvvimX
- Člen | 65
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
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
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
Ok promiň. Tak si presenter do třídy
CUserLoginFormHandler předej.
V 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()