2017-02-23 103 views
4

如果我有这样的代码块:有没有一种方法可以在Twig模板中编写多行代码?

{% if app.user is defined %} 
    {% set isOwner = user.isEqualTo(app.user) %} 
{% else %} 
    {% set isOwner = false %} 
{% endif %} 

是否有可能把它写不包装在标签中的每一行,也是这样吗?

{% if app.user is defined 
    set isOwner = user.isEqualTo(app.user) 
else 
    set isOwner = false 
endif %} 

上面的代码显然不起作用,因为没有行结束符。添加;也不起作用。

如果线条很多,事情会变得非常复杂。

更新:

虽然DarkBee的回答是缩短语法,警惕传递null到可以期待一个特定的类的对象方法的方式。我们最终与去代码的最终版本比原来的问题也不遑多让,但至少少了一个行:

{% set isOwner = false %} 
{% if app.user is not null %} 
    {% set isOwner = user.isEqualTo(app.user) %} 
{% endif %} 

这样,布尔标志总是设置和方法从未收到null目的。另外,如果您担心会有额外的空间蔓延到您的HTML中(作为缩进的结果),那么避免这种情况的最好方法是将整段代码包装到{% spaceless %}...{% endspaceless %}标记中。

+0

@DarkBee这也很有趣! – aalaap

+0

@DarkBee我希望你已经发布了这个答案! – aalaap

+1

小心你想要什么 – DarkBee

回答

3

一个较短的方式做,这就是:

{% set isOwner = user.isEqualTo(app.user|default(null)) %} 
+0

但这不是多行代码。我们是否应该认为这是不可能的? – Fernando

+0

@Fernando不确定你在问什么?原始代码片段是多行和OP想要一个精简(更短吗?)方法 – DarkBee

+0

谢谢@DarkBee,可能是我误解了这个问题。我的意思是你的代码不是“精简的多行代码”,而是“更精简的单行代码”。我来到这个问题寻找一种方式来写几行,而不是将它们中的每一行都包含在括号内,这就是我的意思,如果可能或不可以。 – Fernando

3

我觉得没有,你可以使用三元运算符,如:

{% set isOwner = (app.user is defined and user.isEqualTo(app.user)) ? true : false %} 

希望这有助于

更多信息here在doc

+3

不需要放置'? true:false'尽管 – DarkBee

+1

hi @DarkBee很好的抓住! – Matteo

相关问题