php - comentarios - twig symfony
¿Cómo puedo pasar parámetros a un bloque Twig de Symfony2? (6)
Quiero generar encabezados de tabla en un bloque de ramita y reutilizarlos en toda la página, esta página tiene aproximadamente 5 tablas diferentes con aproximadamente los mismos encabezados. El código de bloqueo es tal:
{% 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 línea clave en el código anterior es
{% if item.statementType == statementType %}
Quiero pasar el tipo de declaración como parámetro donde estoy renderizando el bloque, de esta manera:
{% render block.table_headers with {''statementType'': ''INC''} %}
Pero esto no funciona. Quiero mantener el bloque y su representación en el mismo archivo (pero diferentes bloques), para la proximidad conceptual.
¿Es posible usar bloques como este? He mirado los documentos de Symfony2 y no pude encontrar nada que sugiriera que se pudiera hacer esto, pero me parece un uso tan obvio de los bloques.
Ahora (Symfony 2, 3 y 4+), podemos usar con la sintaxis:
{% with {
''myVar1'': myValue1,
''myVar2'': myValue2
}
%}
{{ block(''toolbar'', myTemplate) }}
{% endwith %}
Comprometerse: https://github.com/twigphp/Twig/commit/02b084e2f5c3119604b1c0da388dd2438a012191
Hay una actualización de la etiqueta de inclusión en Symfony 2.2 que podría ayudarte con esto. Aquí hay un ejemplo de la nueva etiqueta: {{ include(''FTWGuildBundle:Help:popover.html.twig'', {''content'':helpContent,''title'':helpTitle}) }}
Esto puede ser lo que necesita, ya que evita tener que realizar una solicitud secundaria a un controlador (el render
hace esto) tendrá un mejor desempeño.
En mi ejemplo, incluyo el HTML para una ventana emergente de ayuda y proporciono el título y el contenido.
Otra sería crear una extensión Twig, ver
http://symfony.com/doc/current/cookbook/templating/twig_extension.html
Tu función Twig cuidando de renderizar el encabezado
return $this->renderView("MyBundle:Twig:tableHeader.html.twig", array( ''result'' => $result));
Por lo que vale para ti. Aquí hay un ejemplo de cómo he renderizado bloques de contenido. Esto es para una aplicación por lotes que envía correos electrónicos, así que es un poco diferente de lo que estás intentando, pero aún así puede ser útil
$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");
Suena como si quisieras la función de macros de Twig. Alternativamente escriba su bloque como una plantilla separada y use include .
Symfony no reconoce {% render block.table_headers with {''statementType'': ''INC''} %}
. Debes usar:
{% render "yourBundle:controleur:action" with { ''arg1'' : ''value1'', ''arg2'' : ''value2'' } %}