Как условно расширить шаблон или импортировать макрос в Twig

Условные операторы — это хлеб повседневной жизни программиста. Условные операторы — это решения, которые должны приниматься на основе определенного условия: если условие выполняется, выполняется определенный фрагмент кода. Спасибо, капитан, очевидно. Зачем мне говорить что-то столь очевидное? Хорошо, если вы думаете очевидным образом с Twig, когда вы хотите условно расширить свой макет на некотором представлении, например, с помощью оператора if:

{# Example: THIS DOESN'T WORK #}
{% set condition = true %}
{# Check condition to see which layout to render #}
{% if condition %}
{% extends '::layout_1.html.twig' %}
{% else %}
{% extends '::layout_2.html.twig' %}
{% endif %}

Вы получите следующее исключение:

Несколько расширенных тегов запрещены в YourBundle:yourfile.html.twig в строке X

Потому что, как сказано в ошибке, вы не можете использовать extends отметьте дважды на представлении. И что теперь? Возможно, вы не хотите добавлять больше логики в свой проект с помощью PHP для визуализации какого-либо шаблона, потому что вы можете (или явно должны) проверить его в представлении, поэтому полезно знать, что можно условно расширить шаблон Однако не так, как вы ожидали. Поскольку имя шаблона для родителя может быть любым допустимым выражением Twig, можно сделать условное обозначение механизма наследования условным синтаксисом.

Условное продление

Чтобы понять, как это работает, мы будем использовать аналогию с PHP. Следующая функция showText

Чтобы вызвать его, мы отправим только строку в качестве первого аргумента:

Если вы хотите отобразить некоторый текст в соответствии с условием, то вы можете сделать:

Но это большой код для простой вещи, поэтому многие разработчики хотели бы вместо этого написать сокращенное назначение:

Вот что делает сокращенная функция. Хотя аргумент не находится внутри оператора if, он оценивается сокращенно, если внутри скобок, и в любом случае возвращает строку. Это переведено в веточку для extends функция будет:

{% extends (condition) ? ("template if its true") : ("template if its false") %}

Это означает, что вы можете просто расширить различные макеты в соответствии с условием в ваших представлениях, следуя этому механизму:

{% set condition = true %}
{#
Using a boolean after the extends tag, allows you to
use a shorthand if to render conditionally a layout
In this case if the condition is true, then the
layout 1 will be rendered, otherwise the layout 2
#}
{% extends condition
? '::layout_1.html.twig'
: '::layout_2.html.twig' %}

Условный макрос

В отличие от тега extends, импорт, очевидно, может использоваться много раз, как вы хотите, поэтому вы все равно можете назначить макрос с простой логикой оператора if:

{% set condition = true %}
{# Conditional declaration of "tools" #}
{% if condition  %}
{% import "Macros/macro1_prod.html.twig" as tools %}
{% else%}
{% import "Macros/macro2_dev.html.twig"  as tools %}
{% endif %}
{# Use the macro as you need #}
{{ tool.someToolInsideMacro() }}

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

{% set condition = true %}
{% import condition ? "Macros/macro1_prod.html.twig" : "Macros/macro2_dev.html.twig" as tools%}
{# Use the macro as you need #}
{{ tool.someToolInsideMacro() }}

Помните, что условие должно возвращать (как и ожидалось для каждого оператора if) логическое значение, а именно true или false. Обычно разработчики используют is_granted метод визуализации пользовательского макета в соответствии с ролью пользователя.

Ссылка на основную публикацию
Adblock
detector