Доступные данные
Кроме того, что вы передали сами, в шаблоне всегда есть $modx и флеш-данные прошлого запроса.
🧠 $modx
View::render() кладёт $modx в данные каждого шаблона — это тот же объект, что в PHP-коде:
{$modx->resource->id} {* ID текущей страницы *}
{$modx->resource->pagetitle}
{$modx->resource->get('template')} {* произвольное поле *}
{$modx->user->username}
{$modx->user->id}
{$modx->user->get('email')}
{$modx->user->getGravatar()}Это переменная, а не аксессор
Пишется {$modx}, не {$.modx} — аксессора с таким именем нет, и попытка даст ошибку компиляции. Зато переменная есть всегда: render() кладёт её в данные каждого шаблона до всякого разбора префиксов, так что вложенные chunk, render и include её тоже видят.
💬 Флеш-сообщения
Контроллер кладёт их в сессию перед редиректом (->success(), ->error(), ->with(), ->withErrors(), ->withInput()), а View разворачивает в переменные шаблона:
| Переменная | Что внутри |
|---|---|
old_input | значения полей прошлой отправки |
errors | по одной ошибке на поле — то, что показывают под инпутом |
success_message | сообщение об успехе |
error_message | сообщение об ошибке |
{if $errors.email}
<p class="error">{$errors.email}</p>
{/if}
<input type="text" name="email" value="{$old_input.email}">
{if $success_message}
<div class="alert alert-success">{$success_message}</div>
{/if}
{if $error_message}
<div class="alert alert-danger">{$error_message}</div>
{/if}errors всегда сведён к одной строке на поле, даже если валидатор вернул несколько: из списка берётся первая. Это сделано ради разметки — под полем всё равно помещается одно сообщение.
Флеш живёт один рендер
Данные кладутся в $_SESSION['pageblocks']['flash'] и стираются следующим Response::send(). Перезагрузил страницу — сообщения нет.
🌍 Глобальные данные $.pb
Файл сайта:
core/App/Helpers/fenom/data.phpвозвращает массив, который становится доступен во всех шаблонах через аксессор pb:
return [
'package' => 'PageBlocks',
'support_email' => 'support@example.com',
'payment' => [1 => 'Банк. перевод', 2 => 'Наличные'],
];{$.pb.package} {* PageBlocks *}
{$.pb.support_email}
{$.pb.payment[$order.payment]}Точка перед pb обязательна
$.pb — это аксессор, а не переменная. {$pb.package} не ошибка, а обычная необъявленная переменная: выведется пустота, без предупреждения. Такую опечатку не видно ни в логе, ни на странице — только по пропавшему тексту.
Аксессор регистрируется, только если data.php существует. Нет файла — нет и $.pb.
Здесь удобно держать справочники, которые не меняются от запроса к запросу: подписи статусов, единицы измерения, соответствия «код → название». Данные читаются при инициализации View, поэтому файл должен быть дешёвым — запросов к базе в нём быть не должно.