Проверка прав пользователей "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 владельца страницы).
Комментарии (0)
Автор контента
Онлайн
Sodium Carbonate
Последняя авторизация: 19.07.2026 00:02
- Страница размещена: 21.03.2025 14:56
- Последнее обновление: 21.03.2025 14:56