TWIG 中的动态块名称

发布于 2024-11-29 19:02:10 字数 176 浏览 0 评论 0原文

我需要在模板中添加多个块,每个块都有不同的名称。

{% for item from items %}
    {% block item.name %}sometext{% endblock %}
{% endfor %}

但我收到错误。我该怎么做?

I need to add multiple blocks in my template, every with different name.

{% for item from items %}
    {% block item.name %}sometext{% endblock %}
{% endfor %}

But I get error. How can I do this ?

In

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

莫多说 2024-12-06 19:02:10

Twig 无法使用动态块名称。 GitHub 上对此进行了讨论。

Dynamic block names are not possible with Twig. There has been a discussion about it over at GitHub.

也只是曾经 2024-12-06 19:02:10

您可以使用block函数动态加载块。

{% for item in items %}
    {{ block( item.name )|raw }}
{% endfor %}

block 函数的 Twig 文档

You can load blocks dynamically using the block function.

{% for item in items %}
    {{ block( item.name )|raw }}
{% endfor %}

Twig documentation for the block function

泅渡 2024-12-06 19:02:10

如果我正确理解了这个问题,你可以这样做(使用父上下文):

parent.html.twig

{% for item from items %} 
  {% set currentLoopItemName = item.name %}
  {% block item_loop %}sometext{% endblock %}
{% endfor %}

override.html.twig

{% extends "base.html" %}

{% block item_loop %} 
  {% if item.name == 'custom' %}
      // do something
  {% else %}
     {{ parent() }}
  {% endif %}
{% endblock %}

If I understood the question correctly, you can do this (use parent context):

parent.html.twig

{% for item from items %} 
  {% set currentLoopItemName = item.name %}
  {% block item_loop %}sometext{% endblock %}
{% endfor %}

override.html.twig

{% extends "base.html" %}

{% block item_loop %} 
  {% if item.name == 'custom' %}
      // do something
  {% else %}
     {{ parent() }}
  {% endif %}
{% endblock %}
翻身的咸鱼 2024-12-06 19:02:10

我试图做同样的事情,并使用 template_from_string< 找到了解决方案/a> 函数。

_items.html.twig

{% for item in items %}
 {{ '{% block ' ~ item.name ~ ' %}'}}
 sometext
 {{ '{% endblock %}' }}
{% endfor %}
enter code here

page.html.twig

{% embed template_from_string(include('_items.html.twig')) %}
 {% block someItemName %} someDifferentText {% endblock %}
{% endembed %}

发生的情况是块标签最初被创建为文本。然后我们使用 include 函数来获取渲染的内容_items,作为字符串。最后,我们将该字符串转换为工作模板(我们可以嵌入< /a> 或 扩展)。

这是有效的,因为 template_from_string 函数将在运行时创建并编译模板,而通常 twig 是预先编译的并且在运行时不变。

I was attempting to do the same thing and found a solution using the template_from_string function.

_items.html.twig

{% for item in items %}
 {{ '{% block ' ~ item.name ~ ' %}'}}
 sometext
 {{ '{% endblock %}' }}
{% endfor %}
enter code here

page.html.twig

{% embed template_from_string(include('_items.html.twig')) %}
 {% block someItemName %} someDifferentText {% endblock %}
{% endembed %}

What's happening is the block tags are initially being created as text. Then we use the include function to get the rendered content of _items, as a string. Finally, we convert that string to a working template (which we can embed or extend).

This works because the template_from_string function will create and compile a template at runtime, where as normally twig is compiled before hand and unchanged at runtime.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文