Заготовка плагина подписки на "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 минут чтения Sodium Carbonate

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

webitproff

Онлайн

Sodium Carbonate

Последняя авторизация: 19.07.2026 01:13

  • Страница размещена: 05.03.2025 23:39
  • Последнее обновление: 05.03.2025 23:39

Похожие страницы

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