symfony - comentario - twig php tutorial español
Cómo comprobar si existe un bloque en una plantilla de rama-Symfony2 (6)
Imagina que tengo algo como esto en mi plantilla de ramita
{% block posLeft %}
-----
{%endblock%}
¿Hay alguna forma de verificar la existencia del bloque posLeft sin llamar a:
block("posLeft")
Y compruebe el valor de retorno de posBlock para varificar la existencia. Soy un novato en Symfony2 + Twig.
Las otras respuestas aquí no funcionan para twig 2.1 (no he probado en ~ 2.0), así que aquí hay una pequeña actualización:
{% if block(''dynamic'') is defined %}
{{ block(''dynamic'')|raw }}
{% endif %}
Tenga en cuenta que la línea para representar el bloque no es:
{% block dynamic %}
{# this wont work #}
{% endblock %}
Esto no funcionará porque el bloque se representará durante la compilación, por lo que la prueba devolverá verdadero que existe (como se probó en tiempo de ejecución). Por lo tanto, necesita representar el bloque con {{ block(''dynamic'')|raw }}
ya que esto no define el bloque en la plantilla.
Primero compruebe qué versión de Twig está utilizando dentro de su proyecto Symfony, porque las respuestas aquí son solo para Twig 1.
Si está usando Twig 2 , tiene suerte. De acuerdo con la documentación de Twig, puede usar la prueba definida para verificar si el bloque existe en el contexto de la plantilla actual.
{% if block("dynamic") is defined %}
...
{% endif %}
Escribí un pequeño TwigExtension para comprobar si el bloque se llama dentro de la declaración if y parece que Twig realmente solo comprueba si el bloque existe y no lo llama.
El enlace a los documentos: http://twig.sensiolabs.org/doc/2.x/functions/block.html
Si está usando Twig 1 , la respuesta anterior en https://.com/a/13806784/6458657 sigue siendo correcta.
Puedes hacerlo así:
{% if block(''posLeft'') %}
...
{% endif %}
Pero no es eficiente si necesita salida del bloque renderizado. Entonces, si necesita un bloque de salida, debe asignarlo a la variable en primer lugar y luego hacer aserciones
Puedes resolverlo de esta manera, si quieres mostrar un cierto bloque solo si tiene contenido. Espero, esto es lo que estás buscando.
Ejemplo index.html.twig
{% set _block = block(''dynamic'') %}
{% if _block is not empty %}
{{ _block|raw }}
{% endif %}
Ejemplo part.html.twig
{% extends "index.html.twig" %}
{% block dynamic %}
Block content goes here.
{% endblock %}
Solo quiero dar otro ejemplo que funcionó para mí.
<body
{% if block(''ngapp'') is not empty %}ng-app="{% block ngapp %}{% endblock %}"{% endif %}
>
Esto me permite en las plantillas secundarias declarar {% block ngapp ''myApp'' %}
y hacer que se muestre dentro del elemento primario.
Esto fue necesario porque en algunas páginas estaba cargando Angular manualmente a través de ( angular.bootstrap(''moduleName'', rootElement)
) y Angular no le gusta la ng-app=''''
vacía y se rompe de maneras extrañas.
Twig 2.x
{{ (block("posLeft")) ?? '''' }}
Si desea mostrar un bloque si está definido o no en una línea. Puede ser un poco kludgy pero satisface mis necesidades sin un montón de si ... entonces la lógica.