【问题标题】:Can I use variable variables in TWIG?我可以在 TWIG 中使用可变变量吗?
【发布时间】:2012-08-23 08:20:08
【问题描述】:

我使用 symfony2 和 TWIG,我想使用一些全局变量来指向页面中平板电脑的索引:

app/config/parameters.ini

tab_branch="1"

app/config/config.yml

twig:
    globals:
        tab_branch: %tab_branch%

src/ACME/BranchBundle/Controller/defaultController.php

/**
 * @Template()
 */
public function showAction($id) {
    ...
    return array(
        'tab' => 'tab_branch',
    );
}

src/ACME/BranchBundle/Resources/views/default/show.html.twig

<input type="hidden" id="tablndex" value="{{ {{ tab }} }}" />  //not working

我真正想做的是将{{ tab }}解析为tab_branch,然后将{{ tab_branch }}解析为1(就像PHP中的$$foo一样),我该怎么办?

【问题讨论】:

  • 对不起,但这只是代码味道不好。维持这将是一场噩梦。您能否详细说明您要解决的问题到底是什么?
  • 感谢您的建议。我真正想做的只是标记当前选项卡。现在我使用querystring在页面之间传递tabindex,即abc.com/branch?idx=1,但我真的想丢弃querystring,你能建议其他解决方法吗?
  • 根据网站的复杂程度,您可以检查模板中的当前路线 ({{ app.request.attributes.get('_route') == 'FooBar' ? 'foo' : 'bar' }}) 或选择更复杂的内容,例如 writing a custom twig extension 或使用 KnpMenuBundle。跨度>

标签: symfony twig


【解决方案1】:

这不能按照您尝试的方式完成,twig 不能那样工作。如果选项卡的可能值不多,您可以执行以下操作:

{% if tab == 'tab_branch' %}
    {{tab_branch}}
{% else if tab == 'other_tab' %}
    {{other_tab}}
{% endif %}

我知道,不是很优雅……

【讨论】:

  • 感谢您的回复,我已经考虑过这种方法,但我担心如果我以后需要添加更多标签,我需要深入所有相关页面来更改 if-逻辑。
【解决方案2】:

编写一个自定义函数来允许这样的评估。

您可能对此提案感兴趣eval function

【讨论】:

  • 感谢您的重播,我阅读了链接,但看不到如何使其工作,您能给我一些示例代码吗?
【解决方案3】:

我使用 twig 语法在数据中的任何位置引用其他变量中的变量:

foo: "{{ bar.baz }}/quu.txt"
bar:
    baz: /tmp

然后我渲染直到结果不再改变:

    while( $template !== ($result = $twig->render($template, $data)) )
    {
        $template = $result;
    }

这是

  • 不优雅:每个变量值都应该在嵌入之前呈现
  • 不足:变量名在使用前没有渲染,所以 foo.{{i}} 不起作用
  • 简单:我不必引用过滤器或代码,只需引用变量。
  • small:上面的实现很短,希望很清楚。也可以是单行递归方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-14
    • 2019-12-13
    • 1970-01-01
    • 2014-10-26
    • 2013-03-25
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多