PearCMS Docs v2.4
Документация / Модули / FlagsPanel и доступ

FlagsPanel и доступ

FlagsPanel — это контракт модуля для системы прав. Модуль декларирует список своих action’ов; в админке для каждого action можно настроить какой флаг (a–z) нужен для доступа.

Актуально для v2.4 Обновлено 1 июля 2026

Зачем это нужно #

Раньше модули хардкодили роли (Auth::isRole('admin')). Сейчас права настраиваются без кода: для action’а указывается требуемый флаг, и admin может в любой момент его поменять через UI /s-panel/flags-settings.

Это даёт три плюшки:

  • Разные сайты могут одинаковый модуль настроить по-разному.
  • Новые роли создаются без релиза кода — просто новая буква + новые группы.
  • Перенос прав на мобильный REST идёт автоматически: DispatchController читает ту же таблицу.

Декларация actions #

Модуль реализует интерфейс FlagsPanelInterface и отдаёт список своих действий с описаниями. Эти описания админ увидит в форме настройки прав:

modules/Banner/FlagsPanel/BannerFlagsPanel.phpphp
final class BannerFlagsPanel implements FlagsPanelInterface
{
    public function module(): string { return 'Banner'; }

    public function actions(): array
    {
        return [
            ['key' => 'view',   'label' => 'Доступ к разделу',
             'description' => 'Открывает /s-panel/banner. Без права пункт меню не виден.'],

            ['key' => 'create', 'label' => 'Создание баннеров'],
            ['key' => 'edit',   'label' => 'Редактирование'],
            ['key' => 'delete', 'label' => 'Удаление'],
        ];
    }
}

Action view по конвенции — корневой; именно он скрывает/показывает пункт меню и блокирует страницу-индекс.

Проверка в контроллере #

В коде проверка — одной строкой через хелпер module_require() или module_can():

modules/Banner/Controllers/BannerFormController.phpphp
public function create(Request $r): Response
{
    // автоматический редирект на /s-panel/ если нет флага, привязанного к Banner.create
    if ($resp = module_require('Banner', 'create', '/s-panel/')) return $resp;

    // … нормальный CRUD
}

// или мягко в шаблоне:
<?php if (module_can('Banner', 'delete')): ?>
    <button>Удалить</button>
<?php endif; ?>

Под капотом обе функции читают таблицу settings__module_flags: (Banner, create)required_flag. Если в этой таблице нет записи или флаг = NULL — действие доступно всем авторизованным. Если флаг указан — проверяется через Auth::flags() (личные + от групп).

Что админ видит в /flags-settings #

Заходя в Настройка доступа и выбирая модуль, admin получает список action’ов с описаниями из FlagsPanel и выпадушки «требуемый флаг». Доступно из коробки:

  • «Доступно всем» — без проверки
  • Любая буква из settings__flags с подписью (например, b — Редактирование чужого)

Подробнее — на странице «Настройка доступа».