Проверка владельца контента в Cotonti на PHP 8.5

В этой статье подробно описывается, как реализовать проверку владельца контента. Мы рассмотрим, как использовать это в различных локациях сайта, таких как профиль пользователя, статьи, форум и т.д.

Проверка владельца контента в Cotonti на PHP 8.5

В Cotonti, управление доступом к контенту в зависимости от того, является ли пользователь его владельцем, — это важная задача для создания безопасного и удобного интерфейса. В этой статье подробно описывается, как реализовать проверку владельца контента с помощью двух функций: 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'];
}
?>

Объяснение функций

  1. cot_getUserDataOwner():
    • Функция проверяет URL-параметры id (числовой идентификатор пользователя) или u (имя пользователя).
    • Если указан параметр u, но нет id, выполняется запрос к базе данных для получения user_id по имени пользователя.
    • Если оба параметра отсутствуют, но пользователь авторизован (Cot::$usr['id'] > 0), используется ID текущего пользователя.
    • Если id определен, функция возвращает массив с данными пользователя из таблицы users или null, если пользователь не найден.
  2. 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 и используя приведенные примеры в шаблонах, вы сможете легко настроить отображение контента только для владельцев в различных локациях сайта, таких как профили, статьи, сообщения и форумы.

5 minutes read Sodium Carbonate

Comments (0)

No comments yet
Only registered users can post new comments

Content author

webitproff

Offline

Sodium Carbonate

Last logged: 2026-09-01 22:41

About me briefly
Support and development of web projects on the CMF Cotonti: private messengers via the website, open and closed small social networks, trading platforms and marketplaces, freelance and services exchange portal, catalogs of goods from wholesale suppliers, dropshipping platforms, online stores, and much more.
View developments and download
Public portfolio of my works and developments
Telegram for messages
@webitproff
Telegram channel
@s/aBuyFILE
  • Page published: 2025-09-06 08:04
  • Last update: 2026-08-18 00:34

Связанные статьи

Similar pages

Документация по переменным пользователя и владельца контента в Cotonti 0.9.26
1 Документация по переменным пользователя и владельца контента в Cotonti 0.9.26ВведениеCotonti предоставляет глобальные
Проверка прав пользователей "cot_auth()" в шаблонах Cotonti
2 Примеры использования cot_auth() в шаблонах Cotonti с разными масками прав (R, W, A, etc.) и с категориями тоже. Как
Как устроена проверка активности плагина в шаблонах
3 Как устроена проверка активности плагина в шаблонахcot_plugin_active() вызывает ExtensionsService::isPluginActive(),
Теги заголовков H1-H6 для структурирования контента.
4 Используйте теги заголовков H1-H6 для структурирования контента. Тег заголовка используется для выражения того, что
User Blog • 2023-12-30 18:32 webitproff
9 стратегий удаления негативного контента из Интернета
5 Негативные, ложные и дискредитирующие материалы в Интернете имеют серьезные последствия для компаний и частных лиц,
User Blog • 2024-01-17 10:54 webitproff