变量连接

时间:2018-01-30 23:56:52

标签: twig

使用Smarty大约一年后,我想尝试Twig。 当我切换语言时,我正面临着连接字符串和变量以动态构建页面标题的问题。

在Smarty中,控制器将变量传递给模板: $title_it$title_en 对于页面的标题,我做<title>{$title_{$lang}}</title>(其中$lang是一个全局变量),我可以在更改语言时切换变量的值。 我无法在Twig中复制此行为。 我没有成功地尝试了以下方法:

{{ title_ ~ {{ lang }} }}(我认为Twig认为变量“title_”不存在。

'title_'~{{ lang }}(打印'title_it'而不是内容)

有没有办法保持这种逻辑并继续使用这种方法,还是我必须不同地处理页面的标题?

非常感谢,

曼努埃尔

3 个答案:

答案 0 :(得分:2)

_context变量包含当前上下文中的所有变量,因此您可以执行以下操作:

{{ _context['title_' ~ lang]|default }}

这与使用attribute function

基本相同
{{ attribute(_context, 'title_' ~ lang)|default }}

我个人会使用前者,因为它更简洁,在我看来更清晰。

default filter strict_variables设置为true时需要environment option(默认值为false,但我更喜欢将其设置为{ {1}}以避免因拼写错误导致的意外问题,否则如果变量不存在,您将获得true异常。例如,如果您有变量Twig_Error_Runtimetitle_en但是尝试输出变量title_it(不存在),则会使用消息title_de获得该异常。

检查变量是否存在的更详细的方法是使用defined test

Key "title_de" for array with keys "title_en, title_it, lang" does not exist

使用{% if _context['title_' ~ lang] is defined %} ... {% endif %} 过滤器,您还可以提供默认值:

default

如果省略默认值(即您执行{{ _context['title_' ~ lang]|default('Default title') }} 而不是|default),则默认值为空字符串。

See TwigFiddle

答案 1 :(得分:0)

我认为这里可以解决你的问题。

控制器代码:

 return $this->render('myTwig.html.twig', array(
            'lang'=>'en',
            'title_en'=>'English Title',
            'title_it'=>'Italian Title'
        ));

Twig代码:

{% set myVar='title_'~lang  %}
{{ attribute(_context, myVar) }}

这将显示&#34;英文标题&#34;在你的页面上。 这里_context变量是树枝中的魔术变量,您可以在其中找到从控制器传递到此树枝的所有参数。

attribute(_context,myVar)

它将传递的参数键值显示为值。

希望这能解决您的问题。 谢谢

答案 2 :(得分:-1)

我会更改控制器以预先计算title的语言相关值,然后再将其传递给树枝模板。如果你不能(不愿意)这样做,那么......

<title>{% if lang == 'it' %}{{ title_it }}{% else %}{{ title_en }}{% endif %}</title>