【问题标题】:How to access dynamic variable names in twig?如何访问树枝中的动态变量名?
【发布时间】:2014-09-02 01:18:24
【问题描述】:

我在树枝中有一些变量,比如

placeholder1
placeholder2
placeholderx

要调用它们,我正在遍历对象数组“发票”

{% for invoices as invoice %}
    need to display here the placeholder followed by the invoice id number
    {{ placeholedr1 }}

【问题讨论】:

  • 你在哪里定义占位符 1 - x?它们是全球可访问的吗?每张发票都有自己的占位符吗?
  • 我在控制器中定义它们并将它们传递给树枝模板。
  • 你能告诉我你定义和传递它们的代码吗?那我应该可以帮你:)
  • 您是否可以不设置创建一个占位符数组并像{{ placeholder[invoice.id] }} 一样调用它们,或者,在服务中生成占位符,然后使用您的发票或 invoice.id 在 TwigExtensions 中调用它?
  • 谢谢大家,但作为一种解决方法,我在我的 Invoice 实体中创建了一个新方法,我在其中设置占位符。

标签: php symfony twig


【解决方案1】:

我刚刚遇到了同样的问题 - 使用第一个答案,经过一些额外的研究发现 {{ attribute(_context, 'placeholder'~invoice.id) }} 应该可以工作(_context 是包含所有对象名称的全局上下文对象)

【讨论】:

  • 看来如果你在macro中使用_context,它只会看到macro范围内定义的变量,但看不到全局变量。
【解决方案2】:

除了使用attribute function,您还可以使用常规括号表示法访问_context 数组的值:

{{ _context['placeholder' ~ id] }}

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

如果environment option strict_variables 设置为true,您还应该使用default 过滤器:

{{ _context['placeholder' ~ id]|default }}

{{ attribute(_context, 'placeholder' ~ id)|default }}

否则,如果变量不存在,您将收到 Twig_Error_Runtime 异常。例如,如果您有变量 foobar,但尝试输出变量 baz(它不存在),则会收到带有消息 Key "baz" for array with keys "foo, bar" does not exist 的异常。

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

{% if _context['placeholder' ~ id] is defined %} ... {% endif %}

使用default 过滤器,您还可以提供默认值,例如null 或字符串:

{{ _context['placeholder' ~ id]|default(null) }}

{{ attribute(_context, 'placeholder' ~ id)|default('Default value') }}

如果您省略默认值(即使用|default 而不是|default(somevalue)),默认值将是一个空字符串。

strict_variables 默认为false,但我更喜欢将其设置为true 以避免由例如引起的意外问题。错别字。

【讨论】:

    【解决方案3】:

    我猜你可以使用 Twig attribute 函数。

    http://twig.sensiolabs.org/doc/functions/attribute.html

    【讨论】:

    • 谢谢,我播种了,但这怎么能适用于我的例子?
    • 这行得通吗? {{ 属性(app, 'placeholder'~invoice.id) }}
    • 不,它告诉我全局变量 placeholdersxx 不存在。
    【解决方案4】:

    我对这个问题的解决方案:

    创建占位符数组(x)。喜欢:

    # Options
    $placeholders = array(
        'placeholder1' => 'A',
        'placeholder2' => 'B',
        'placeholder3' => 'C',
    );
    
    # Send to View ID invoice
    $id_placeholder = 2;
    

    发送两个变量以供查看和模板调用:

    {{ placeholders["placeholder" ~ id_placeholder ] }}
    

    这个打印“B”。

    希望对你有所帮助。

    【讨论】:

      【解决方案5】:

      我找到了解决办法:

      attribute(_context, 'placeholder'~invoice.id)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-13
        • 2023-03-13
        • 2018-09-21
        相关资源
        最近更新 更多