2011-05-20 19 views
14

Quiero generar encabezados de tabla en un bloque de rama y volver a utilizarlos en la página, esta página tiene aproximadamente 5 tablas diferentes con aproximadamente los mismos encabezados. El código de bloque es tal:¿Cómo puedo pasar los parámetros a un bloque Symfony2 Twig?

{% 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 StatementType como parámetro, donde estoy haciendo que el bloque, así:

{% 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 cercanía conceptual.

¿Es posible usar bloques como este? Miré los documentos de Symfony2 y no pude encontrar nada que sugiriera que se pudiera hacer, pero me parece que es un uso tan obvio de bloques.

Respuesta

12

Hay una actualización a la etiqueta de inclusión en Symfony 2.2 que podría ayudarte con esto. Aquí está 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 hacer una sub-petición a un controlador (render hace esto) será mejor rendimiento.

En mi ejemplo, incluyo el HTML para ayudar a Popover y proporcionar el título y el contenido.

+0

Deseo que esta característica estuviera allí cuando publiqué la pregunta por primera vez en 2011. +1 – Adil

+0

Gracias - esto era exactamente lo que estaba buscando y significaba que no tenía que agregar ninguna ruta en routing.yml. – someuser

4

Parece que quieres Twig's macros feature. Alternativamente, escriba su bloque como una plantilla separada y use include.

+0

Terminé usando macros y bloques con parámetros globales. includes dividiría la lógica que pertenece en varios archivos, lo evité. – Adil

7

{% render block.table_headers with {'statementType': 'INC'} %} no es reconocido por Symfony. Debe utilizar:

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

Esto incorpora un controlador, que es definitivamente lo que el OP está pidiendo. – Maerlyn

0

Por lo que vale. Aquí hay un ejemplo de cómo he renderizado bloques de contenido. Esto es para una aplicación por lotes, que envía mensajes de correo electrónico, así que es un poco diferente de lo que estamos tratando, pero sin embargo 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"); 
Cuestiones relacionadas