FlashMessages don't work after redirect

6 months ago

josef.sabl
Backer | 152
+
0
-

Hey guys, I read through all the post about this topic but to no avail. My problem is flash messages don't show after redirect (They work well without redirecting).

I don't know where to look. The app is relatively clean sandbox nothing special.

My URL after redirect looks like this: http://localhost:88/?_fid=sdz1

And bdump of session on target page is here.

I don't know where to look and what piece of code to post.

I generate flash messages as simply as this:

$this->flashMessage('foo');
$this->redirect(":Homepage:Index:default");

I am on 3.0 beta.

6 months ago

Roman Halaxa
Member | 42
+
0
-

Hi. Do you have code to draw them in you Homepage:index:default latte file ? ?

taken from docs

{foreach $flashes as $flash}
    <div class="flash {$flash->type}">{$flash->message}</div>
{/foreach}

Make sure you have something like this in your template file of the page you're redirecting to

5 months ago

josef.sabl
Backer | 152
+
0
-

Yes, sure, I have that code in my layout that is extended by action templates. Just to make sure the template is fine I tried this action:

public function actionDefault()
{
    $this->flashMessage('foo');
}

and the flash message is rendered.

Roman Halaxa wrote:

Hi. Do you have code to draw them in you Homepage:index:default latte file ? ?

taken from docs

{foreach $flashes as $flash}
    <div class="flash {$flash->type}">{$flash->message}</div>
{/foreach}

Make sure you have something like this in your template file of the page you're redirecting to

5 months ago

David Grudl
Nette Core | 6864
+
0
-

I think the best way is to step through the code and see why it does not pass session data to the template.

5 months ago

josef.sabl
Backer | 152
+
0
-

Yeah, I love Xdebug, but in this case it is a bit problematic, with the nature of the flashmessages (session, redirects, 3 seconds expiration), but I'll try harder ;-)

5 months ago

josef.sabl
Backer | 152
+
0
-

Looks like: \Nette\Application\UI\Component::getParameter returns false ($this->params === []) even if I can see the parameters in the URL. Will try to look further into this.

5 months ago

josef.sabl
Backer | 152
+
0
-

However when I bdump $this->getParameters in the action code. It contains the params. Looks like something is called in the wrong order.

5 months ago

josef.sabl
Backer | 152
+
0
-

Hah, found it!

I had a presenter code like this:

/**
 * @param \Nette\Localization\ITranslator $translator
 */
public function injectTranslator(\Nette\Localization\ITranslator $translator): void
{
    assert($this->template instanceof \Nette\Bridges\ApplicationLatte\Template);
    $this->template->setTranslator($this->_internal_translator);
}

… and changed it to:

/**
 * @var \Nette\Localization\ITranslator $translator
 * @internal
 */
private $_internal_translator;

public function beforeRender() {
    assert($this->template instanceof \Nette\Bridges\ApplicationLatte\Template);
    $this->template->setTranslator($this->_internal_translator);
}

/**
 * @param \Nette\Localization\ITranslator $translator
 */
public function injectTranslator(\Nette\Localization\ITranslator $translator): void
{
    $this->_internal_translator = $translator;
}

Thanks @dg for extra motivation!!!

Btw, isn't there a way to register translator to template factory somehow? Or what is the best practice for setting the system-wide translator? I hate setting translator for presenter, email templates and maybe even form, separately.

Last edited by josef.sabl (2019-03-12 16:54)