wake-up-neo.com

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

Ich möchte Tabellenüberschriften in einem Zweigblock generieren und über die Seite hinweg wiederverwenden. Diese Seite enthält ungefähr 5 verschiedene Tabellen mit ungefähr denselben Überschriften. Der Blockcode ist wie folgt:

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

{% if item.statementType == statementType %}

Ich möchte den Anweisungstyp als Parameter übergeben, in dem ich den Block rendere, wie folgt:

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

Das geht aber nicht. Ich möchte den Block und sein Rendering aus Gründen der konzeptionellen Nähe in derselben Datei (aber in unterschiedlichen Blöcken) behalten.

Ist es überhaupt möglich, solche Bausteine ​​zu verwenden? Ich habe mir die Symfony2-Dokumentation angesehen und konnte nichts finden, was darauf hindeutet, dass dies getan werden könnte, aber es scheint für mich eine so offensichtliche Verwendung von Blöcken.

20
Adil

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

Dies ist möglicherweise das, was Sie benötigen, da Sie dadurch keine Nebenanforderung an einen Controller (render) ausführen müssen, da dies eine bessere Leistung bringt.

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

12
Chris

Jetzt (Symfony 2, 3 & 4+) können wir mit Syntax verwenden:

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

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

9
kxxxxoo

{% render block.table_headers with {'statementType': 'INC'} %} wird von Symfony nicht erkannt. Du musst benutzen: 

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

Klingt wie Sie wollen Twig Makros Funktion . Alternativ schreiben Sie Ihren Block als separate Vorlage und verwenden Sie include

5
inanimatt

Für was es dir wert ist. Hier ist ein Beispiel, wie ich Inhaltsblöcke gerendert habe. Dies ist für eine Batch-App, die E-Mails sendet, etwas anders als das, was Sie versuchen, aber trotzdem 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");
0
Chris

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

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

Ihre Twig-Funktion sorgt für das Rendern der Kopfzeile

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

Rufen Sie eine beliebige Klassenmethode mit Parametern ohne Schlüssel auf

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

Rufen Sie eine beliebige Methode der Klasse mit Parametern mit Schlüssel auf

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

Ruft die Eigenschaft des Arrays/Objekts ab

{{ attribute(array, key) }}

0
J Ajay