Проверка прав пользователей "cot_auth()" в шаблонах Cotonti

Примеры использования cot_auth() в шаблонах с разными масками прав (R, W, A, ...) . Как это работает в разных ситуациях, чтобы применить это в своем сайте.

Примеры использования cot_auth() в шаблонах Cotonti с разными масками прав (R, W, A, etc.) и с категориями тоже.
Как это работает в разных ситуациях, чтобы применить это к своему проекту. Поехали!

В шаблонах можем встречать условия: <!-- IF {PHP.usr.id|cot_auth('page', '', 'W')} --> и <!-- IF {PHP|cot_auth('page', '', 'W')} -->

Что это такое?


Отличие от версии с {PHP.usr.id}

{PHP|cot_auth('page', '', 'W')} и {PHP.usr.id|cot_auth('page', '', 'W')} в данном случае значат одно и то же, потому что cot_auth() без аргумента пользователя берёт текущего юзера из глобальной переменной $usr['id'].

Разница только в стиле записи:

{PHP.usr.id|cot_auth(...)} — явно указывает ID юзера, что полезно для читаемости или если нужно проверить права другого юзера (например, {PAGE_OWNER_ID|cot_auth(...)}).
{PHP|cot_auth(...)} — короче, но менее очевидно, что проверяется текущий юзер.


Это <!-- IF {PHP|cot_auth(...)} --> является условным оператором в шаблонизаторе Cotonti, который проверяет права доступа текущего пользователя через функцию cot_auth().

Попробуем по шагам:

    {PHP.usr.id|cot_auth('page', '', 'W')}:
        {PHP.usr.id} — это ID текущего пользователя (например, 0 для гостя, или число вроде 1, 42 для зарегистрированного).
        | — это фильтр в Cotonti, который применяет функцию справа к значению слева.
        cot_auth('page', '', 'W') — это вызов функции cot_auth(), которая проверяет права доступа.
    Функция cot_auth():
        cot_auth($area, $cat, $mask) — стандартная функция Cotonti для проверки прав.
        $area = 'page' — указывает модуль или область, здесь это модуль "Страницы" (page).
        $cat = '' — категория, к которой применяется проверка. Пустая строка ('') означает "любая категория" или "глобальные права для модуля".
        $mask = 'W' — маска прав, где 'W' означает "Write" (право на запись, создание или редактирование).
    Что проверяется?
        {PHP.usr.id|cot_auth('page', '', 'W')} возвращает true (или ненулевое значение), если пользователь с ID {PHP.usr.id} имеет право на запись (W) в модуле page для любой категории.
        Например:
            Если {PHP.usr.id} = 0 (гость), а гости не имеют права писать страницы — вернётся false.
            Если {PHP.usr.id} = 1 (зарегистрированный юзер), и у него есть права на создание страниц — вернётся true.
    <!-- IF ... --> ... <!-- ENDIF -->:
        Это условие в шаблоне: если результат проверки true, то "тут какой-то код" выполнится и отобразится.
        Если false — код внутри блока будет пропущен.

Пример в контексте

Допустим, у тебя есть кнопка "Добавить страницу":

<!-- IF {PHP.usr.id|cot_auth('page', '', 'W')} -->
    <a href="{PHP|cot_url('page', 'm=add')}">Добавить страницу</a>
<!-- ENDIF -->

    Если текущий пользователь имеет право создавать страницы (W в page), он увидит ссылку.
    Если нет (например, гость или юзер без прав) — ссылка не отобразится.

Где это используется?

    В шаблонах вроде page.tpl, page.list.tpl или кастомных модулях.
    Обычно проверяет, может ли юзер создавать (W), редактировать (A), читать (R) или удалять (1) контент.

Полный смысл

Эта запись значит: "Если текущий пользователь имеет право на запись в модуле страниц, покажи этот код". Права задаются в админке Cotonti (Администрирование → Пользователи → Группы) или в конфиге модуля.

Закрепляем, что такое cot_auth()?

    Это функция Cotonti для проверки прав доступа.
    Синтаксис: cot_auth($area, $cat, $mask):
        $area — модуль (например, 'page', 'forums').
        $cat — код категории (например, 'news', 'blog') или '' для глобальных прав.
        $mask — строка символов прав:
            R — Read (чтение).
            W — Write (создание/запись).
            A — Admin (администрирование, например, редактирование чужого контента).
            1 — Custom 1 (кастомное право, зависит от модуля, часто удаление).
            И так далее (могут быть другие, в зависимости от модуля).
    В шаблоне {PHP.usr.id|cot_auth('area', 'cat', 'mask')} возвращает true, если у пользователя есть указанное право.
    

Пример 1: Глобальные права на запись в модуле page

<!-- Проверяем, может ли текущий пользователь создавать страницы в модуле 'page' (глобально, без категории) -->
<!-- IF {PHP.usr.id|cot_auth('page', '', 'W')} -->
    <a href="{PHP|cot_url('page', 'm=add')}" class="btn btn-primary">Добавить страницу</a>
