26

我想在树枝块中生成表头并在整个页面中重用它们,这个页面有大约 5 个不同的表,它们的表头大致相同。块代码是这样的:

{% block table_headers %}
    <th>Fiscal Year</th>
    <th>End Date</th>
    <th>Period Length</th>
    {% for item in result.FinancialStatements.COAMap.mapItem %}
        {% if item.statementType == statementType %}
            <th>{{ item._ }} ({{ item.coaItem }})</th>
        {% endif %}
    {% endfor %} 
{% endblock %}

上面代码中的关键行是

{% if item.statementType == statementType %}

我想在渲染块的地方将 statementType 作为参数传递,如下所示:

{% render block.table_headers with {'statementType': 'INC'} %}

但这不起作用。为了概念上的接近,我想将块及其渲染保留在同一个文件(但不同的块)中。

甚至可以使用这样的块吗?我查看了 Symfony2 文档,找不到任何暗示可以这样做的东西,但对我来说,这似乎是对块的明显使用。

4

8 回答 8

18

现在使用 Symfony v2+(3、4 和 5,自 Twig v1.28.0 起),我们可以使用关键字在block()函数上使用自定义模板:with

{% with {
            'myVar1': myValue1,
            'myVar2': myValue2
        }
%}
        {{ block('toolbar', myTemplate) }}
{% endwith %}

提交:https ://github.com/twigphp/Twig/commit/02b084e2f5c3119604b1c0da388dd2438a012191

于 2017-03-08T08:45:43.323 回答
13

Symfony 2.2 中包含标签的更新可能会帮助您。以下是新标签的示例: {{ include('FTWGuildBundle:Help:popover.html.twig', {'content':helpContent,'title':helpTitle}) }}

这可能是您需要的,因为它避免了对控制器执行子请求(render这样做),它会更好地执行。

在我的示例中,我包含用于帮助弹出框的 HTML 并提供标题和内容。

于 2013-04-12T20:49:12.463 回答
8

{% render block.table_headers with {'statementType': 'INC'} %}Symfony 无法识别。您必须使用:

{% render "yourBundle:controleur:action" with { 'arg1' : 'value1', 'arg2' : 'value2' } %}
于 2012-08-22T15:32:42.070 回答
7

听起来你想要 Twig 的宏功能。或者将您的块编写为单独的模板并使用include

于 2011-06-03T11:58:13.033 回答
3

使用block 函数时,子模板可以访问父变量:

{% set foo = 'bar' %}
{{ block('another_block') }}

在子模板中:

{% block another_block %}
    {{ foo }}
{% endblock %}

印刷:

bar
于 2020-07-28T11:36:11.573 回答
0

另一种方法是创建一个 Twig 扩展,请参阅

http://symfony.com/doc/current/cookbook/template/twig_extension.html

您的 Twig 函数负责渲染标题

return $this->renderView("MyBundle:Twig:tableHeader.html.twig", array( 'result' => $result));
于 2012-08-23T03:10:23.070 回答
0

因为它对你有价值。这是我如何渲染内容块的示例。这是用于发送电子邮件的批处理应用程序,因此它与您尝试的有点不同,但仍然可能有帮助

        $templateContent = $this->getContainer()->get('twig')->loadTemplate('FTWGuildBundle:AuctionNotification:notificationEmail.html.twig');
        $body = $templateContent->renderBlock('body', array('siteDomain' => $siteClient->getSiteDomain(), 'staticContentDomain' => $siteClient->getStaticContentDomain(), 'batch' => $batch->getNotifications(), 'auction_notification_lockout_period' => $this->getContainer()->getParameter('auction_notification_lockout_period')));
        $subject = ($templateContent->hasBlock("subject")
            ? $templateContent->renderBlock("subject", array('batchSize' => $batch->getSize(), 'batch' => $batch))
            : "Auction House Notifications");
于 2013-04-12T20:54:01.717 回答
0

调用类的任何方法,参数不带键

{{ attribute(classname, methodname, [parameter1, parameter2]) }}

调用带参数的类的任何方法

{{ attribute(classname, methodname, {"parameter1" : parameter1, "parameter2" : parameter2]) }}

检索数组/对象的属性

{{ attribute(array, key) }}

于 2019-07-24T11:04:48.993 回答