Twig在包含之前检查部分存在

时间:2016-08-03 07:56:00

标签: symfony twig

我正在开发一个相当复杂的多语言网站,它将根据html语言环境呈现不同的部分内容。

我有一个部分结构,它将使用附加到文件名的区域设置来选择正确的区域。例如;

{% include '@BundleName/Layout/Text/_partial-name.' ~ htmlLocale ~ '.html.twig' with {'title' : resource.title } %}

虽然这有效,但如果所选的区域设置尚未(部分)创建其部分,则存在风险,这将引发错误。我想要做的是在尝试渲染之前检查partial的存在,如果它还不存在则回退到默认值。

{% if '@BundleName/Layout/Text/_partial-name.' ~ htmlLocale ~ '.html.twig' %} 
    {% include '@BundleName/Layout/Text/_partial-name.' ~ htmlLocale ~ '.html.twig' with {'title' : resource.title } %}
{% else %}
    {% include '@BundleName/Layout/Text/_partial-name.html.twig' with {'title' : resource.title } %} 
{% endif %}

显然这不起作用,但这就是我追求的那种东西!

2 个答案:

答案 0 :(得分:8)

您可以使用ignore missing

,而不是测试部分是否存在
{% include 'partial.html' ignore missing %}

如果您希望在文件丢失时进行回退,则可以将数组传递给include函数。这将使include渲染成为数组中第一个找到的模板

{% include  [
                ('@BundleName/Layout/Text/_partial-name.' ~ htmlLocale ~ '.html.twig'), 
                '@BundleName/Layout/Text/_partial-name.html.twig'
            ] with {'title' : resource.title } %}

答案 1 :(得分:1)

如果值未定义或为空,您可以使用|default twig过滤器来确定变量的默认值:

htmlLocale|default('en')

您还可以检查变量是否为空和/或已定义:

{% if htmlLocale is not empty and htmlLocale is defined %} 
    {% include '@BundleName/Layout/Text/_partial-name.' ~ htmlLocale ~ '.html.twig' with {'title' : resource.title } %}
{% else %}
    {% include '@BundleName/Layout/Text/_partial-name.html.twig' with {'title' : resource.title } %} 
{% endif %}