Wie kann ich Parameter an einen Symfony2 Twig-Block übergeben?

Lesezeit: 3 Minuten

Benutzer-Avatar
Adil

Ich möchte Tabellenüberschriften in einem Zweigblock generieren und sie auf der Seite wiederverwenden. Diese Seite enthält ungefähr 5 verschiedene Tabellen mit ungefähr denselben Überschriften. Der Blockcode ist so:

{% 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 %}

Die Schlüsselzeile im obigen Code ist

{% if item.statementType == statementType %}

Ich möchte den statementType als Parameter übergeben, wo ich den Block rendere, wie folgt:

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

Aber das funktioniert nicht. Ich möchte den Block und sein Rendering in derselben Datei (aber in verschiedenen Blöcken) behalten, um die konzeptionelle Nähe zu gewährleisten.

Ist es überhaupt möglich, solche Blöcke zu verwenden? Ich habe mir die Symfony2-Dokumentation angesehen und konnte nichts finden, was darauf hindeutet, dass dies möglich wäre, aber es scheint mir eine so offensichtliche Verwendung von Blöcken zu sein.

Benutzer-Avatar
David DIVERRES

Jetzt mit Symfony v2+ (3, 4 & 5, seit Twig v1.28.0) können wir eine benutzerdefinierte Vorlage auf der verwenden block() Funktion mit der with Stichwort:

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

Verpflichten: https://github.com/twigphp/Twig/commit/02b084e2f5c3119604b1c0da388dd2438a012191

  • Das funktioniert gut für mich, zumal with überschreibt keine Variablen außerhalb ihres Gültigkeitsbereichs.

    – Pierre de LESPINAY

    3. April 2018 um 14:59 Uhr

Es gibt ein Update für das include-Tag in Symfony 2.2, das Ihnen dabei helfen könnte. Hier ist ein Beispiel für das neue Tag:
{{ include('FTWGuildBundle:Help:popover.html.twig', {'content':helpContent,'title':helpTitle}) }}

Dies kann das sein, was Sie brauchen, da es vermeidet, eine Unteranfrage an einen Controller zu stellen (render tut dies) wird es eine bessere Leistung erbringen.

In meinem Beispiel füge ich den HTML-Code für ein Hilfe-Popover ein und stelle Titel und Inhalt bereit.

  • Ich wünschte, diese Funktion wäre da gewesen, als ich die Frage 2011 zum ersten Mal gepostet habe. +1

    – Adil

    13. April 2013 um 15:00 Uhr

  • Danke – das war genau das, wonach ich gesucht habe und bedeutete, dass ich keine Routen in der routing.yml hinzufügen musste.

    – irgendein Benutzer

    15. April 2013 um 17:15 Uhr

  • In späteren Versionen von Twig veraltet, verwenden Sie die Alternative, die das ‘with’ anstelle eines Kommas zwischen den Parametern und der Route verwendet.

    – xarlymg89

    21. Februar 2020 um 11:01 Uhr


Benutzer-Avatar
Alex

{% render block.table_headers with {'statementType': 'INC'} %} wird von Symfony nicht erkannt. Sie müssen verwenden:

{% render "yourBundle:controleur:action" with { 'arg1' : 'value1', 'arg2' : 'value2' } %}

  • Dies bettet einen Controller ein, was das OP definitiv verlangt.

    – Maerlyn

    22. August 2012 um 23:04 Uhr

Benutzer-Avatar
unbelebt

Klingt, als wollten Sie Twigs Makrofunktion. Alternativ schreiben Sie Ihren Block als separate Vorlage und verwenden Sie ihn enthalten.

Benutzer-Avatar
emixen

Bei Verwendung der Blockfunktionuntergeordnete Vorlage hat Zugriff auf übergeordnete Variablen:

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

In untergeordneter Vorlage:

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

Drucke:

bar

Benutzer-Avatar
Alexander

Eine andere wäre, eine Twig-Erweiterung zu erstellen, siehe

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

Ihre Twig-Funktion kümmert sich um das Rendern des Headers

return $this->renderView("MyBundle:Twig:tableHeader.html.twig", array( 'result' => $result));

Benutzer-Avatar
Chris

Für das, was es Ihnen wert ist. Hier ist ein Beispiel dafür, wie ich Inhaltsblöcke gerendert habe. Dies ist für eine Batch-App, die E-Mails sendet, also etwas anders als das, was Sie versuchen, aber nichtsdestotrotz hilfreich sein kann

        $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");

1061910cookie-checkWie kann ich Parameter an einen Symfony2 Twig-Block übergeben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy