使用Smarty大约一年后,我想尝试Twig。 当我切换语言时,我正面临着连接字符串和变量以动态构建页面标题的问题。
在Smarty中,控制器将变量传递给模板:
$title_it
和$title_en
对于页面的标题,我做<title>{$title_{$lang}}</title>
(其中$lang
是一个全局变量),我可以在更改语言时切换变量的值。
我无法在Twig中复制此行为。
我没有成功地尝试了以下方法:
{{ title_ ~ {{ lang }} }}
(我认为Twig认为变量“title_”不存在。
'title_'~{{ lang }}
(打印'title_it'而不是内容)
有没有办法保持这种逻辑并继续使用这种方法,还是我必须不同地处理页面的标题?
非常感谢,
曼努埃尔
答案 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_Runtime
和title_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
),则默认值为空字符串。
答案 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>