Заготовка, которая позволит написать плагин для 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 для кнопок в шаблоне под дизайн сайта.