Twig变量变量

时间:2015-03-17 13:46:07

标签: twig

有一些Twig数组:

  • feeds,其中Feed为category_name;

  • eventsnewsannounces发帖。

因此,我可以通过以下方式获取某个类别的帖子:

{% for feed in feeds %}
  {% if feed.category_name == "events" %}
  {% for post in events %}
    {{post.title}}
  {% endfor %}
  {% endif %}
{% endfor %}

我可以获得相同的输出(如上面一个循环返回),并将category_name字符串设置为数组名称吗?

此处feed.category_name返回events

{% for feed in feeds %}
  {% for post in feed.category_name %} {# feed.category_name == "events" #}
    {{post.title}}
  {% endfor %}
{% endfor %}

4 个答案:

答案 0 :(得分:1)

我认为作者的意思是 - 使用从另一个变量派生的名称访问数组。因此,不需要额外的条件(这里的大多数答案都提出了额外的条件)。

基于我几分钟的研究,Volt一个人不会让你这么做。但是,由于您可以在Volt模板中嵌入PHP代码,并且稍后将twig文件编译为PHP,您可以执行以下操作:

{% for feed in feeds %}
  <?php foreach (${$feed.category_name} as $post) { ?>
    {{post.title}}
  <?php } ?>
  {% endif %}
{% endfor %}

我已经测试了这个 - 它确实有效。如果数组存在,您可能需要额外检查,以避免出现警告:

{% for feed in feeds %}
  <?php 
    if (!empty(${$feed.category_name})) { 
      foreach (${$feed.category_name} as $post) { 
  ?>
          {{post.title}}
  <?php } } ?>
  {% endif %}
{% endfor %}

如果您不喜欢在模板中嵌入PHP的想法 - 请不要忘记您的模板将被编译为PHP!

答案 1 :(得分:1)

全局变量_context包含当前上下文中的所有变量,因此您可以这样做:

{% for feed in feeds %}
    {% for post in _context[feed.category_name]|default(null) %}
        {{ post.title }}
    {% endfor %}
{% endfor %}

如果找不到变量,则需要|default(null)来防止Twig抛出异常。

See TwigFiddle

答案 2 :(得分:0)

您希望将条件“添加”到循环中吗?我认为你的意思是Twig Documentation

<ul>
    {% for user in users if user.active %}
        <li>{{ user.username|e }}</li>
    {% endfor %}
</ul>

修改 你的主要问题是“变量变量”。您可以使用the attribute()函数解决此问题,并将不同的Feed合并到一个关联数组中(类别?)。

所以也许(未经测试):

{% for feed in feeds %}
  {% for post in attribute(categories, feed.category_name) %}
    {{post.title}}
  {% endfor %}
{% endfor %}

答案 3 :(得分:0)

根据您的评论:

{% set new_array = news|merge(events) %}
{% for feed in feeds if attribute(feed.category_name, ['events', 'news']) %}
     {% for post in new_array %}
         {{post.title}}
     {% endfor %}
  {% endif %}
{% endfor %}