Хаки и Скрипты Next Generation CMS

Готовый пример плагина с пояснениями

irbees2008 irbees2008 Опубликовано - 3 - марта Настройка плагинов
  • Автор: ???
  • Адаптировал: 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 всегда является целым числом в допустимом диапазоне.
Мультиязычность :
Добавить поддержку нескольких языков для интерфейса плагина.

Плагин рабочий, можете пробывать Вы не можете скачивать файлы с нашего сайта ,рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Можешь почитать и вот эту статейку "Хак- Предупреждение при переходе по внешней ссылке"

Опрос

Ваше мнение

Какой поисковой системой пользуетесь?
Результаты

Последние комментарии

Обновленное

Теги

Anything in here will be replaced on browsers that support the canvas element

Статистика

  • Caйту: 4718 дней
  • Новостей: 590
  • Комменты: 257
  • Зарегистрированно : 694
  • Онлайн всего: [3]
  • Гости: [3]
  • Были сегодня : [2] Google, Яндекс
  • SQL запросов: 35
  • Генерация страницы: 0.491сек
  • Потребление памяти: 5.194 Mb 
  •   Яндекс.Метрика