web-dev-qa-db-fra.com

Comment vérifier si un bloc existe dans un modèle twig - Symfony2

Imaginez que j'ai quelque chose comme ça dans mon modèle twig

{% block posLeft %}
   -----
{%endblock%}

Existe-t-il un moyen de vérifier l'existence du bloc posLeft sans appeler à:

block("posLeft") 

Et vérifiez la valeur de retour du posBlock pour varier l'existance. Je suis un débutant dans Symfony2 + Twig.

39
channa ly

Vous pouvez le résoudre comme ceci, si vous souhaitez afficher un certain bloc uniquement s'il a du contenu. J'espère que c'est ce que vous recherchez.

Exemple index.html.twig

{% set _block = block('dynamic') %}
{% if _block is not empty %}
    {{ _block|raw }}
{% endif %}

Exemple part.html.twig

{% extends "index.html.twig" %}

{% block dynamic %}
    Block content goes here.
{% endblock %}
77
insertusernamehere

Vous pouvez le faire comme ceci:

{% if block('posLeft') %}
  ...
{% endif %}

Mais ce n'est pas efficace si vous avez besoin de la sortie du bloc rendu. Donc si vous avez besoin d'une sortie de bloc, vous devez d'abord l'assigner à une variable puis faire des assertions

17
valdas.mistolis

Les autres réponses ici ne fonctionnent pas pour twig 2.1 (je n'ai pas testé sur ~ 2.0), alors voici une petite mise à jour:

{% if block('dynamic') is defined %}
    {{ block('dynamic')|raw }}
{% endif %}

Notez que la ligne pour rendre le bloc est pas:

{% block dynamic %}
    {#  this wont work  #}
{% endblock %}

Cela ne fonctionnera pas car le bloc sera rendu lors de la compilation, et donc le test retournera vrai qu'il existe (comme testé lors de l'exécution). Vous devez donc rendre le bloc avec {{ block('dynamic')|raw }} à la place car cela ne définit pas réellement le bloc dans le modèle.

11
DevDonkey

Twig 2.x

{{ (block("posLeft")) ?? '' }}

Si vous souhaitez afficher un bloc s'il est défini ou non sur une seule ligne. Peut-être un peu maladroit mais satisfait mes besoins sans un tas de logique if..then.

8
tlorens

Vérifiez d'abord quelle version Twig vous utilisez dans votre projet symfony, car les réponses ici ne concernent que Twig 1.

Si vous utilisez Twig 2 vous avez de la chance. Selon le Twig documentation, vous pouvez utiliser le test défini pour vérifier si le bloc existe dans le contexte de modèle actuel.

{% if block("dynamic") is defined %}
   ...
{% endif %}

J'ai écrit un petit TwigExtension pour vérifier si le bloc est appelé dans l'instruction if et il semble que Twig vérifie vraiment seulement si le bloc existe et ne l'appelle pas.

Le lien vers les documents: http://twig.sensiolabs.org/doc/2.x/functions/block.html

Si vous utilisez Twig 1 , l'ancienne réponse à https://stackoverflow.com/ a/13806784/6458657 est toujours correct.

7
user6458657

Je veux juste donner un autre exemple qui a fonctionné pour moi.

<body
{%  if block('ngapp') is not empty  %}ng-app="{% block ngapp %}{% endblock %}"{% endif %}
>

Cela me permet dans les modèles enfants de déclarer {% block ngapp 'myApp' %} Et de l'afficher dans le parent.

Cela était nécessaire parce que sur certaines pages, je initialisais Angular manuellement via (angular.bootstrap('moduleName', rootElement)) et Angular n'aime pas vide ng-app='' directive et casse de façon bizarre.

1
Dimitry K