Обзор Twig в IO7
Внимание
Данная статья документации написана нейросетью. Возможны некоторые расхождения и неточность информации!
IO7 использует Twig в качестве шаблонизатора. Интеграция включает автоматическую регистрацию функций из модулей, контекст сессии, и кастомные Twig-функции.
Архитектура
IO\Twig
├── Twig\Environment ← ядро Twig
├── Twig\Loader\FilesystemLoader ← загрузчик шаблонов
├── Context ← глобальные переменные
└── TwigFunctions ← кастомные функции модулей
Инициализация
// Автоматически через App
$app->create_twig();
// Или вручную
$twig = \IO\Twig::create($app);
Директории шаблонов
Шаблоны загружаются из поддиректорий Templates модулей:
modules/
├── io7/
│ └── Templates/ ← namespace: io7
│ ├── layout.twig
│ └── components/
└── myapp/
└── Templates/ ← namespace: myapp
└── pages/
└── home.twig
Использование с namespace:
{# Шаблон из модуля io7 #}
{% extends '@io/layout.twig' %}
{# Шаблон из модуля myapp #}
{% include '@app/pages/home.twig' %}
Рендер шаблона
// Через Route
return $this->render('@app/pages/home.twig', [
'title' => 'Главная',
'content' => 'Добро пожаловать!',
]);
// Напрямую через Twig
$html = $app->twig->render('@app/pages/home.twig', [
'user' => $currentUser,
]);
// С контекстом (установленные переменные доступны автоматически)
$app->twig->setContext('page_title', 'Главная');
$html = $app->twig->render('@app/pages/home.twig', ['content' => '...']);
Контекст
Контекст — глобальные переменные, доступные во всех шаблонах:
$twig->setContext('user_name', 'John');
$twig->setContext('is_admin', true);
{# В шаблоне #}
<p>Привет, {{ user_name }}!</p>
{% if is_admin %}
<a href="/admin">Админ-панель</a>
{% endif %}
Автоматический контекст
При вызове setup_context() устанавливаются:
| Ключ | Описание |
|---|---|
app | Экземпляр IO\App |
CLOUD_ENV | Окружение (dev, prod) |
JWT_TOKEN | Данные JWT-токена |
SESSION_DATA | Данные сессии |
IOPROJECT | Имя текущего проекта |
IOENABLECDN | CDN-хост |
ioSession | Экземпляр сессии |
ioProjects | Конфигурация проектов |
Кастомные функции
Функции определяются в классах TwigFunctions модулей:
namespace App;
class TwigFunctions
{
public static function format_price(float $price, string $currency = '₸'): string
{
return number_format($price, 2, '.', ' ') . ' ' . $currency;
}
public static function time_ago(string $datetime): string
{
$diff = time() - strtotime($datetime);
return match (true) {
$diff < 60 => 'только что',
$diff < 3600 => floor($diff / 60) . ' мин. назад',
$diff < 86400 => floor($diff / 3600) . ' ч. назад',
default => floor($diff / 86400) . ' дн. назад',
};
}
}
<p>{{ format_price(1500.50) }}</p> {# 1 500.50 ₸ #}
<p>{{ time_ago(post.created_at) }}</p> {# 5 мин. назад #}
Twig-опции
| Опция | Значение |
|---|---|
autoescape | true (HTML-экранирование) |
charset | utf-8 |
auto_reload | true |
cache | /data/cache/php/twig |
optimizations | -1 (максимальные) |