Как проверить, существует ли блок в шаблоне ветки - Symfony2
Автор вопроса: channa lyОтветов: 6
Представьте, что у меня есть что-то подобное в моем шаблоне ветки
{% block posLeft %}
-----
{%endblock%}
Есть ли способ проверить существование блока posLeft без вызова:
block("posLeft")
И проверьте возвращаемое значение posBlock, чтобы проверить существование. Я новичок в Symfony2 + Twig.
Почему вы хотите это сделать? Мне кажется, что вы добавляете в свои представления логику, которая, вероятно, принадлежит вашему контроллеру. Если вы хотите отобразить определенный контент на основе какой-либо переменной, просто введите эту переменную в свое представление, а затем отобразите различные блоки по мере необходимости. lifo 08.12.2012
Но это неэффективно, если вам нужен вывод отображаемого блока. Итак, если вам понадобится блочный вывод, вы должны в первую очередь присвоить его переменной, а затем выполнять утверждения
Ответ 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
Если вы хотите отобразить блок, если он определен или нет в одной строке. Может быть немного глупо, но удовлетворяет мои потребности без кучи логики 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='' и ломается странным образом.