<!-- ENDIF -->

    Что делает? Если у юзера есть право W (Write) в модуле page для любой категории, показываем кнопку "Добавить страницу".
    Когда сработает? Для зарегистрированных пользователей с правом создавать страницы (например, группа "Авторы" в админке).

Пример 2: Право чтения для конкретной категории

<!-- Проверяем, может ли юзер читать страницы в категории 'news' -->
<!-- IF {PHP.usr.id|cot_auth('page', 'news', 'R')} -->
    <p>Вот список новостей: {PAGE_LIST}</p>
<!-- ELSE -->
    <p>У вас нет доступа к новостям.</p>
<!-- ENDIF -->

    Что делает? Показывает контент, если у юзера есть право R (Read) в категории news модуля page.
    Когда сработает? Даже для гостей, если в админке (Структура → Категории → news) для группы "Гости" стоит галочка "Читать".

Пример 3: Право администрирования (редактирование) с категорией

<!-- Проверяем, может ли юзер редактировать страницы в категории 'blog' -->
<!-- IF {PHP.usr.id|cot_auth('page', 'blog', 'A')} -->
    <a href="{PAGE_ID|cot_url('page', 'm=edit&id=$this')}" class="btn btn-warning">Редактировать</a>
<!-- ENDIF -->

    Что делает? Показывает ссылку на редактирование, если у юзера есть право A (Admin) в категории blog.
    Когда сработает? Для админов или модераторов, у которых в группе стоит право "Администрирование" для blog.

Пример 4: Комбинированные права (чтение и запись) глобально

<!-- Проверяем, есть ли у юзера права на чтение И запись в модуле 'page' -->
<!-- IF {PHP.usr.id|cot_auth('page', '', 'RW')} -->
    <p>Вы можете читать и добавлять страницы!</p>
    <a href="{PHP|cot_url('page', 'm=add')}">Создать</a>
<!-- ENDIF -->

    Что делает? Требует оба права: R (чтение) и W (запись) для модуля page.
    Когда сработает? Только если у юзера есть оба права (например, для авторов или редакторов).

Пример 5: Право удаления (кастомное 1) с категорией

<!-- Проверяем, может ли юзер удалять страницы в категории 'games' -->
<!-- IF {PHP.usr.id|cot_auth('page', 'games', '1')} -->
    <a href="{PAGE_ID|cot_url('page', 'm=delete&id=$this')}" class="btn btn-danger">Удалить</a>
<!-- ENDIF -->

    Что делает? Показывает кнопку удаления, если у юзера есть право 1 (обычно удаление) в категории games.
    Когда сработает? Для админов или пользователей с кастомным правом "Удаление" в настройках категории.

Пример 6: Проверка для гостей (без категории)

<!-- Проверяем, может ли гость (id=0) читать страницы -->
<!-- IF {PHP.usr.id|cot_auth('page', '', 'R')} -->
    <p>Добро пожаловать, гость! Вот публичные страницы.</p>
<!-- ELSE -->
    <p>Зарегистрируйтесь, чтобы видеть контент.</p>
<!-- ENDIF -->

    Что делает? Если даже гость ({PHP.usr.id} = 0) имеет право R, показываем контент.
    Когда сработает? Если в админке для группы "Гости" включено право "Читать" в модуле page.

Как это работает с категориями?

    Если $cat = '' (пустая строка), проверяются глобальные права для модуля. Это удобно для общих действий (например, "Добавить страницу" без привязки к категории).
    Если $cat = 'news' или другой код категории, проверяются права конкретной категории. Код категории задаётся в админке (Структура → Категории → Код).

Пример с категорией и без:

<!-- Глобально -->
<!-- IF {PHP.usr.id|cot_auth('page', '', 'W')} -->
    <p>Можете добавлять в любую категорию</p>
<!-- ENDIF -->

<!-- Только для 'blog' -->
<!-- IF {PHP.usr.id|cot_auth('page', 'blog', 'W')} -->
    <p>Можете добавлять только в блог</p>
<!-- ENDIF -->

Где посмотреть права?

    Админка: Администрирование → Пользователи → Группы → [Выбрать группу] → Права.
    Категории: Администрирование → Структура → Категории → [Выбрать категорию] → Права.
    Права задаются галочками: "Читать", "Писать", "Администрировать", "Дополнительно".

Что ещё?
Можно ли эту запись модифицировать, что бы получить проверку: если пользователь владелец страницы и имеет права на редактирование страницы в категории?

Да, можно модифицировать эту запись, чтобы проверить одновременно два условия:

    Является ли пользователь владельцем страницы ({PHP.usr.id} == {PAGE_OWNER_ID}).
    Имеет ли он права на редактирование (W или A) в конкретной категории.

В Cotonti это делается через комбинацию условий в шаблоне с использованием cot_auth().
Разберём, как это сделать на примерах.
Как это будет выглядеть?

Например, чтобы код внутри блока выполнился только если:

    {PHP.usr.id} (ID текущего пользователя) равен {PAGE_OWNER_ID} (ID владельца страницы).
    У пользователя есть права на редактирование в категории, например, 'blog'.

В шаблонах Cotonti можно комбинировать условия через && (логическое "И") или вкладывать <!-- IF -->.

