Якщо ви працюєте з Twig, то знаєте: шаблони мають бути чистими, швидкими та
без зайвого PHP-коду. Тернарні оператори — це той інструмент, який дозволяє
замінити громіздкі {% if %} на одну компактну рядок і заощадити
десятки рядків у шаблонах.
Twig використовують у багатьох популярних системах:
- Symfony
- Drupal 8+ / 10+
- OpenCart 3.0+ та 4.x
- Craft CMS
- Bolt CMS, Grav та багатьох інших PHP-проєктах
Особливо корисна ця шпаргалка для розробників OpenCart. У
цьому CMS майже всі шаблони (product.twig, category.twig, cart.twig тощо)
побудовані на Twig, і вміння писати короткі умовні вирази значно спрощує
кастомізацію теми, розробку модулів і підтримку проєкту.
Підтримка розширених тернарних операторів з’явилася ще в
Twig 1.12.0. З того часу вони стали must-have для
будь-якого Twig-розробника.
1. Класичний тернарний оператор (if — else)
{{ foo ? 'yes' : 'no' }}
2. Оператор Елвіса (Elvis operator) — «якщо є, виведи його, інакше default»
{{ foo ?: 'no' }}
Або повний еквівалент:
{{ foo ? foo : 'no' }}
3. Односторонній тернарний оператор (тільки true-частина)
{{ foo ? 'yes' }}
Або явно:
{{ foo ? 'yes' : '' }}
4. Null coalescing operator ?? (з Twig 2.7.0+, для старих
версій OpenCart не підходить)
{{ foo ?? 'no' }}
Важливо: Повертає foo, тільки якщо змінна
визначена і не є null. Порожні значення
('', 0, false, порожній масив)
вважаються валідними і не заміняються.
5. Фільтр default — найгнучкіший варіант
{{ foo|default('no') }}
Різниця з ??:
-
|default заміняє значення, якщо змінна
не визначена або
порожня (false, 0,
'', null, []).
-
?? заміняє тільки null / невизначену змінну.
При розробці модулів чи шаблонів OpenCart зручно
використовувати |default, бо багато змінних можуть бути
порожніми рядками або нулями.
Порівняльна таблиця
|
Оператор
|
Замінює null/невизначене
|
Замінює порожнє ('' , 0 , false)
|
foo ? 'yes' : 'no' |
Так
|
Так
|
foo ?: 'no' |
Так
|
Так
|
foo ? 'yes' |
Так
|
Так
|
foo ?? 'no' |
Так
|
Ні
|
foo|default('no') |
Так
|
Так
|
Приклади для OpenCart
<!-- Наявність -->
{{ product.quantity > 0 ? 'Є в наявності' : 'Під замовлення' }}
<!-- Клас для акційного товару -->
<div class="{{ product.special ? 'product--sale' : '' }}">
Корисні поради
-
Не зловживайте вкладеними тернарними операторами — код стає важким для
читання.
-
Для складних умов краще використовувати
{% if %} або
окремий макрос.
- У Twig 3.x+ тернарні оператори працюють ще стабільніше з типами.
-
Якщо використовуєте OpenCart 4.x - Twig там оновлений, тому всі наведені
конструкції працюють без проблем.
Збережіть цю статтю в закладки - вона точно знадобиться вам під час
наступного рефакторингу шаблону чи створення нового модуля.