如何在base.html.twig中访问peekAll()以检查消息/闪烁



In symfony 4.1

在控制器中:

$this->addFlash(
'notice',
'Your changes were saved!'
);
return $this->render(...);

树枝底座模板:

{% for message in app.flashes('notice') %}
<div class="flash-notice">
{{ message }}
</div>
{% endfor %}

这工作正常,但我想将所有消息包装在一个div 中。 以下方法不起作用:

{% if app.flashes is not empty %}
<div id="messageBox" class="overlay">
<div class="message" onclick="slide(document.querySelector('#messageBox')); this.classList.add('fadeAway');">
{% for label, messages in app.flashes %}
<section class="{{ label }}">
<p><b>{{ label }}</b></p>
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
</section>
{% endfor %}
</div>
</div>
{% endif %}

问题是该行{% if app.flashes is not empty %}擦除消息,因此以下 for 循环和空结果。

如何将peekAll()用于if逻辑?

检查peekAll()的正确方法是{% if app.session.flashbag.peekAll() is not empty %}根据文档,这不会清除flashBag。

我不知道这是否是最好的方法,但以下是我的解决方案。

在底座.html.twig:

{% set flashes = app.flashes %}
{% if flashes is not empty %}
<div id="messageBox" class="overlay">
<div class="message" onclick="slide(document.querySelector('#messageBox')); this.classList.add('fadeAway');">
{% for label, messages in flashes %}
<section class="{{ label }}">
<p><b>{{ label }}</b></p>
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
</section>
{% endfor %}
</div>
</div>
{% endif %}

基本上,将返回值app.flashes设置为flashes并进行处理。

最新更新