TWIG:变量在长列表中定义

时间:2015-07-14 09:32:24

标签: symfony twig

我正在构建一个显示用户数据的Twig页面;数据来自用户和配置文件实体(您可以从用户访问)。

为了避免页面在变量为null时显示错误,我必须检查是否定义了每个变量(这使代码更加重,如你所见)。

        <dt>firstname:</dt>
            {% if user.firstname is defined %}
                <dd>{{ user.firstname|title }}</dd>
            {% endif %}
        <dt>lastname:</dt>
            {% if user.lastname is defined %}
                <dd>{{ user.lastname|title }}</dd>
            {% endif %}
        <dt>Email address:</dt>
            {% if user.lastname is defined %}
                <dd>{{ user.email|title }}</dd>
            {% endif %}
        <dt>Birthday:</dt>
            {% if user.profile.birthday is defined %}
                <dd>{{ user.profile.birthday|date("d M y") }}</dd>  
            {% endif %}
        <dt>Mobile phone:</dt>
            {% if user.profile.mobilePhone is defined %}                
                <dd>{{ user.profile.mobilePhone }}</dd>
            {% endif %}
        <dt>Landline:</dt>
            {% if user.profile.landline is defined %}                
                <dd>{{ user.profile.landline }}</dd>
            {% endif %}  
        <dt>Website:</dt>
            {% if user.profile.website is defined %}                
                <dd>{{ user.profile.website }}</dd>
            {% endif %} 

有没有办法避免这样做?在显示之前检查变量是否定义的更好更短的方法是什么?

3 个答案:

答案 0 :(得分:4)

不知道这是否符合您的需求,但您可以这样做:

<dd>{{ user.profile.landline|default("") }}</dd>

对于过滤后的数据,方法类似:

<dd>{{ user.firstname|default("")|title }}</dd>

现在问题就出现了。我假设,您不希望将其默认为today或其他任何其他内容。

@Francesco 也发布了非常简单的解决方案,因此根据您真正想要实现的目标可能会更好(例如,只有在定义数据时打印<dd>,日期属性,等...)。

希望这有帮助

答案 1 :(得分:1)

直接回答你的问题:不,除了使用三元运算符外,AFAIK没有捷径:

{{ user.profile.landline is defined ? user.profile.landline : "" }}

甚至更短的语法

{{ user.profile.landline is defined ? user.profile.landline }}

但是我要说这些检查应该在控制器中进行,以便始终定义Twig中的变量。你在Twig模板中的条件越少越好。

答案 2 :(得分:0)

您还可以更改树枝的配置:

  

如果变量或属性不存在,当strict_variables选项设置为false时,您将收到一个空值;或者,如果设置了strict_variables,Twig将抛出错误(请参阅环境选项)。   Source

在config.yml的正确部分添加以下行:

twig:
     strict_variables: false

Here你得到了更多信息。

编辑: 正如@Jovan Perovic在评论部分已经提到的那样,这个解决方案有点冒险。设置strict_variables: false之后,即使您在变量名称中输入了一个简单的拼写错误,Twig也不会抛出有关您使用的变量的任何异常。这可以使您的代码验证更加复杂。