Symfony2 Twig注入其他块

时间:2013-02-05 18:05:56

标签: php templates symfony twig

是否有办法让Symfony2和Twig始终提供只包含块的文件。

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

有什么想法吗?


澄清

假设我有一个可以执行某些操作的通用块,例如:

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

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

 {{ block(myObj.blockName) }}

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

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

这有意义吗?


为了进一步澄清,我基本上想要做一些事情,就像在Symfony2中渲染Forms的默认Twig块一样。我不必每次都包含默认的表单文件,就在我想要更改内容时。

2 个答案:

答案 0 :(得分: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) }}

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

答案 1 :(得分:0)

{% render 'MyMainBundle:Default:credits' with {'arg1': $myObj } %}

多数民众赞成我所说的。上面一行或

之间的区别是什么
{{ block(myObj.blockName) }}

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