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.
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.
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
{% 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' } %}
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");
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));