Подтвердить что ты не робот

Как проверить, существует ли блок в шаблоне ветки - Symfony2

Представьте, что у меня есть что-то подобное в моем шаблоне ветки.

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

Есть ли способ проверить наличие блока posLeft без вызова:

block("posLeft") 

И проверьте возвращаемое значение posBlock, чтобы изменить его. Я новичок в Symfony2 + Twig.

4b9b3361

Ответ 1

Вы можете решить это так, если хотите отобразить определенный блок, только если он имеет контент. Надеюсь, это то, что вы ищете.

Пример index.html.twig

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

Пример part.html.twig

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

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

Ответ 2

Вы можете сделать это следующим образом:

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

Но это не эффективно, если вам нужен вывод обработанного блока. Итак, , если вам понадобится вывод блока, вам следует назначить его переменной в первую очередь а затем делать утверждения

Ответ 3

Другие ответы здесь не работают для twig 2.1 (я не тестировал на ~ 2.0), поэтому здесь небольшое обновление:

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

Обратите внимание, что строка для рендеринга блока не:

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

Это не работает, потому что блок будет отображаться во время компиляции, и поэтому тест вернет true, что он существует (как проверено во время выполнения). Поэтому вам нужно отобразить блок с помощью {{ block('dynamic')|raw }}, так как это фактически не определяет блок в шаблоне.

Ответ 4

Twig 2.x

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

Если вы хотите отобразить блок, если он определен или нет в одной строке. Возможно, это будет немного kludgy, но удовлетворит мои потребности без кучи if.. then logic.

Ответ 5

Сначала проверьте, какую версию Twig вы используете в своем проекте symfony, потому что ответы здесь только для Twig 1.

Если вы используете Twig 2, вам повезло. Согласно документации Twig вы можете использовать определенный тест, чтобы проверить, существует ли блок в текущем контексте шаблона.

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

Я написал немного TwigExtension, чтобы проверить, вызван ли блок в выражении if, и кажется, что Twig realy проверяет, действительно ли блок exsist и не вызывает его.

Ссылка на документы: http://twig.sensiolabs.org/doc/2.x/functions/block.html

Если вы используете Twig 1, старый ответ на fooobar.com/questions/155616/... по-прежнему верен.

Ответ 6

Просто хочу привести еще один пример, который сработал у меня.

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

Это позволяет мне в дочерних шаблонах объявлять {% block ngapp 'myApp' %} и отображать его внутри родителя.

Это было необходимо, потому что на некоторых страницах я загружался с помощью Angular вручную через (angular.bootstrap('moduleName', rootElement)) и Angular не любил пустую директиву ng-app='' и разбивался странными способами.