Блочные теги
Блочный тег оборачивает кусок шаблона в парную конструкцию и решает, показывать его или нет:
{auth}
<a href="/profile">Профиль</a>
{/auth}
{guest}
<a href="/login">Вход</a>
{/guest}🔧 Готовые теги
| Тег | Показывает содержимое |
|---|---|
{auth} | авторизованному в текущем контексте |
{guest} | гостю |
{admin} | авторизованному администратору (sudo) |
Тело считается всегда, даже когда его не покажут
Блочный тег получает уже отрисованное содержимое: сначала выполняется тело, потом функция решает, отдавать его или нет. Значит всё, что внутри, исполняется и у тех, кому блок не предназначен.
{auth}
Привет, {$modx->user->getOne('Profile')->fullname}
{/auth}Для гостя getOne() вызовется на null — фатал и пустой 500, хотя блок «для авторизованных». Всё, что упадёт без объекта, защищайте обычным {if}:
{if $modx->user->isAuthenticated($modx->context->key)}
Привет, {$modx->user->getOne('Profile')->fullname}
{/if}Блочный тег — про показ разметки, а не про защиту вычислений.
🧩 Свои теги
core/App/Helpers/fenom/block_tags.phpФайл возвращает массив «имя → функция». Функция получает $params (параметры тега) и $content (отрисованное содержимое) и возвращает то, что попадёт на страницу; вернула null — не попадёт ничего.
return [
'superadmin' => function (array $params, $content) {
if ((int) $this->modx->user->id === 1) {
return $content;
}
},
];{superadmin}
<div class="alert alert-danger">Вы супер-админ!</div>
{/superadmin}Внутри доступен $this->modx — файл подключается изнутри View. Свои теги читаются после встроенных, поэтому одноимённый перекрывает готовый.
Имена тегов сталкиваются
Имя блочного тега занимает то же пространство, что и встроенные теги движка: escape и strip — одновременно модификаторы и блочные теги Fenom. Назовёте свой тег так же — перепишете встроенный, и {strip}…{/strip} начнёт делать не то.
Параметры
Параметры пишутся как у псевдо-тегов — через пробел, без скобок:
'role' => function (array $params, $content) {
$groups = array_map('trim', explode(',', $params['in'] ?? ''));
return $this->modx->user->isMember($groups) ? $content : '';
},{role in='Managers,Editors'}
<a href="/moderation">Модерация</a>
{/role}