2017-02-23 114 views
4

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

{% if app.user is defined %} 
    {% set isOwner = user.isEqualTo(app.user) %} 
{% else %} 
    {% set isOwner = false %} 
{% endif %} 

Можно ли писать без упаковки каждой строки в тегах, как это?

{% if app.user is defined 
    set isOwner = user.isEqualTo(app.user) 
else 
    set isOwner = false 
endif %} 

Приведенный выше код явно не работает, поскольку нет терминаторов линий. Добавление ; тоже не работает.

Если есть много линий, все становится очень сложным.

Update:

Хотя ответ DarkBee является способом сократить синтаксис, опасайтесь передавая нуль к способу, который может быть ожидающим объект определенного класса. Окончательный вариант кода, который мы в конце концов пошел с не намного лучше, чем оригинальный вопрос, но по крайней мере это один меньше линия:

{% set isOwner = false %} 
{% if app.user is not null %} 
    {% set isOwner = user.isEqualTo(app.user) %} 
{% endif %} 

Таким образом, логический флаг всегда устанавливается и метод никогда не принимает нулевое объект.

Кроме того, если вы беспокоитесь о дополнительных пробелах, ползущих в ваш HTML (в результате отступа), лучший способ избежать этого - обернуть весь фрагмент кода в тегах {% spaceless %}...{% endspaceless %}. не

+0

@DarkBee Это тоже очень интересно! – aalaap

+0

@DarkBee Я бы хотел, чтобы вы разместили это как ответ! – aalaap

+1

Будьте осторожны, что вы хотите за – DarkBee

ответ

3

Более короткий способ сделать это:

{% set isOwner = user.isEqualTo(app.user|default(null)) %} 
+0

Но это не многострочный код. Должны ли мы предположить, что это невозможно? – Fernando

+0

@ Фернандо Не знаете, что вы спрашиваете? Исходный фрагмент кода был многострочным, а OP требовал более компактного (более короткого?) Метода – DarkBee

+0

Спасибо @DarkBee, возможно, я неправильно понял вопрос. Я имею в виду, что ваш код не является «более сложным многострочным кодом», а «более компактным однострочным кодом». Я пришел к этому вопросу, ища способ написать несколько строк, не разбивая каждый из них внутри скобок, и именно это я имел в виду с моим комментарием, если это возможно или нет. – Fernando

3

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

{% set isOwner = (app.user is defined and user.isEqualTo(app.user)) ? true : false %} 

Надежда эта помощь

Подробнее here в док

+3

Не нужно размещать '? true: false' в конце, хотя – DarkBee

+1

привет @ DarkBee хороший улов! – Matteo