在 Twig 中动态生成/省略 HTML 属性

Dynamically generate / omit HTML attribute in Twig

提问人:DevelJoe 提问时间:2/9/2022 最后编辑:DevelJoe 更新时间:2/9/2022 访问量:347

问:

我想生成一个 div,其中存在或不存在特定的 HTML 属性,以决定是否定义了变量。如果已定义,则应将其值用作相应的属性。my_var

my_var要么未定义,要么等于由空格分隔的几个单词组成的值(软件需要这些,我知道这并不常见......

我尝试了以下方法:

<div class="container" {{ my_var ? "data-my-var='" ~ {{ my_var }} ~ "'" : ""}}>
</div>

但这转义了我使用的引号,并在我的输出中产生了这样的 sth,其中:my_var = hello there how are you

<div class="container" data-my-var=&quot;hello there how are you&quot;>
</div>

当我使用

"data-my-var=\"" ~ {{ my_var }} ~ "\""

而不是上面写的。

我也试着简单地省略引号,所以像这样:

"data-my-var=" ~ {{ my_var }}

这导致输出的属性没有任何引号;因此只识别 值的第一个单词。data-my-varmy_var

那么,我怎样才能达到我想要的呢?

symfony twig 转义 引号条件 运算符

评论

2赞 Bossman 2/9/2022
怎么样?不确定我是否理解你的问题..{% if my_var %}data-my-var="{{ my_var }}"{% endif %}
0赞 DevelJoe 2/9/2022
没错,本来也是一种方式,干杯!

答:

1赞 DarkBee 2/9/2022 #1

默认情况下,变量和与变量的串联不会标记为安全。您需要应用过滤器以将输出标记为安全。此外,如果您只返回一个空字符串,您可以省略第二部分raw

<div class="container"{{ my_var ? (' data-my-var="' ~my_var ~ '"')|raw }}>
</div>

演示


正如 @Bossman 所评论的那样,另一种方法是使用{% if ... %}{% endif %}

评论

0赞 DevelJoe 2/9/2022
灿烂,像魅力一样工作。我已经接受了你的提议作为答案,因为它更接近我的语法,希望这对@Bossman没问题!
0赞 Bossman 2/9/2022
@DevelJoe完全没问题,只要你得到你需要的东西。我总是想到“奥卡姆剃刀”和除了我自己之外的任何人的可读性:)
0赞 DevelJoe 2/9/2022
仅供参考,我的语法解析器实际上报告说,您不允许在标签内编写 twig 标签,只能编写 twig 表达式(尽管解析与采用的 twig 标签解决方案完美配合)。但是语法解析器和 twig 是另一本书的章节。.{% if ... %}{% endif %}