3

Symfony2 和 Twig 有没有办法让只包含块的文件始终可用。

例如,如果我想让一个名为“cookie”的块在我的系统中的任何模板中始终可用,而不必总是在我正在使用的模板中包含或扩展它。

有任何想法吗?


澄清

假设我有一个通用块可以做一些事情,比如:

{% block myBlock %}
    ABC Examples
{% endblock %}

我有一个知道它想用这个块渲染的类。我的模板本身并不一定知道这一点。

 {{ block(myObj.blockName) }}

然后我想拥有它,以便我的控制器/服务/等。可以注册包含该块的文件,而我的模板实际上不需要直接知道它(所以我可以有多个这样的文件,每个文件都使用一些通用接口)。

类似于使用 TwigExtension 注册自定义 Twig 函数。我的模板不需要明确知道它的存在,它只需要在运行时可用。

那有意义吗?


为了进一步澄清,我本质上是想做一些事情,就像在 Symfony2 中如何使用默认的 Twig 块来呈现表单一样。我不必每次都包含默认表单文件,只是在我想更改某些内容时。

4

2 回答 2

2

我在 Symfony 源代码中四处挖掘,试图找到我的答案。看起来没有什么花哨、简洁的方法可以直接从配置文件或控制器中嵌入它,这有点令人失望,但也不是什么大不了的事。

因此,为了解决我的情况,我将使用“use”关键字将我的块文件包含在我的基本模板中,这样它就可以用于其他所有内容。

{# widget_blocks.html.twig #}
{# Widgets #}
{% block my_widget %}
    ABC Cookies
{% endblock %}

{# base.html.twig #}
{% use widget_blocks.html.twig %}
{{ block(my_widget.block) }}

不完全是我想要的,但足够接近。

于 2013-02-07T00:25:18.940 回答
0
{% render 'MyMainBundle:Default:credits' with {'arg1': $myObj } %}

这就是我说的。上面的行或有什么区别

{{ block(myObj.blockName) }}

您可以注册一个自定义过滤器,但据我所知,它只返回字符串值。http://twig.sensiolabs.org/doc/advanced.html#id2

于 2013-02-05T18:38:09.317 回答