我需要定义一个树枝变量名称,该变量名称中可以包含index.loop值,以便以后可以在另一个循环中调用它。
我想做的是这样的:
{% for x in x.y.z %}
{% set myVar~index.loop = aValue %}
{% endfor %}
以后,我可以打电话给
{% if myVar2 == aValue %}
{{ display some stuff }}
{% endif %}
我的问题是我无法确定定义变量(myVar〜index.loop)的正确语法。
任何建议,深表感谢。
谢谢
答案 0 :(得分:0)
您需要在此处解决两个问题:
您需要扩展twig
才能创建动态变量
特殊变量_context
不会(直接)发送到循环,而是存储在_context['_parent']
延伸树枝
class MyTwigExtension implements \Twig\Extension\ExtensionInterface {
/**
* Returns the token parser instances to add to the existing list.
*
* @return \Twig\TokenParser\TokenParserInterface[]
*/
public function getTokenParsers() {
return [];
}
/**
* Returns the node visitor instances to add to the existing list.
*
* @return \Twig\NodeVisitor\NodeVisitorInterface[]
*/
public function getNodeVisitors() {
return [];
}
/**
* Returns a list of filters to add to the existing list.
*
* @return \Twig\TwigFilter[]
*/
public function getFilters() {
return [];
}
/**
* Returns a list of tests to add to the existing list.
*
* @return \Twig\TwigTest[]
*/
public function getTests() {
return [];
}
/**
* Returns a list of functions to add to the existing list.
*
* @return \Twig\TwigFunction[]
*/
public function getFunctions() {
return [
new \Twig\TwigFunction('set', [ $this, 'setValue'], [ 'needs_context' => true,]),
];
}
/**
* Returns a list of operators to add to the existing list.
*
* @return array<array> First array of unary operators, second array of binary operators
*/
public function getOperators() {
return [];
}
/**
* Set reference to $context so you can modify existing values
* Test if key _parent is set. If true this means the function was called inside a loop
**/
public function setValue(&$context, $key, $value) {
if (isset($context['_parent'])) $context['_parent'][$key] = $value;
$context[$key] = $value;
}
}
将扩展名添加到树枝
$twig->addExtension(new \MyTwigExtension());
现在您可以在模板内使用函数set
,例如
{% set foo = 'bar' %}
{% do set('my_var_'~foo, 'foo') %}
{{ my_var_bar }} {# output: foo #}
或在循环内
{% for i in 1..10 %}
{% do set ('my_var_'~i, i) %}
{% endfor %}
{{ my_var_6 }} {# output: 6 #}
正如我所说,即使将needs_context
设置为true,特殊变量_context
也不会直接发送到该函数。 Twig
将_context
的当前内容复制到_parent
内,以便循环获得其自己的变量私有范围,并且您不能覆盖_context
中的任何原始值>