předavání zpráv flashMessage

vlkodlak
Člen | 175
+
0
-

zdravím pánové,

mám presenter admina

final class AdminPresenter extends BasePresenter
{

  ...
  ...
  ...

   public function actionOut(): void
   {
      $this->getUser()->logout(true);
      $this->flashMessage('Odhlášení bylo úspěšné.');
      $this->redirect('Homepage:default');
   }

}

který funguje. Na konci při ukončení práce chci jen oznámit, že uživatel byl odhlášen, ale proste zpráva do layoutu nedojde :-(
zkusil jsem i případně

$this->presenter->flashMessage(...);
ForestCZE
Člen | 209
+
0
-

vlkodlak napsal(a):

zdravím pánové,

mám presenter admina

final class AdminPresenter extends BasePresenter
{

  ...
  ...
  ...

   public function actionOut(): void
   {
      $this->getUser()->logout(true);
      $this->flashMessage('Odhlášení bylo úspěšné.');
      $this->redirect('Homepage:default');
   }

}

který funguje. Na konci při ukončení práce chci jen oznámit, že uživatel byl odhlášen, ale proste zpráva do layoutu nedojde :-(
zkusil jsem i případně

$this->presenter->flashMessage(...);

Možná hloupá otázka, ale může se stát. Máš v @layout.latte vykreslení těch zpráv?

Nějak takto:

<div n:foreach="$flashes as $flash" n:class="alert, 'alert-' . $flash->type">{$flash->message}</div>
vlkodlak
Člen | 175
+
0
-

@ForestCZE to pravě funguje dokonce i ve stejném AdminPresenteru

například oznámení o přihlášení se mi zobrazí

final class AdminPresenter extends BasePresenter
{
  ...
  ...
  ...
   public function signInFormSucceeded(Form $form, \stdClass $values): void
   {
      $this->getUser()->login($values->username, $values->password);
      $this->flashMessage('Uživatel přihlášen.');
      $this->redirect('Admin:default');
   }
  ...
  ...
  ...
}

edit> jako kdyby tím redirektem fronta zpráv byla vymazaná

Editoval vlkodlak (8. 7. 2021 18:45)

ForestCZE
Člen | 209
+
0
-

vlkodlak napsal(a):

@ForestCZE to pravě funguje dokonce i ve stejném AdminPresenteru

například oznámení o přihlášení se mi zobrazí

final class AdminPresenter extends BasePresenter
{
  ...
  ...
  ...
   public function signInFormSucceeded(Form $form, \stdClass $values): void
   {
      $this->getUser()->login($values->username, $values->password);
      $this->flashMessage('Uživatel přihlášen.');
      $this->redirect('Admin:default');
   }
  ...
  ...
  ...
}

edit> jako kdyby tím redirektem fronta zpráv byla vymazaná

A když tam ten redirect není, tak se flashmsg vypíše?

vlkodlak
Člen | 175
+
0
-

pak ano, ale pak musím vytvořit šablonu out.latte u adminpresentera, která bude obsahovat duplicitní stránku nebo existuje možnost jak to vhodně nasměrovat na výchozí stránku homepage:default?

Petr Parolek
Člen | 455
+
-2
-

Viz https://doc.nette.org/…n/components#… . Opakování kodu je nejhorší, co můžeš udělat! Nevoláš obráceně kod – tj. nejprv redirect a pak flash message?

Marek Bartoš
Nette Blogger | 1280
+
0
-

Ono těch možných problémů existuje hned několik.

  • Pokud máš flashes v komponentě a ne presenteru, tak se může stát to, že template použiješ před připojením komponenty k presenteru – TemplateFactory bez dostupného presenteru neví kde vzít flashes a do template je nenastaví.
  • Nemáš nějak upravený router? Jestli se nepřenáší parametr _fid, tak není ani jak obnovit flashes po přesměrování
  • Když si zobrazíš obsah session, zůstává po přesměrování nově přidaný klíč začínající na Nette.Application.Flash/? Může se ti ztrácet aktuální session, pokud je aktivní secure cookie a přesměrovává se z https na http. Stejně tak můžeš o session přijít při problematickém připojení, protože se při přihlášení i odhlášení mění session id a pokud ti nedorazí hlavička s novým id, tak se session smaže.

Osobně bych to asi ani neřešil. Uživatel má vidět z UI že je přihlášený, není třeba mu interface přehlcovat flashes :)

Opakování kodu je nejhorší, co můžeš udělat!

Duplicity jsou úplně to poslední, co má člověk u čistého kódu řešit. Mnohem horší je předčasná abstrakce (deduplikace), která zkomplikuje kód. Tak trochu uber se silnými slovy, díky.

Editoval Marek Bartoš (9. 7. 2021 11:30)

vlkodlak
Člen | 175
+
0
-

@PetrParolek a @MarekBartoš kluci, ne, nejedna se o componentu, ale o normální adminpresenter viz výše, který má obsluhovat pozadí webu

@MarekBartoš ano souhlasím, uživatel hned vidi z front endu kde je a co může dělat … teď chci pochopit proč to nezobrazí a co mohu proto udělat, abych to „napravil“ … jedna se o nijak neupravenou verzi sandboxu staženou z githubu přidán jen ten adminpresenter

ViPEr*CZ*
Člen | 820
+
0
-

Mně je divný, že login ukáže flash a logout ne. Při logout je v url parametr _fid?

vlkodlak
Člen | 175
+
0
-

@ViPEr*CZ*

jen doplním: logout ukáže message pokud tam nebude

$this->redirect('Homepage:default');

a doplnim do template šablonu

out.latte

edit: ano, je tam

http://gind/?_fid=9q30

Editoval vlkodlak (10. 7. 2021 1:01)