Заготовка плагина подписки на "Pages" по категориям

Заготовка, которая позволит написать плагин для Cotonti CMF, который позволит пользователям подписываться на обновления страниц в модуле "Pages" по категориям (например, "Новости", "События")

Заготовка, которая позволит написать плагин для Cotonti CMF, который позволит пользователям подписываться на обновления страниц в модуле "Pages" по категориям (например, "Новости", "События"). Cotonti использует модульную архитектуру, и создание такого плагина потребует работы с базой данных, хуками (hooks) и интерфейсом. Вот пример реализации такого плагина шаг за шагом.

План плагина:

    Название плагина: pagesubscribe (подписка на страницы).
    Функционал:
        Добавление кнопки "Подписаться" на страницы категорий в модуле "Pages".
        Сохранение подписок в базе данных.
        Уведомление подписчиков по email при добавлении новой страницы в выбранной категории.
    Требования:
        Работа с хуками Cotonti (например, page.add.add.done для уведомлений).
        Таблица в БД для хранения подписок.
        Интеграция с системой пользователей Cotonti.

Шаг 1: Структура плагина

Создай папку pagesubscribe в директории plugins твоей установки Cotonti. Структура будет выглядеть так:

 

plugins/pagesubscribe/
├── pagesubscribe.php         # Основной файл плагина
├── pagesubscribe.setup.php   # Установочный файл
├── lang/                     # Языковые файлы
│   ├── pagesubscribe.en.lang.php
│   └── pagesubscribe.ru.lang.php
└── tpl/                      # Шаблоны
    └── pagesubscribe.tpl
    


Шаг 2: Установочный файл (pagesubscribe.setup.php)

Этот файл описывает плагин и создаёт таблицу в базе данных для подписок.


<?php
defined('COT_CODE') or die('Wrong URL.');

$plugin_title = "Page Subscribe";
$plugin_desc = "Allows users to subscribe to page updates by category in the Pages module.";
$plugin_version = "1.0.0";
$plugin_author = "Your Name";

