Skip to content

Блочные теги

Блочный тег оборачивает кусок шаблона в парную конструкцию и решает, показывать его или нет:

fenom
{auth}
    <a href="/profile">Профиль</a>
{/auth}

{guest}
    <a href="/login">Вход</a>
{/guest}

🔧 Готовые теги

ТегПоказывает содержимое
{auth}авторизованному в текущем контексте
{guest}гостю
{admin}авторизованному администратору (sudo)

Тело считается всегда, даже когда его не покажут

Блочный тег получает уже отрисованное содержимое: сначала выполняется тело, потом функция решает, отдавать его или нет. Значит всё, что внутри, исполняется и у тех, кому блок не предназначен.

fenom
{auth}
    Привет, {$modx->user->getOne('Profile')->fullname}
{/auth}

Для гостя getOne() вызовется на null — фатал и пустой 500, хотя блок «для авторизованных». Всё, что упадёт без объекта, защищайте обычным {if}:

fenom
{if $modx->user->isAuthenticated($modx->context->key)}
    Привет, {$modx->user->getOne('Profile')->fullname}
{/if}

Блочный тег — про показ разметки, а не про защиту вычислений.

🧩 Свои теги

core/App/Helpers/fenom/block_tags.php

Файл возвращает массив «имя → функция». Функция получает $params (параметры тега) и $content (отрисованное содержимое) и возвращает то, что попадёт на страницу; вернула null — не попадёт ничего.

php
return [
    'superadmin' => function (array $params, $content) {
        if ((int) $this->modx->user->id === 1) {
            return $content;
        }
    },
];
fenom
{superadmin}
    <div class="alert alert-danger">Вы супер-админ!</div>
{/superadmin}

Внутри доступен $this->modx — файл подключается изнутри View. Свои теги читаются после встроенных, поэтому одноимённый перекрывает готовый.

Имена тегов сталкиваются

Имя блочного тега занимает то же пространство, что и встроенные теги движка: escape и strip — одновременно модификаторы и блочные теги Fenom. Назовёте свой тег так же — перепишете встроенный, и {strip}…{/strip} начнёт делать не то.

Параметры

Параметры пишутся как у псевдо-тегов — через пробел, без скобок:

php
'role' => function (array $params, $content) {
    $groups = array_map('trim', explode(',', $params['in'] ?? ''));
    return $this->modx->user->isMember($groups) ? $content : '';
},
fenom
{role in='Managers,Editors'}
    <a href="/moderation">Модерация</a>
{/role}

© PageBlocks 2019-present