2016-08-03 35 views
2

我正在研究一个相当复杂的多语言站点,它将根据html语言环境呈现不同的部分。Twig在包含之前检查部分存在

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

{% 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 %} 

很明显,这是行不通的,但那是我以后的事!

回答

5

而不是测试是否存在局部可以使用ignore missing

{% include 'partial.html' ignore missing %} 

如果你想有一个后备的文件丢失时,你可以传递一个数组include函数。这将使包括渲染找到的第一个模板阵列

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

完美,这正是我所需要的。 – Alex

1

您可以使用|default树枝过滤器,以确定默认值中的变量如果该值是未定义或空:

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 %} 
+0

我想你可能已经略微错过了这个问题的要点;如果设置了区域设置,则不是文本,而是测试该部分是否存在。 @DarkBee非常重要 – Alex

相关问题