Проверка владельца контента в Cotonti Siena v0.9.26 на PHP 8.4
В Cotonti Siena v0.9.26, работающей на PHP 8.4, управление доступом к контенту в зависимости от того, является ли пользователь его владельцем, — это важная задача для создания безопасного и удобного интерфейса. В этой статье подробно описывается, как реализовать проверку владельца контента с помощью двух функций: cot_getUserDataOwner() и cot_isOwner(). Мы рассмотрим, как добавить эти функции в файл system/functions.custom.php и использовать их в различных локациях сайта, таких как профиль пользователя, статьи, личные сообщения и комментарии на форуме. Также приведем примеры использования глобальных переменных {PHP.usr.profile.user_name}, {PHP.usr.name}, {PHP.usr.id}, {PHP.urr.user_name} и {PHP.urr.user_id} для отображения данных и условного интерфейса.
Добавление функций в system/functions.custom.php
Для начала необходимо создать или отредактировать файл system/functions.custom.php в корневой папке системы Cotonti. Этот файл предназначен для пользовательских функций, которые будут доступны глобально на сайте. Ниже приведен код функций, которые определяют владельца контента и проверяют, является ли текущий пользователь владельцем.
<?php
/**
* Файл: system/functions.custom.php
*
* Получает данные пользователя-владельца страницы.
* Определяет владельца по URL-параметрам 'id' или 'u'.
* Если они пустые, берется текущий авторизованный пользователь.
*
* @return array|null Массив с данными пользователя или null, если пользователь не найден.
*/
function cot_getUserDataOwner()
{
$id = cot_import('id', 'G', 'INT');
$u = cot_import('u', 'G', 'TXT');
if (!empty($u) && empty($id)) {
$id = Cot::$db->query('SELECT user_id FROM ' . Cot::$db->users . ' WHERE user_name = ? LIMIT 1', [$u])->fetchColumn();
} elseif (empty($id) && empty($u) && Cot::$usr['id'] > 0) {
$id = Cot::$usr['id'];
}
if ($id > 0) {
return Cot::$db->query('SELECT * FROM ' . Cot::$db->users . ' WHERE user_id = ? LIMIT 1', [$id])->fetch();
}
return null;
}
/**
* Проверяет, является ли текущий пользователь владельцем страницы.
*
* @return bool True, если текущий пользователь — владелец, иначе false.
*/
function cot_isOwner()
{
$ownerData = cot_getUserDataOwner();
return !empty($ownerData) && Cot::$usr['id'] > 0 && Cot::$usr['id'] == $ownerData['user_id'];
}
?>
Объяснение функций
- cot_getUserDataOwner():
- Функция проверяет URL-параметры
id (числовой идентификатор пользователя) или u (имя пользователя). - Если указан параметр
u, но нет id, выполняется запрос к базе данных для получения user_id по имени пользователя. - Если оба параметра отсутствуют, но пользователь авторизован (
Cot::$usr['id'] > 0), используется ID текущего пользователя. - Если
id определен, функция возвращает массив с данными пользователя из таблицы users или null, если пользователь не найден.
- cot_isOwner():
- Использует
cot_getUserDataOwner() для получения данных владельца. - Проверяет, совпадает ли ID текущего пользователя (
Cot::$usr['id']) с ID владельца ($ownerData['user_id']). - Возвращает
true, если текущий пользователь — владелец, иначе false.
Эти функции можно вызывать в шаблонах Cotonti с помощью тега {PHP|cot_isOwner()} для условного отображения контента.
Примеры использования в разных локациях сайта
Ниже приведены примеры использования функций в различных частях сайта. Каждый пример включает подробное описание, где и как использовать код, а также как работают глобальные переменные.
1. Профиль пользователя
В профиле пользователя важно показывать кнопки управления (например, "Редактировать профиль" или "Изменить аватар") только владельцу профиля. Это можно реализовать в шаблоне users.profile.tpl.
<!-- Проверка, является ли текущий пользователь владельцем профиля -->
<!-- IF {PHP|cot_isOwner()} -->
<div class="profile-controls">
<button onclick="window.location.href='{PHP|cot_url('users', 'm=profile&act=edit')}';">Редактировать профиль</button>
<button onclick="window.location.href='{PHP|cot_url('users', 'm=profile&act=avatar')}';">Изменить аватар</button>
</div>
<p>Привет, <b>{PHP.usr.profile.user_name}</b>! Это ваш профиль (ID: {PHP.usr.id}).</p>
<!-- ELSE -->
<p>Вы смотрите профиль пользователя <b>{PHP.urr.user_name}</b> (ID: {PHP.urr.user_id}).</p>
<!-- ENDIF -->
Объяснение:
{PHP|cot_isOwner()} возвращает true, если текущий пользователь просматривает свой профиль.- Если пользователь — владелец, отображаются кнопки управления с использованием функции
cot_url() для генерации ссылок. {PHP.usr.profile.user_name} и {PHP.usr.id} показывают данные текущего пользователя, а {PHP.urr.user_name} и {PHP.urr.user_id} — данные владельца профиля (того, чей профиль просматривается).
2. Список статей пользователя
В разделе со списком статей, например, в модуле page, можно показывать кнопки "Редактировать" и "Удалить" только для автора статьи. Это реализуется в шаблоне page.list.tpl.
<!-- BEGIN: PAGE_ROW -->
<div class="article-item">
<h2>{PAGE_ROW_TITLE}</h2>
<p>{PAGE_ROW_TEXT}</p>
<!-- IF {PHP|cot_isOwner()} -->
<div class="article-controls">
<button onclick="window.location.href='{PHP|cot_url('page', 'm=edit&id={PAGE_ROW_ID}')}';">Редактировать</button>
<button onclick="if(confirm('Удалить статью?')) window.location.href='{PHP|cot_url('page', 'm=delete&id={PAGE_ROW_ID}')}';">Удалить</button>
</div>
<!-- ENDIF -->
<p>Автор: <b>{PHP.urr.user_name}</b> (ID: {PHP.urr.user_id})</p>
</div>
<!-- END: PAGE_ROW -->
Объяснение:
{PHP|cot_isOwner()} проверяет, является ли текущий пользователь автором статьи (владелец определяется по параметру id или u в URL или по текущему пользователю).- Кнопки "Редактировать" и "Удалить" отображаются только для владельца.
{PAGE_ROW_ID} — это ID статьи, используемый для генерации ссылок на редактирование или удаление.{PHP.urr.user_name} и {PHP.urr.user_id} показывают данные автора статьи.
3. Личные сообщения
В модуле личных сообщений (pm) можно отображать кнопку удаления сообщения только для его автора. Это реализуется в шаблоне pm.list.tpl.
<!-- BEGIN: PM_ROW -->
<div class="pm-item">
<p><b>{PHP.usr.name}</b> написал: {PM_ROW_TEXT}</p>
<!-- IF {PHP|cot_isOwner()} -->
<button onclick="if(confirm('Удалить сообщение?')) window.location.href='{PHP|cot_url('pm', 'm=delete&id={PM_ROW_ID}')}';">Удалить сообщение</button>
<!-- ENDIF -->
<p>Получатель: <b>{PHP.urr.user_name}</b> (ID: {PHP.urr.user_id})</p>
</div>
<!-- END: PM_ROW -->
Объяснение:
{PHP|cot_isOwner()} проверяет, является ли текущий пользователь отправителем сообщения.- Кнопка удаления отображается только для владельца сообщения.
{PM_ROW_TEXT} содержит текст сообщения, а {PM_ROW_ID} — его ID для формирования ссылки на удаление.{PHP.usr.name} показывает имя текущего пользователя, а {PHP.urr.user_name} и {PHP.urr.user_id} — данные получателя или отправителя.
4. Комментарии на форуме
В модуле форумов (forums) можно показывать кнопку редактирования комментария только его автору. Это реализуется в шаблоне forums.posts.tpl.
<!-- BEGIN: FORUMS_POSTS_ROW -->
<div class="comment">
<p>{FORUMS_POSTS_ROW_TEXT}</p>
<p>Автор: <b>{PHP.urr.user_name}</b> (ID: {PHP.urr.user_id})</p>
<!-- IF {PHP|cot_isOwner()} -->
<button onclick="window.location.href='{PHP|cot_url('forums', 'm=editpost&id={FORUMS_POSTS_ROW_ID}')}';">Редактировать комментарий</button>
<!-- ENDIF -->
</div>
<!-- END: FORUMS_POSTS_ROW -->
Объяснение:
{PHP|cot_isOwner()} проверяет, является ли текущий пользователь автором комментария.- Кнопка "Редактировать комментарий" отображается только для владельца.
{FORUMS_POSTS_ROW_TEXT} содержит текст комментария, а {FORUMS_POSTS_ROW_ID} — его ID.{PHP.urr.user_name} и {PHP.urr.user_id} показывают данные автора комментария.
5. Универсальный блок проверки
Этот пример можно использовать на любой странице, где требуется отобразить информацию о владельце или показать условный контент. Например, в шаблоне index.tpl или любом другом.
<!-- IF {PHP|cot_isOwner()} -->
<p>Вы владелец страницы!</p>
<p>{PHP.usr.profile.user_name} | <b>{PHP.usr.name}</b> | * {PHP.usr.user_name} * {PHP.usr.id} - {PHP.urr.user_name} <b>{PHP.urr.user_id}</b></p>
<!-- ELSE -->
<p>Вы просматриваете чужую страницу.</p>
<p>{PHP.usr.name} | Привет, я - {PHP.urr.user_name}</p>
<hr>
<p>Привет {PHP.usr.profile.user_name} | <b>{PHP.usr.name}</b> | * {PHP.usr.user_name} * {PHP.usr.id} - {PHP.urr.user_name} <b>{PHP.urr.user_id}</b></p>
<!-- ENDIF -->
Объяснение:
{PHP|cot_isOwner()} определяет, является ли текущий пользователь владельцем страницы.- Если пользователь — владелец, отображается сообщение "Вы владелец страницы!" и информация о нем.
- Если пользователь — гость или просматривает чужую страницу, отображается приветственное сообщение и данные владельца страницы.
- Глобальные переменные
{PHP.usr.profile.user_name}, {PHP.usr.name}, {PHP.usr.user_name}, {PHP.usr.id}, {PHP.urr.user_name} и {PHP.urr.user_id} используются для вывода информации о текущем пользователе и владельце страницы.
Заключение
Функции cot_getUserDataOwner() и cot_isOwner() предоставляют мощный инструмент для управления доступом к контенту в Cotonti Siena v0.9.26. Их можно использовать в любых модулях и шаблонах для условного отображения элементов интерфейса, таких как кнопки редактирования, удаления или управления профилем. Глобальные переменные, такие как {PHP.usr.profile.user_name} и {PHP.urr.user_id}, позволяют гибко отображать данные пользователей, делая интерфейс информативным и безопасным.
Добавив эти функции в system/functions.custom.php и используя приведенные примеры в шаблонах, вы сможете легко настроить отображение контента только для владельцев в различных локациях сайта, таких как профили, статьи, сообщения и форумы.