使用变量名称中的index.loop创建并设置细枝变量的值

时间:2019-06-17 15:36:07

标签: symfony drupal twig

我需要定义一个树枝变量名称,该变量名称中可以包含index.loop值,以便以后可以在另一个循环中调用它。

我想做的是这样的:

{% for x in x.y.z %}
{% set myVar~index.loop = aValue %}
{% endfor %}

以后,我可以打电话给

{% if myVar2 == aValue %}
{{ display some stuff }}
{% endif %}

我的问题是我无法确定定义变量(myVar〜index.loop)的正确语法。

任何建议,深表感谢。

谢谢

1 个答案:

答案 0 :(得分:0)

您需要在此处解决两个问题:

  1. 您需要扩展twig才能创建动态变量

  2. 特殊变量_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中的任何原始值