Плагин SubscriptCatForum для Cotonti CMF
Подписка пользователей на обновления категорий форума
1. Обзор функционала и назначение
SubscriptCatForum — это плагин для Cotonti CMF, который реализует систему подписки пользователей на категории форума. После подписки пользователь получает уведомления на электронную почту при появлении новых событий в выбранных разделах.
Основная задача плагина — упростить отслеживание активности на форуме. Пользователю не требуется регулярно проверять интересующие разделы: система автоматически отправляет уведомления о новых событиях.
Основные возможности
Подписка на категории форума
Пользователь может выбрать одну или несколько категорий форума и подписаться на их обновления. Управление подписками осуществляется через отдельную страницу плагина.
После подписки пользователь будет получать уведомления обо всех новых событиях в выбранных разделах.
Email-уведомления
При появлении новых событий в категории плагин отправляет подписчикам email-уведомление. Сообщение содержит:
- название темы
- название раздела
- имя автора сообщения
- текст последнего сообщения (без HTML)
- ссылку на тему
- ссылку на конкретный пост
Отслеживаемые события
Плагин реагирует на события форума через систему хуков Cotonti. Уведомления отправляются при следующих действиях:
- создание новой темы в категории
- создание нового сообщения в теме
- редактирование сообщения
- перемещение темы между категориями (учтено в логике уведомлений)
Управление подписками пользователем
Пользователь может:
- подписываться на категории
- изменять список подписок
- полностью удалить подписки
Для этого используется отдельная страница плагина, доступная через меню личного кабинета.
Административное управление подписками
Администратор сайта может:
- просматривать подписчиков каждой категории
- добавлять пользователя в подписку
- удалять пользователя из подписки
Административный интерфейс отображает список категорий форума и привязанных к ним пользователей.
Преимущества использования
- Пользователь следит только за интересующими разделами.
- Нет необходимости подписываться на каждую тему отдельно.
- Снижается вероятность пропустить новые обсуждения.
- Администратор может централизованно управлять подписками.
Текущие ограничения
На момент реализации плагина имеются следующие ограничения:
- уведомления отправляются сразу при возникновении события (без cron)
- отсутствует пагинация
- ведётся отладочное логирование
Плагин ориентирован на использование на небольших форумах Cotonti.
Требования
Плагин тестировался в следующей конфигурации:
- Cotonti CMF (актуальная версия из GitHub на 25-02-2025)
- PHP 8.4
- MySQL 8.4
2. Техническая часть (работа плагина)
Плагин использует систему хуков Cotonti, что позволяет реагировать на события форума и выполнять отправку уведомлений.
Архитектура плагина
Основные компоненты:
- таблица подписок
- хуки событий форума
- standalone-страница управления подписками
- административный интерфейс
- функции работы с подписками
Таблица подписок
Плагин создаёт отдельную таблицу:
CREATE TABLE IF NOT EXISTS `cot_subscriptcatforum` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`user_id` INT UNSIGNED NOT NULL,
`cat_forum_subs` text NOT NULL,
`created_at` INT UNSIGNED NOT NULL DEFAULT 0
);
Поля:
| поле | описание |
| id | уникальный идентификатор записи |
| user_id | ID пользователя |
| cat_forum_subs | код категории форума |
| created_at | время создания подписки |
Хуки форума
Плагин реагирует на несколько событий форума.
1. Новый пост
Хук:
Hooks=forums.posts.newpost.done
Файл:
subscriptcatforum.forums.posts.newpost.done.php
Основные действия:
- определяется ID темы и код категории
- извлекается последний пост
- ищутся подписчики категории
- формируется email
- выполняется отправка уведомлений
Получение подписчиков:
$subscribers = $db->query("
SELECT u.user_email, u.user_id
FROM $db_subscriptcatforum s
JOIN $db_users u ON s.user_id = u.user_id
WHERE s.cat_forum_subs = ?
AND u.user_id != ?", [$section_code, $post_author_id])->fetchAll();
Автор поста исключается из списка получателей.
2. Создание новой темы
Хук:
Hooks=forums.newtopic.newtopic.done
Файл:
subscriptcatforum.forums.newtopic.newtopic.done.php
Алгоритм:
- определяется ID темы
- извлекается название темы и категория
- получаются данные первого сообщения
- формируется письмо
- выполняется рассылка подписчикам категории
3. Редактирование поста
Хук:
Hooks=forums.editpost.update.done
Файл:
subscriptcatforum.forums.editpost.update.done.php
Этот обработчик:
- получает категорию
- находит подписчиков
- извлекает обновлённый пост
- отправляет уведомление о редактировании
Формирование ссылок
Ссылки на тему и пост формируются стандартными функциями Cotonti:
$topic_url = cot_url('forums', 'm=posts&q=' . $topic_id);
$post_url = cot_url('forums', "m=posts&id=" . $post_id . "&n=last", "#bottom");
Отправка email
Используется встроенная функция Cotonti:
cot_mail($user_email, $subject, $message);
Логирование
Для отладки используется запись в файл:
function log_to_file_newpostdone($message) {
$logfile = __DIR__ . '/subscription_debug.log';
$date = date('Y-m-d H:i:s');
file_put_contents($logfile, "[$date] $message\n", FILE_APPEND);
}
Лог фиксирует:
- запуск обработчика
- параметры запроса
- найденных подписчиков
- отправку писем
Функции управления подписками
Файл:
subscriptcatforum.functions.php
Основные функции:
Проверка подписки
function check_existing_subscription($user_id, $forum_id) {
return $db->query("SELECT COUNT(*) FROM $db_subscriptcatforum WHERE user_id = ? AND cat_forum_subs = ?", [$user_id, $forum_id])->fetchColumn() > 0;
}
Подписка пользователя
function subscribe_user($user_id, $forum_id) {
$db->query("INSERT INTO $db_subscriptcatforum (user_id, cat_forum_subs, created_at) VALUES (?, ?, ?)", [$user_id, $forum_id, time()]);
}
Отписка пользователя
function unsubscribe_user($user_id, $forum_id) {
$db->query("DELETE FROM $db_subscriptcatforum WHERE user_id = ? AND cat_forum_subs = ?", [$user_id, $forum_id]);
}
3. Установка, настройка и эксплуатация
Установка плагина
- Скопировать папку плагина
subscriptcatforum
в каталог
/plugins/
- Открыть панель администратора Cotonti.
- Найти плагин SubscriptCatForum.
- Установить его.
При установке автоматически создаётся таблица:
cot_subscriptcatforum
Добавление ссылки в меню пользователя
Для доступа к странице управления подписками необходимо добавить ссылку в шаблон темы.
Пример фрагмента:
<!-- IF {PHP|cot_plugins_active('subscriptcatforum')} -->
<li><a href="{PHP|cot_url('subscriptcatforum')}">{PHP.L.subscriptcatforum_title_link}</a></li>
<!-- ENDIF -->
Ссылка обычно размещается в меню личного кабинета пользователя.
Страница управления подписками
Страница плагина отображает:
- список категорий форума
- вложенность категорий
- чекбоксы выбора
Пример HTML-структуры:
<input type="checkbox"
class="form-check-input"
name="selected_categories[]"
value="{CATEGORY_CODE}"
{IS_SELECTED}>
После отправки формы:
- старые подписки пользователя удаляются
- выбранные категории записываются в таблицу
$db->query("DELETE FROM $db_subscriptcatforum WHERE user_id = ?", [$usr['id']]);
Затем добавляются новые записи.
Администрирование подписок
Администратор может управлять подписками через инструмент:
admin → tools → subscriptcatforum
В интерфейсе отображаются:
- категории форума
- список подписчиков
- форма добавления пользователя
Добавление пользователя:
$db->insert($db_x . "subscriptcatforum", [
'user_id' => $user_id,
'cat_forum_subs' => $category_id,
'created_at' => time()
]);
Удаление пользователя:
$db->delete($db_x . "subscriptcatforum", "user_id = ? AND cat_forum_subs = ?", [$user_id, $category_id]);
Эксплуатация
Плагин начинает работать сразу после установки.
Уведомления отправляются автоматически при:
- создании темы
- публикации поста
- редактировании сообщения
Все события фиксируются в логах, что позволяет проводить диагностику.
Тема поддержки плагина, вопросы, обсуждения и предложения
Скачать плагин https://github.com/webitproff/cot-subscriptcatforum