Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: channa lyОтветов: 6

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

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

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

block("posLeft")

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

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

symfonytwig

Ответы

Ответ 1 · рейтинг 82 · insertusernamehere

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

Пример 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 · рейтинг 18 · valdas.mistolis

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

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

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

Ответ 3 · рейтинг 16 · DevDonkey

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

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

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

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

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

Ответ 4 · рейтинг 11 · user6458657

Сначала проверьте, какую версию 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 по-прежнему верно.

Ответ 5 · рейтинг 8 · tlorens

Веточка 2.x

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

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

Ответ 6 · рейтинг 1 · Dimitry K

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы