web-dev-qa-db-fra.com

Comment puis-je passer des paramètres à un bloc Symfony2 Twig?

Je souhaite générer des en-têtes de table dans un bloc twig et les réutiliser sur la page. Cette page contient environ 5 tables différentes avec à peu près les mêmes en-têtes. Le code de bloc est tel:

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

La ligne de clé dans le code ci-dessus est

{% if item.statementType == statementType %}

Je veux passer le statementType en paramètre où je rend le bloc, comme suit:

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

Mais ça ne marche pas. Je veux conserver le bloc et son rendu dans le même fichier (mais des blocs différents), pour la proximité conceptuelle.

Est-il même possible d'utiliser des blocs comme celui-ci? J'ai consulté la documentation Symfony2 et je n'ai rien trouvé qui puisse suggérer que cela soit possible, mais cela me semble une utilisation si évidente des blocs.

20
Adil

Une mise à jour de la balise include dans Symfony 2.2 pourrait vous aider. Voici un exemple de la nouvelle balise: {{ include('FTWGuildBundle:Help:popover.html.twig', {'content':helpContent,'title':helpTitle}) }}

C’est peut-être ce dont vous avez besoin, car cela évite d’avoir à faire une sous-requête à un contrôleur (render fait cela), il sera plus performant.

Dans mon exemple, j'inclus le code HTML pour une fenêtre d'aide et fournit le titre et le contenu.

12
Chris

Maintenant (Symfony 2, 3 et 4+), nous pouvons utiliser avec syntaxe:

{% 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'} %} n'est pas reconnu par Symfony. Tu dois utiliser: 

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

On dirait que vous voulez les macros de Twig . Vous pouvez également écrire votre bloc en tant que modèle séparé et utiliser include

5
inanimatt

Pour ce que cela vaut pour vous. Voici un exemple de la manière dont j'ai rendu des blocs de contenu. Ceci est pour une application batch qui envoie des emails, donc c'est un peu différent de ce que vous essayez, mais peut néanmoins être utile

        $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

Une autre serait de créer une extension Twig, voir

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

Votre fonction Twig s'occupant du rendu de l'en-tête

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