【问题标题】:TWIG: variable is defined in a long listTWIG:变量在一个长列表中定义
【发布时间】:2015-07-14 09:32:23
【问题描述】:

我正在用 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 %} 

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

【问题讨论】:

    标签: symfony twig


    【解决方案1】:

    不知道这是否能满足您的需求,但您可以做到:

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

    至于过滤后的数据,做法类似:

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

    现在,问题出在日期上。我假设,您不想将其默认为 today 或任何其他的。

    @Francesco 还发布了非常简单的解决方案,因此它可能会更好,具体取决于您真正想要实现的目标(例如,仅在定义数据、日期属性等时打印 &lt;dd&gt; ..)。

    希望对你有帮助

    【讨论】:

    • 这是 IMO 的最佳答案
    【解决方案2】:

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

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

    甚至更短的语法

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

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

    【讨论】:

    • 我不知道这个更短的语法;)整洁:)
    【解决方案3】:

    您还可以更改 twig 的配置:

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

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

    twig:
         strict_variables: false
    

    Here你得到了更多信息。

    编辑: 正如评论部分中已经提到的@Jovan Perovic,这个解决方案有点冒险。设置strict_variables: false Twig 后不会对你使用的变量抛出任何异常,即使你在变量名中做了一个简单的错字。这会使您的代码验证更加复杂。

    【讨论】:

    • 你能解释一下为什么是@JovanPerovic吗?
    • 禁用严格的变量检查(应用程序范围)会使您对错误(变量的拼写错误)敞开大门。反过来,您将需要投入更多时间来测试您的应用程序,以确认功能的正确性。突然,您发现自己不确定您的数据是否真的是空的,或者您只是输入了错误的名称,对吧?
    • @JovanPerovic 谢谢。这当然有些冒险,因此可能不是最佳解决方案。将在我的回答帖子中添加这个疑问。干杯。
    • 再解释一下为什么使用strict_variables 是有风险的,但这是一个很好的答案。考虑添加@JovanPerovic cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2013-01-25
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    相关资源
    最近更新 更多