Skip to content

Доступные данные

Кроме того, что вы передали сами, в шаблоне всегда есть $modx и флеш-данные прошлого запроса.

🧠 $modx

View::render() кладёт $modx в данные каждого шаблона — это тот же объект, что в PHP-коде:

fenom
{$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сообщение об ошибке
fenom
{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:

php
return [
    'package' => 'PageBlocks',
    'support_email' => 'support@example.com',
    'payment' => [1 => 'Банк. перевод', 2 => 'Наличные'],
];
fenom
{$.pb.package}          {* PageBlocks *}
{$.pb.support_email}
{$.pb.payment[$order.payment]}

Точка перед pb обязательна

$.pb — это аксессор, а не переменная. {$pb.package} не ошибка, а обычная необъявленная переменная: выведется пустота, без предупреждения. Такую опечатку не видно ни в логе, ни на странице — только по пропавшему тексту.

Аксессор регистрируется, только если data.php существует. Нет файла — нет и $.pb.

Здесь удобно держать справочники, которые не меняются от запроса к запросу: подписи статусов, единицы измерения, соответствия «код → название». Данные читаются при инициализации View, поэтому файл должен быть дешёвым — запросов к базе в нём быть не должно.

© PageBlocks 2019-present