Вот оба варианта:

Вариант 1: Одно условие с &&

<!-- IF {PHP.usr.id} == {PAGE_OWNER_ID} && {PHP.usr.id|cot_auth('page', 'blog', 'W')} -->
    <a href="{PAGE_ID|cot_url('page', 'm=edit&id=$this')}" class="btn btn-warning">Редактировать</a>
<!-- ENDIF -->

    {PHP.usr.id} == {PAGE_OWNER_ID} — проверяет, совпадает ли ID пользователя с ID владельца страницы.
    {PHP.usr.id|cot_auth('page', 'blog', 'W')} — проверяет, есть ли право W (Write) в категории 'blog'.
    && — логическое "И", оба условия должны быть true.

Вариант 2: Вложенные условия

<!-- IF {PHP.usr.id} == {PAGE_OWNER_ID} -->
    <!-- IF {PHP.usr.id|cot_auth('page', 'blog', 'W')} -->
        <a href="{PAGE_ID|cot_url('page', 'm=edit&id=$this')}" class="btn btn-warning">Редактировать</a>
    <!-- ENDIF -->
<!-- ENDIF -->

    Сначала проверяем, владелец ли это ({PHP.usr.id} == {PAGE_OWNER_ID}).
    Если да, то проверяем права на запись в категории 'blog'.
    Код внутри выполнится только при выполнении обоих условий.

Какой вариант лучше?

    Вариант 1 короче и читается проще, если условий немного.
    Вариант 2 удобнее, если внутри нужно больше логики или дополнительных проверок.

Что использовать: W или A?

    W (Write): Обычно для создания или редактирования своих страниц. Если нужно, чтобы владелец мог редактировать только свои страницы, - используем W.
    A (Admin): Для редактирования любых страниц в категории (включая чужие). Если владельцу нужно больше прав, можно проверить A.

Пример с A:

<!-- IF {PHP.usr.id} == {PAGE_OWNER_ID} && {PHP.usr.id|cot_auth('page', 'blog', 'A')} -->
    <a href="{PAGE_ID|cot_url('page', 'm=edit&id=$this')}" class="btn btn-warning">Редактировать (админ)</a>
<!-- ENDIF -->

Пример в контексте

Допустим, это часть page.tpl, где показывается кнопка редактирования только для владельца с правами в категории 'news':

<div class="card mb-4">
    <div class="card-body">
        <h3>{PAGE_TITLE}</h3>
        <p>Автор: {PAGE_OWNER}</p>
        <!-- Проверка: владелец страницы И имеет право редактировать в категории 'news' -->
        <!-- IF {PHP.usr.id} == {PAGE_OWNER_ID} && {PHP.usr.id|cot_auth('page', 'news', 'W')} -->
            <a href="{PAGE_ID|cot_url('page', 'm=edit&id=$this')}" class="btn btn-warning">Редактировать</a>
        <!-- ENDIF -->
    </div>
</div>

Кнопка появится, только если текущий пользователь — владелец страницы ({PHP.usr.id} == {PAGE_OWNER_ID}) и у него есть право W в категории 'news'.

Что если категория динамическая?

Если категория страницы берётся из {PAGE_CAT}, можно использовать её вместо фиксированной 'blog':

<!-- IF {PHP.usr.id} == {PAGE_OWNER_ID} && {PHP.usr.id|cot_auth('page', {PAGE_CAT}, 'W')} -->
    <a href="{PAGE_ID|cot_url('page', 'm=edit&id=$this')}" class="btn btn-warning">Редактировать</a>
<!-- ENDIF -->

{PAGE_CAT} — код категории текущей страницы (например, 'news', 'blog').
Проверка будет учитывать права именно для этой категории.

Проверка

В админке убедитесь, что у группы пользователя (например, "Авторы") есть право W для нужной категории (Структура → Категории → news → Права).
{PAGE_OWNER_ID} должен быть определён в шаблоне (ID владельца страницы).

 

8 минут чтения Sodium Carbonate

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

webitproff

Онлайн

Sodium Carbonate

Последняя авторизация: 19.07.2026 00:02

  • Страница размещена: 21.03.2025 14:56
  • Последнее обновление: 21.03.2025 14:56

Похожие страницы

Как устроена проверка активности плагина в шаблонах
1 Как устроена проверка активности плагина в шаблонахcot_plugin_active() вызывает ExtensionsService::isPluginActive(),
Настройка прав. Документация по CMF Cotonti
2 Настройка прав для групп пользователей Настройка прав для групп пользователей осуществляется в админ-панели в разделе
Функция cot_auth в Cotonti
3 Разберем функцию cot_auth(), которая в фреймворке Cotonti используется для проверки прав доступа пользователя к
Проверка владельца контента в Cotonti Siena v0.9.26 на PHP 8.4
4 Проверка владельца контента в Cotonti Siena v0.9.26 на PHP 8.4В Cotonti Siena v0.9.26, работающей на PHP 8.4,
Список тегов и блоков в шаблонах Cotonti
5 Список доступных тегов и блоков в шаблоне на странице модуля или плагина. Документация, что происходит и как это