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

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

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

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

block("posLeft") 

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


person channa ly    schedule 08.12.2012    source источник
comment
Почему вы хотите это сделать? Мне кажется, что вы добавляете в свои представления логику, которая, вероятно, принадлежит вашему контроллеру. Если вы хотите отобразить определенный контент на основе какой-либо переменной, просто введите эту переменную в свое представление, а затем отобразите различные блоки по мере необходимости.   -  person lifo    schedule 08.12.2012


Ответы (6)


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

Пример 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 %}
person insertusernamehere    schedule 10.12.2012
comment
Нет встроенного тега для этого? получение значения блока и повторная проверка пустой строки требуют много кода. Это выглядит очень некрасиво. - person channa ly; 11.12.2012
comment
Я не думаю, что есть другой путь. И, как сказал @lifo, вы, вероятно, слишком много логики вкладываете в свои шаблоны. Будьте осторожны, чтобы не помещать этот двухстрочный оператор в однострочную проверку, так как это может вызвать новые подзапросы. Вот похожее обсуждение в группе Twig Google: groups.google .com/forum/?fromgroups=#!topic/twig-users/ - person insertusernamehere; 11.12.2012

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

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

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

person valdas.mistolis    schedule 16.01.2013
comment
Я думаю, что это самый чистый способ! - person Dandy; 16.06.2013
comment
Проголосовали против. См. ссылку в комментарии проверьте, существует ли блок в шаблоне ветки symfony2%23comment19015938_13806784"> stackoverflow.com/questions/13774384/ - person Im0rtality; 28.12.2013
comment
У меня иногда бывают пробелы в пустом блоке (из-за форматирования). Так что мне понравилось, используя: if block('posLeft') | обрезать != '' - person Philipp Dahse; 17.11.2017

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

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

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

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

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

person DevDonkey    schedule 12.02.2017
comment
|raw здесь излишен, так как использование block('dynamic') уже обрабатывает экранирование, и оно не устанавливается в переменную перед отображением. - person lookbadgers; 05.03.2018

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

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

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

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

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

Если вы используете Twig 1, старый ответ на https://stackoverflow.com/a/13806784/6458657 по-прежнему верно.

person user6458657    schedule 16.01.2017

Веточка 2.x

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

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

person tlorens    schedule 12.04.2017

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

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

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

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

person Dimitry K    schedule 08.12.2016