$plugin_install = <<<SQL
CREATE TABLE IF NOT EXISTS `cot_pagesubscribe` (
  `sub_id` INT NOT NULL AUTO_INCREMENT,
  `sub_userid` INT NOT NULL,
  `sub_cat` VARCHAR(255) NOT NULL,
  `sub_date` INT NOT NULL,
  PRIMARY KEY (`sub_id`),
  UNIQUE KEY (`sub_userid`, `sub_cat`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
SQL;

$plugin_uninstall = "DROP TABLE IF EXISTS `cot_pagesubscribe`;";


Шаг 3: Основной файл плагина (pagesubscribe.php)

Этот файл содержит логику подписки, отписки и отправки уведомлений.


<?php
defined('COT_CODE') or die('Wrong URL.');

require_once cot_incfile('users', 'module');
require_once cot_incfile('page', 'module');

// Хук для добавления кнопки подписки в список страниц
if ($a == 'subscribe' && cot_auth('plug', 'pagesubscribe', 'W')) {
    $cat = cot_import('cat', 'G', 'TXT');
    $userid = $usr['id'];

    if (!empty($cat) && $userid > 0) {
        $db->query("INSERT INTO $db_pagesubscribe (sub_userid, sub_cat, sub_date)
                    VALUES (?, ?, ?)
                    ON DUPLICATE KEY UPDATE sub_date = ?",
                    array($userid, $cat, time(), time()));
        cot_message('Subscribed successfully!');
    }
    cot_redirect(cot_url('page', "c=$cat"));
}

if ($a == 'unsubscribe' && cot_auth('plug', 'pagesubscribe', 'W')) {
    $cat = cot_import('cat', 'G', 'TXT');
    $userid = $usr['id'];

    if (!empty($cat) && $userid > 0) {
        $db->delete($db_pagesubscribe, "sub_userid = ? AND sub_cat = ?", array($userid, $cat));
        cot_message('Unsubscribed successfully!');
    }
    cot_redirect(cot_url('page', "c=$cat"));
}

// Хук для вывода кнопки подписки
$cot_hooks['page.list.tags'][] = 'pagesubscribe_list_tags';
function pagesubscribe_list_tags($tag_prefix = '') {
    global $usr, $c, $db, $db_pagesubscribe, $L;

    if ($usr['id'] > 0) {
        $is_subscribed = $db->query("SELECT COUNT(*) FROM $db_pagesubscribe WHERE sub_userid = ? AND sub_cat = ?",
                                    array($usr['id'], $c))->fetchColumn() > 0;
        
        $t = new XTemplate(cot_tplfile('pagesubscribe', 'plug'));
        $t->assign(array(
            'SUBSCRIBE_URL' => cot_url('plug', "r=pagesubscribe&a=subscribe&cat=$c"),
            'UNSUBSCRIBE_URL' => cot_url('plug', "r=pagesubscribe&a=unsubscribe&cat=$c"),
            'IS_SUBSCRIBED' => $is_subscribed,
        ));
        $t->parse('MAIN');
        return $t->text('MAIN');
    }
    return '';
}

// Хук для отправки уведомлений при добавлении страницы
$cot_hooks['page.add.add.done'][] = 'pagesubscribe_notify';
function pagesubscribe_notify($id, $page_data) {
    global $db, $db_pagesubscribe, $db_users, $cfg;

    $cat = $page_data['page_cat'];
    $subscribers = $db->query("SELECT sub_userid FROM $db_pagesubscribe WHERE sub_cat = ?", array($cat))->fetchAll();

    foreach ($subscribers as $sub) {
        $user = $db->query("SELECT user_email, user_name FROM $db_users WHERE user_id = ?", array($sub['sub_userid']))->fetch();
        $subject = "New page in category '$cat'";
        $body = "Hello {$user['user_name']},\n\nA new page has been added to the '$cat' category.\nCheck it out: " . cot_url('page', "id=$id", '', true) . "\n\nBest regards,\n{$cfg['maintitle']}";
        cot_mail($user['user_email'], $subject, $body);
    }
}


Шаг 4: Шаблон (pagesubscribe.tpl)

Файл шаблона для отображения кнопок подписки/отписки.


<!-- BEGIN: MAIN -->
<div class="subscribe-block">
    <!-- IF {IS_SUBSCRIBED} -->
    <a href="{UNSUBSCRIBE_URL}" class="btn btn-danger">Отписаться</a>
    <!-- ELSE -->
    <a href="{SUBSCRIBE_URL}" class="btn btn-success">Подписаться</a>
    <!-- ENDIF -->
</div>
<!-- END: MAIN -->


Шаг 5: Языковые файлы

Добавь переводы для сообщений.

pagesubscribe.ru.lang.php:


<?php
$L['Subscribed successfully!'] = 'Вы успешно подписались!';
$L['Unsubscribed successfully!'] = 'Вы успешно отписались!';


pagesubscribe.en.lang.php:


<?php
$L['Subscribed successfully!'] = 'Subscribed successfully!';
$L['Unsubscribed successfully!'] = 'Unsubscribed successfully!';

Шаг 6: Интеграция в интерфейс

Чтобы кнопка подписки появилась в списке страниц (например, на странице категории "Новости" или "События"), добавь тег {PAGE_LIST_SUBSCRIBE} в шаблон page.list.tpl в нужном месте:


<!-- page.list.tpl -->
<div class="page-list">
    {PAGE_LIST_SUBSCRIBE}
    {PAGE_LIST}
</div>

Шаг 7: Установка и тестирование

    Скопируй файлы плагина в папку plugins/pagesubscribe.
    Перейди в админ-панель Cotonti → "Расширения" → Установи плагин pagesubscribe.
    Проверь работу:
        Перейди на страницу категории (например, index.php?r=page&c=news).
        Подпишись и отпишись, проверь уведомления при добавлении новой страницы.

Примечания:

    Безопасность: Код использует подготовленные запросы для защиты от SQL-инъекций.
    Расширение: Можно добавить настройки в админ-панели (например, включение/выключение email-уведомлений).
    Стили: Настрой CSS для кнопок в шаблоне под дизайн сайта.

 

4 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-03-05 23:39
  • Last update: 2025-03-05 23:39

Similar pages

Заготовка плагина socialauth для Cotonti
1 Структура плагина socialauth для Cotonti, который включает авторизацию, регистрацию и привязку/отвязку аккаунтов
Инструкция по локализации названий категорий модуля "Pages" в произвольных ссылках
2 Цель Сделать так, чтобы названия категорий (например, "Новости", "Блог") в ссылках на сайте
Как изменить расположение папки с изображениями плагина Attach2
3 При оптимизации сайта возникают различные ситуации. Одной из них является смена расположения папки с картинками,
Настройка плагина Mavatars на Cotonti
4 Mavatars - это универсальный плагин, который позволяет прикреплять к записям на сайте любые файлы, в том числе
Как устроена проверка активности плагина в шаблонах
5 Как устроена проверка активности плагина в шаблонахcot_plugin_active() вызывает ExtensionsService::isPluginActive(),