
14
- 0
- Автор: ???
- Адаптировал: irbees2008
- Уровень сложности исполнения: Справочник
Сейчас рассмотрим пример простого плагина. Он будет делать случайную выборку из таблицы с новостями. Состав плагина :
1. random_news.php
2. config.php
3. version.ini
4. random_news.tpl
5. entries.tpl
Теперь поподробнее рассмотрим каждый файл по отдельности. Писать плагин лучше начинать с файла version, по тому что так удобнее.
1. Файл version.ini
Этот файл содержит метаданные о плагине. Он используется системой для определения характеристик плагина и его интеграции в CMS.
Код:
;
; Version description file for plugin @@ Next Generation CMS
;
ID: random_news
Name: Случайная выборка новостей
Version: 0.02
Acts: index
File: random_news.php
Config: config.php
Type: plugin
Description: В случайном порядке показывает новости
Author: Anonimys
Author_URI: http://ngcms.ru/
Title: Случайные новости
Information: Случайно показывает новости
Preinstall: no
ID : Уникальный идентификатор плагина.
Acts : Указывает, на какие события (actions) подписан плагин. В данном случае — index.
File : Основной исполняемый файл плагина.
Config : Файл конфигурации плагина.
Type : Тип плагина (в данном случае — plugin).
Description , Author , Author_URI , Title , Information : Информация о плагине.
Preinstall : Указывает, требуется ли предварительная установка.
2. Файл random_news.php
Это основной исполняемый файл плагина. Здесь реализована логика работы плагина.
Код:
<?php
if (!defined('NGCMS')) die('HAL');
// Загрузка языкового файла
LoadPluginLang('random_news', 'config', '', '', ':');
add_act('index', 'random_news');
function random_news()
{
global $template, $mysql, $tpl, $config;
// Получаем параметры из конфига
$num = intval(extra_get_param('random_news', 'number'));
$cacheTime = intval(extra_get_param('random_news', 'cache_time'));
// Генерация имени кеш-файла
$cacheFileName = md5('random_news' . $config['theme'] . $config['default_lang'] . $num) . '.txt';
// Попытка получения данных из кеша
if ($cacheTime > 0) {
$cacheData = cacheRetrieveFile($cacheFileName, $cacheTime, 'random_news');
if ($cacheData !== false) {
$template['vars']['random_news'] = $cacheData;
return;
}
}
if (($num < 1) || ($num > 50)) {
$num = 10; // Значение по умолчанию
}
$tpath = locatePluginTemplates(array('random_news', 'entries'), 'random_news');
$v = '';
foreach ($mysql->select("SELECT * FROM " . prefix . "_news ORDER BY RAND() LIMIT " . $num) as $row) {
$tvars['vars'] = array(
'link' => newsGenerateLink($row),
'views' => $row['views'],
'title' => $row['title']
);
$tpl->template('entries', $tpath['entries']);
$tpl->vars('entries', $tvars);
$v .= $tpl->show('entries');
}
$tvars['vars'] = array('entries' => $v);
$tpl->template('random_news', $tpath['random_news']);
$tpl->vars('random_news', $tvars);
$output = $tpl->show('random_news');
// Сохранение в кеш
if ($cacheTime > 0) {
cacheStoreFile($cacheFileName, $output, 'random_news');
}
$template['vars']['random_news'] = $output;
}
Разбор кода:
Проверка безопасности :
if (!defined('NGCMS')) die ('HAL'); — защищает от прямого доступа к файлу.
Подключение к событию :
add_act('index', 'random_news'); — подписывает функцию random_news на событие index.
Логика работы :
Извлекается значение параметра number из конфига через extra_get_param. Если значение некорректное, используется значение по умолчанию (10).
Выполняется SQL-запрос к таблице новостей (prefix_news) с использованием ORDER BY RAND() для случайной выборки и ограничением количества записей (LIMIT).
Работа с шаблонами :
Для каждой новости рендерится шаблон entries.tpl.
Все записи объединяются в переменную $v и передаются в шаблон random_news.tpl.
Интеграция в глобальный шаблон :
Результат работы плагина добавляется в глобальный шаблон через $template['vars']['rendom_news'].
3. Файл config.php
Этот файл отвечает за настройки плагина. Пользователь может изменять параметры через административную панель.
Код:
<?php
if (!defined('NGCMS')) die('HAL');
// Загрузка текущего конфига
pluginsLoadConfig();
// Загрузка языкового файла
LoadPluginLang('random_news', 'config', '', '', ':');
$cfg = array();
$cfgX = array();
array_push($cfgX, array(
'name' => 'number',
'title' => $lang['random_news:number_title'],
'descr' => $lang['random_news:number_descr'],
'type' => 'input',
'value' => intval(extra_get_param('random_news', 'number'))
));
array_push($cfgX, array(
'name' => 'cache_time',
'title' => $lang['random_news:cache_time_title'],
'descr' => $lang['random_news:cache_time_descr'],
'type' => 'input',
'value' => intval(extra_get_param('random_news', 'cache_time'))
));
array_push($cfg, array(
'mode' => 'group',
'title' => $lang['random_news:group_title'],
'entries' => $cfgX
));
if ($_REQUEST['action'] == 'commit') {
commit_plugin_config_changes('random_news', $cfg);
print_commit_complete('random_news');
} else {
generate_config_page('random_news', $cfg);
}
Разбор кода:
Загрузка текущего конфига :
pluginsLoadConfig(); — загружает текущие настройки плагина.
Определение параметров :
Создается массив $cfgX, содержащий описание параметра number:
name: Имя параметра.
title: Название параметра для пользователя.
descr: Описание параметра.
type: Тип поля ввода (в данном случае — текстовое поле).
value: Текущее значение параметра.
Обработка действий :
Если пользователь отправил форму (action=commit), вызывается функция commit_plugin_config_changes для сохранения изменений.
Если форма не отправлена, генерируется страница настроек через generate_config_page.
В конфиге уже задается количество выводимых новостей!
4. Шаблоны random_news.tpl и entries.tpl
random_news.tpl - Этот шаблон отвечает за общий вид вывода новостей. В нем используется переменная {entries}, которая содержит результат рендера всех новостей.
Код:
<div class="random-news">
{entries}
</div>
entries.tpl - Этот шаблон отвечает за отображение одной новости. Доступны следующие переменные:
{link}: Ссылка на новость.
{views}: Количество просмотров.
{title}: Заголовок новости.
Код:
<div class="news-item">
<a href="{link}">{title}</a>
<span class="views">Просмотров: {views}</span>
</div>
Итоговая работа плагина:
Плагин подключается к событию index.
При вызове события выполняется функция random_news, которая:
Читает настройки из конфига.
Выбирает случайные новости из базы данных.
Рендерит их через шаблоны entries.tpl и random_news.tpl.
Результат добавляется в глобальный шаблон.
Сделаны улучшения:
Оптимизация SQL-запроса :
Использование ORDER BY RAND() может быть медленным для больших таблиц. Можно заменено его на более эффективный метод, например, выборку случайного ID.
Кэширование :
Кэширование результатов для уменьшения нагрузки на базу данных.
Валидация входных данных :
Убедиться, что параметр number всегда является целым числом в допустимом диапазоне.
Мультиязычность :
Добавить поддержку нескольких языков для интерфейса плагина.
Плагин рабочий, можете пробывать Вы не можете скачивать файлы с нашего сайта ,рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Можешь почитать и вот эту статейку "Хак- Предупреждение при переходе по внешней ссылке"
Это тоже интересно
- 06.09.19Плагин auth_basic
- 20.09.21Виджет переводчика от гугла
- 27.01.22particles-js
- 20.01.23Что может ИИ?
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.