Flashmessage se po přihlášení nezobrazují

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

Dobrý den,

chtěl bych vás požádat o pomoc s následujícím problémem:

Mám presentery na registraci a přihlášení, které mi normálně vypisují flash zprávičky, z čehož lze usoudit, že layout bude správně. Po přihlášení se ale bohužel nezobrazí už žádná flash zprávička, a to v žádném presenteru :( Přitom po každé akci je v url normálně ?_fid=f8ea. Nevíte, čím by to mohlo být?

Za odpověď děkuji

PJK
Člen | 70
+
0
-

Nejdřív pro jistotu: Neprobíhá při přihlášení přesměrování na jinou stránku, než pro kterou jsou zprávy určeny?

Cifro
Člen | 245
+
0
-

Kedysi som aj ja chcel flash message po prihlasení a to na vypisanie, že sa uspešne prihlásil, ale to je somarina že? Veď keď ho to prihlasí tak ho to prihlasí, keď nie tak vypiše chybu pred prihlasovací formulár.

Ale v Nette je (asi ešte stále) bug, kedy nie je možné kombinovať (re)storeRequest s flashMessages.

Možno ti pomože, táto úprava re-storerequest-a-flashmessage?pid=18245#p18245

Editoval Cifro (3. 7. 2010 19:01)

darthcz
Člen | 113
+
0
-

No, mám presenter pro registraci, kde je po odeslání následující kód:

public function registrationFormSubmitted($form) {
		    try {
		      	$values = $form->values;


		      	if ($values['heslo'] != $values['heslo_confirm'])
		            throw new AuthenticationException('Vámi zadaná hesla se neshodují!');

            unset($values['heslo_confirm']);

		        $data = $this->registrate($values);


		        //indikator chyby $data[-1]
		        if (!isset($data[-1])){

		          $template = new Template;
		          $template->registerFilter(new LatteFilter);
              $template->setFile(APP_DIR.'/templates/Registrate/email.phtml');
              $template->email = $values['email'];
              $template->heslo = $values['heslo'];

              $mail = new Mail;
              $mail->setFrom('Krokus <info@krokus.cz>');
              $mail->addTo($values['email']);
              $mail->setSubject('Registrace do systému Krokus');
              $mail->setHtmlBody($template); // nebo $mail->setBody($template) pro textovou šablonu
              $mail->send();

			        $this->flashMessage('Byl jste úspěšně registrován(a).');
              $this->redirect('Login:login');
            }
			      else
			        throw new AuthenticationException($data['-1']);


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

Přesměruje to tedy uživatele na jiný presenter. Dříve to ale fungovalo. Nevím přesně, která úprava zkazila zobrazení například této zprávy… Ale v podstatě to nejde skoro nikde. V layoutu je to správně. Někde se hláška zobrazí.

V url adrese se nachází ?_fid=f5ef

darthcz
Člen | 113
+
0
-

Bez redirectu to vypadá, že to jde, ale já to potřebuji i s redirectem :(

odin
Člen | 50
+
0
-
Vyki
Člen | 388
+
0
-

Mně osobně fungují flash messages naprosto bez problémů. Mám poslední verzi Nette a běhá to vpohodě i při odhlašování a přihlašování. Odlaďuješ to na localu? Zkus tu chybu izolovat postupným zakomentováním kódu. Flash messages pracují se session, tak se mrkni jestli jí někde někde „neníčíš“.

darthcz
Člen | 113
+
0
-

odin napsal(a):

Nepomohlo by tohle?
https://forum.nette.org/…lash-message

bohužel nepomohlo :(

Zkusímj to odkomentovávání. Nicméně vše funguje pokud smažu řádek $this->redirect :P Když se nepřesměruje, vše běží, jak má. Jakmile se ale přesměruje, žádná hláška už není :(

uestla
Backer | 796
+
0
-

Co se děje v LoginPresenter::login(), resp. v jiných metodách živ. cyklu LoginPresenteru?

darthcz
Člen | 113
+
0
-

uestla napsal(a):

Co se děje v LoginPresenter::login(), resp. v jiných metodách živ. cyklu LoginPresenteru?

On v podstatě ani není důležitý zrovna LoginPresenter, jelikož to nejde v žádném presenteru s přesměrováním :(

LoginPresenter

class LoginPresenter extends BasePresenter
{

	/**
	 * Login form component factory.
	 * @return mixed
	 */
	function __construct(){
	    parent::__construct();
  }
	protected function createComponentLoginForm() {

      $form = new AppForm;

      $form->addText('email', 'E-mail:')
           ->addRule(Form::EMAIL, 'Zadejte prosím platnou e-mailovou adresu!');

      $form->addPassword('heslo', 'Heslo:')
           ->addRule(Form::FILLED, 'Zadejte prosím své heslo!');

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

		  $form->onSubmit[] = callback($this, 'loginFormSubmitted');

		  return $form;
	}



	public function loginFormSubmitted($form)
	{
		try {
			$values = $form->values;
		  $user = new User;

      // přihlášení
      $authenticator = new MyAuthenticator();

      $user->setAuthenticationHandler($authenticator);

      $user->login($values['email'], $values['heslo']);

			if ($user->isLoggedIn()){

			  $this->redirect('Clanky:show');
	    }
			else
			  throw new AuthenticationException('Špatný e-mail nebo heslo!');

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

	public function renderLogout() {
                Environment::getUser()->logout();
                $this->flashMessage('Byl jste úspěšně odhlášen.');
                $this->redirect('Login:login');
  }


}

}

BasePresenter

abstract class BasePresenter extends Presenter
{
    const TAB_USERS = 'users';
    const TAB_CLANKY = 'clanky';
    const TAB_KLICOVA_SLOVA = 'klicova_slova';
    const TAB_CLANKY_KLICOVA_SLOVA = 'clanky_klicova_slova';

    protected static $model;
    protected static $user;

    protected function startup(){
        parent::startup();
        if ((!Environment::getUser()->isLoggedIn()) && ($this->getAction() != 'login') && ($this->getAction() != 'registrate'))
            $this->redirect('Login:login');

        if (Environment::getUser()->isLoggedIn()) {
            if (($this->getAction() != 'restricted') && ($this->getAction() != 'login') && ($this->getAction() != 'registrate'))
               if ((!Environment::getUser()->isAllowed($this->name, $this->view)))
                  $this->redirect('Login:restricted');
        }

    }

    public function __construct(){
        self::$user = Environment::getUser();
            if (self::$user->getIdentity())
              $this->template->logged_user = self::$user->getIdentity()->getID();
            else
              $this->template->logged_user = false;
    }


}

login.phtml

{var robots => noindex}

{var title => " | Přihlášení"}



{block #content}

<div align="center">
<div id="login">

<h1>Krokus - přihlášení</h1>



{widget loginForm}

        <a href="{plink Registrate:registrate}" class="register-odkaz" title="Pro úspěšné přihlášení se musíte zaregistrovat !">Registrace</a>

</div>
</div>
darthcz
Člen | 113
+
0
-

tak chyba byla v constructoru v basepresenteru… zřejmě tam nesmí být, tak sem ho smazal… díky za pomoc..

Vyki
Člen | 388
+
0
-

darthcz napsal(a):

tak chyba byla v constructoru v basepresenteru… zřejmě tam nesmí být, tak sem ho smazal… díky za pomoc..

A nezapomněl jsi volat construktor rodiče?

<?php
class BasePresenter
{
	public function __construct()
	{
		//nejaky kod
		parent::__construct();
	}
}
?>

Pokud chceš nějaký blok kódu provádět v ranné fázi životního cyklu je lepší použít metodu startup.

<?php
class BasePresenter
{
	public function startup()
	{
		//nejaky kod
		parent::startup();
	}
}
?>
uestla
Backer | 796
+
0
-

Ono hlavně ty __constructory v ukázaných Presenterech nejsou „rodičně“ kompatibilní, správně musí být

public function __construct(IComponentContainer $parent = NULL, $name = NULL)
{
	// vlastni kod...
	parent::__construct($parent, $name);
}

Jinak rada viz Vyki ;)

darthcz
Člen | 113
+
0
-

Díky za rady :) Rodiče jsem zapomněl volat, nicméně přesunul jsem to do startupu a budu používat ten :)