Notice: Undefined index: name in /home/exbb/exbb.info/www/community/include/lib.php on line 293 Notice: Undefined index: name in /home/exbb/exbb.info/www/community/include/lib.php on line 293 ExBB Community :: Версия для печати :: Документация по плагинам
ExBB Community » » Обсуждение » Документация по плагинам

Страниц (2): [1] 2 »
 

1. WebMaster - 20 октября 2013 — 15:48 - перейти к сообщению
Что такое плагин?
Плагин - модуль, который предназначен для расширения функциональности ExBB. С помощью плагинов можно расширять функционал ExBB без редактирования кода движка(нужно только зарегистрировать событие если его нет).
Система плагинов реализована с помощью событий и их обработчиков.

Что такое событие и его обрабочик?
Событие - место в коде движка, где происходит какое-либо важное действие(например обработка сообщения перед его записью в файл). Для того, чтобы событие стало доступно для обработки плагинами, его нужно зарегистрировать. Регистрация события происходит с помощью метода
CODE:
setAction($action, $params = array());
. класса plugins
Обработчик - функция, которая выполняется во время определённого события. Обработчиков может быть неограниченное количество. Для того, чтобы во время события выполнялся обработчику, его тоже нужно зарегистрировать. Регистрация обработчика происходит с помощью метода
CODE:
setHandler($function, $action);
. класса plugins

Как я могу установить систему плагинов на свой форум?
Процесс установки системы плагинов описан здесь

Где находится панель управления плагинами?
Панель управления плагинами находится по адресу http://вашфорум.ru/plugins.php

Как установить новый плагин?
Автоматический установщик плагинов находится по адресу http://вашфорум.ru/plugins.php?a...n=install_plugin

Я установил плагин, нет никаких ошибок, но он не работает. Что делать?
Во первых проверьте, включен ли плагин. Это можно сделать здесь http://вашфорум.ru/plugins.php
Если плагин включен, но всё равно не работает, то нужно убедиться, что событие, которое он должен обрабатывать присутствует в системе. Как добавить событие для конкретного плагина должно быть написано в инструкции по его установке.

Как плагины влияют на скорость работы движка?
Плагины минимально влияют на скорость работы движка. Я использую такую систему в самодельном движке "Serial CMS"(Если кому интересно, могу скинуть исходники) и при 10-20 установленных плагинах и нескольких SQL запросах скорость генерации совсем маленькая(время 0.02-0.25сек.)

Какой функционал можно добавить с помощью плагинов?
С помощью моей реализации плагинов можно добавлять BB коды, смайлики, управлять выводом HTML кода и многое другое, но такие функции, как смена редактора сообщений реализовать скорее всего не удастся(для этого нужно модернизировать систему плагинов и менять код движка)

Что нужно знать и уметь, чтобы создать плагин?
Требуется знание основ PHP, HTML.
Для того, чтобы создать плагин не обязательно(но желательно) знать тонкости работы движка.
2. WebMaster - 20 октября 2013 — 17:12 - перейти к сообщению
Создание плагина "Слова-ссылки"
Сейчас мы создадим плагин, который будет позволять заменять слова в сообщении ссылками.
1) Создайте такую структуру файлов:

CODE:
install.php
info.php
wordlinks/
--plugin.php
--setting.php


Файлы install.php и info.php необходимы исключительно для установщика плагинов.
Файлы plugin.php и setting.php - это файлы самого плагина.
В файле plugin.php находятся обработчики событий, а в файле setting.php форма настроек плагина.

2) Создание информации о плагине.
В файл info.php добавьте такой код:
CODE:

<form method="POST" action="plugins.php?action=install_plugin&step=3">
<table width="99%" cellpadding="4" cellspacing="1" border="0" align="center" class="forumline">
<tr>
<th class="thHead" width="70%">Плагин:</th>
</tr>
<tr class="gen">
<td class="row1"><b>Слова-ссылки</b><br /><span class="gensmall">Плагин позволяет автоматически заменять слова ссылками.</span></td>
</tr>
<tr>
<td class="catBottom" colspan="3" align="center"><input type="submit" name="submit" value="Установить" class="mainoption" /></td>
</tr>
</table>
</form>


В этом файле находится форма, которая выводится при установке плагина.

3) Создание скрипта установки плагина
CODE:

<?php
if (!is_dir('plugins/wordlinks')) {
mkdir('plugins/wordlinks/');
}

define('PLUGIN', 'plugins/wordlinks/');
define('R', dirname(__FILE__).'/wordlinks/');

copy(R.'plugin.php', PLUGIN.'plugin.php');
copy(R.'setting.php', PLUGIN.'setting.php');

$plugins = fdb::read('plugins');
$plugins['wordlinks'] = array(
'active' => 1,
'name' => 'wordlinks',
'title' => 'Слова-ссылки',
'description' => 'Плагин позволяет заменять слова ссылками.'
);

fdb::write('plugins', $plugins);

$words = array(
'TEST' => 'http://test.ru/',
);

fdb::write('wordlinks', $words);


Теперь разберём подробнее этот код.
CODE:
if (!is_dir('plugins/wordlinks')) {
mkdir('plugins/wordlinks/');
}

В этих строках проверяется на существование директория с плагином, и если её не существует, то она создаётся с помощью функции mkdir

CODE:
define('PLUGIN', 'plugins/wordlinks/');
define('R', dirname(__FILE__).'/wordlinks/');

Здесь определяются константы. PLUGIN - каталог, в котором должен располагаться плагин, R - текущее расположение плагина.

CODE:
copy(R.'plugin.php', PLUGIN.'plugin.php');
copy(R.'setting.php', PLUGIN.'setting.php');

Копирование файлов плагина из каталога uploads/plugins/wordlinks/ в каталог plugins/wordlinks/

CODE:
$plugins = fdb::read('plugins');
$plugins['wordlinks'] = array(
'active' => 1,
'name' => 'wordlinks',
'title' => 'Слова-ссылки',
'description' => 'Плагин позволяет заменять слова ссылками.'
);

fdb::write('plugins', $plugins);

Здесь происходит регистрация плагина в системе. Сначала считывается содержимое файла plugins.php в массив такой структуры:
CODE:
array (
[Название плагина] => array(
active => Включён(1) или выключе(0) плагин,
name => 'Название каталога с плагином',
title => 'Название плагина',
description => 'Описание плагина',
),
);


После этого происходит добавление информации о плагинах в массив всех плагинов.
Затем этот массив записывается обратно в файл.

CODE:
$words = array(
'TEST' => 'http://test.ru/',
);

Это - ассоциативный массив слов и ссылок, на которые они заменяются.

CODE:
fdb::write('wordlinks', $words);

Запись массива со словами в файл wordlinks.php в каталог data/

3) Создание обработчика событий
В файл wordlinks/plugin.php запишите такой код:
CODE:
<?php
function parse_message($data) {
$words = fdb::read('wordlinks');

foreach ($words as $word => $link) {
$data[0] = str_replace($word, "<a href='{$link}'>{$word}</a>", $data[0]);
}
}
plugins::setHandler('parse_message', 'parse_message');

Функция
CODE:
plugins::setHandler('Обработчик', 'Событие');
регистрирует обработчик для события.
Теперь основные вопросы, которые могут появиться:
- Откуда берётся параметр $data?
- Этот параметр передаётся обработчику во время регистрации события.
- Что содержит параметр $data;
- $data - массив, первый элемент которого содержит указатель на обрабатываемый текст

4) Создание формы настроек:
В файл setting.php запишите такой код:
CODE:

<?php
if (isset($_GET['save'])) {
$array = linesToArray($_POST['wordarray']);
fdb::write('wordlinks', $array);
}

function arrayToLines($words) {
$string = '';

foreach ($words as $word => $link) {
$string .= $word.'='.$link."\n";
}

return $string;
}

function linesToArray($words) {
$array = array();
$lines = explode("\n", $words);

foreach ($lines as $id => $line) {
$line_array = explode('=', $line);
$array[$line_array[0]] = $line_array[1];
}

return $array;
}

$links = fdb::read('wordlinks');
$links = arrayToLines($links);

echo <<<DATA
<h1>Автоматическая подстановка ссылок</h1>
<p class="gensmall">'Здесь вы можете добавить, изменить или удалить слова, которые будут заменяться соответствующими им ссылками (устанавливаемыми вами).<br><br><b>Инструкция:</b> Введите "ключевое слово или фразу" и через знак "=" адрес ссылки, на который перейдет пользователь при клике. Убедитесь что каждый набор ключевого слова (или фразы) и ссылка находится на одной линии.</p>
<form action="plugins.php?action=setting_plugin&plugin={$_GET['plugin']}&save=1" method="post">
<input type="hidden" name="action" value="censor">
<input type="hidden" name="process" value="1">
<table width="100%" cellpadding="4" cellspacing="1" border="0" align="center" class="forumline">
<tr>
<th class="thHead">Настрока плагина "Автоматическая подстановка ссылок"</th>
</tr>
<tr class="gen">
<td align="center" class="row2"><textarea class="post" type="text" cols="105" rows="35" wrap="virtual" name="wordarray">{$links}</textarea></td>
</tr>
<tr>
<td class="catBottom" align="center"><input type="submit" name="submit" value="Сохранить" class="mainoption" /></td>
</tr>
</table>
</form>
<br clear="all" />
DATA;
?>


5) Сборка плагина.
Упакуйте созданные файлы install.php, info.php, wordlinks/plugin.php и wordlinks/setting.php в zip архив.

Всё, сам плагин готов.
Для того, чтобы он работал на чистом ExBB нужно установить систему плагинов и зарегистрировать событие parse_message
Для регистрации события нужно сделать следующее:
- Откройте файл include/fm.class.php
После строки
CODE:
$string = preg_replace_callback("#\[search\](.+?)\[\/search\]#is","search_link",$string);

добавьте код:
CODE:
//--!Регистрация события!--
plugins::setAction('parse_message', array(&$string));
//--!Регистрация события!--


Для установки плагина перейдите по адресу http://вашфорум.ru/plugin.php?ac...n=install_plugin

Для управления плагином перейдите по адресу http://вашфорум.ru/plugins.php. Напротив плагина "Слова-ссылки" есть ссылка на страницу настроек плагина.
К сообщению прикреплён архив с готовым плагином. Для его установки достаточно зарегистрировать событие parse_message
3. - 20 октября 2013 — 17:27 - перейти к сообщению
Я так понимаю это описание как это должно работать, но судя по всему пока не работает. Однако

Цитата:
Как установить новый плагин?
При попытке зайти по адресу http://вашфорум.ru/plugins.php?action=install вываливаются ошибки
Цитата:
Warning: include(./admin/plugins/install.tpl) [function.include]: failed to open stream: No such file or directory in Z:\home\final\www\plugins.php


Аааа, понял... Просто поторопился... Будем изучать дальше. Улыбка
4. WebMaster - 20 октября 2013 — 17:31 - перейти к сообщению
Цитата:
При попытке зайти по адресу http://вашфорум.ru/plugins.php?action=install вываливаются ошибки

Не ?action=install, а ?action=install_plugin
5. - 20 октября 2013 — 17:36 - перейти к сообщению
Я ничего не выдумывал - взял из вашего описания в самом верху темы.
6. WebMaster - 20 октября 2013 — 17:40 - перейти к сообщению
Цитата:
Я ничего не выдумывал - взял из вашего описания в самом верху темы.

Извините. Исправил ссылку
7. CAB - 20 октября 2013 — 18:41 - перейти к сообщению
WebMaster, у меня два, пока, вопроса по увязке плагинов с ядром форума ExBB:
1. Каким образом реализовать мультиязычность?
2. Каким образом реализовать увязку плагинов с установленными на форуме дополнениями и модификациями? В частности плагина "Слова-ссылки" и мода "Переход по внешним ссылкам через редирект"?
Я так понимаю, что при написании и установке плагинов такие вопросы будут возникать постоянно. ИМХО, всё-таки, необходима глубокая переработка ядра форума.
8. BON - 20 октября 2013 — 18:45 - перейти к сообщению
CAB пишет:
В частности плагина "Слова-ссылки" и мода "Переход по внешним ссылкам через редирект"?

на него должен действовать редирект автоматом как и на обычную ссылку. испольхуется стандартная ф-ция подмены
9. CAB - 20 октября 2013 — 20:22 - перейти к сообщению
BON, я имел ввиду
CAB пишет:
В частности
Иногда важно не только выполнить все действия над объектом, но и очерёдность имеет большое значение.
Возьмём для примера описанный выше случай: один результат мы получим если сначала обработаем текст сообщения через редирект потом через плагин и совсем другой если сначала плагин, а потом редирект.
Необходимо предусмотреть взаимозависимость плагинов между собой и относительно других дополнений и модификаций. Чтобы можно было определять очерёдность обработки, по крайней мере, одного и того же объекта (в описанном случае текста сообщения).
ИМХО, система плагинов не для данной версии форума. Нужно делать новую версию форума и ядра. Переделав всё окружение ядра в плагины, предусмотрев регулировку их взаимозависимостей.
10. WebMaster - 21 октября 2013 — 08:47 - перейти к сообщению
CAB, сейчас работаю над этим.
В следующей версии системы плагинов сделаю функцию для загрузки файла локализации.
А сейчас можно вручную загружать локализацию.
CODE:
include 'plugins/wordlinks/lang/rus.php';


Как вы предлагаете реализовать взаимодействие между плагинами?
11. CAB - 21 октября 2013 — 09:31 - перейти к сообщению
WebMaster пишет:
Как вы предлагаете реализовать взаимодействие между плагинами?
Если бы я знал... (мечтательно о свалившихся на меня деньгах Радость )
Но в принципе логично было бы предусмотреть возможность выставлять очередность или приоритет при обработке одного и того же объекта. Проблема в том, с моей точки зрения, что сложновато предвидеть для чего в будущем приспособят использовать тот или иной плагин. Если, например, жёстко закрепить в плагине объект обработки, например текст сообщения, то можно просто у всех плагинов, которые тоже предназначены для текста сообщения, в настройках выставлять очерёдность обработки данного объекта. А если у плагина несколько объектов, то очерёдность должна настраиваться для каждого отдельно. Но это хорошо если всё в виде плагинов. Если что-то в движке, тут сложнее намного. Тем более с учётом что далеко не у всех всё установлено или используется.
12. WebMaster - 21 октября 2013 — 09:54 - перейти к сообщению
В этом и заключается вся сложность.
Насчёт очерёдности выполнения, есть вариант указывать приоритет при регистрации функции-обаботчика.
CODE:
plugins::setHandler('handler', 'parse_message', 10);

Тогда сначала должны выполняться обработчики с более высоким приоритетом, а потом обработчики с более низким.
13. 1Bot - 21 октября 2013 — 11:12 - перейти к сообщению
WebMaster
Может для начала стандартизировать места вызова событий, а уж потом "навешивать" на них обработчики?
14. WebMaster - 21 октября 2013 — 11:42 - перейти к сообщению
Цитата:
Может для начала стандартизировать места вызова событий, а уж потом "навешивать" на них обработчики?

Желательно. Можно составить список самых необходимых используемых событий. А потом, когда появится больше плагинов можно сделать сборку, в которой уже будут зарегистрированы события и установлены некоторые плагины(но отключены по-умолчанию).
15. WebMaster - 23 октября 2013 — 14:33 - перейти к сообщению
На днях выложу новую систему плагинов.
- Добавлена функция быстрого удаления плагина.
- Добавлена функция для проверки подключён ли плагин
CODE:
plugins::isLoaded($plugin)

- Сделаю функцию для загрузки локализации плагина.
- Сделаю возможность задавать приоритет выполнения функции-обработчика
- Сделаю редактор php, tpl файлов(чтобы можно было добавить событие в нужное место не выходя из админ-панели).
Может быть придумаю ещё что-нибудь.

Яндекс.Метрика   

Powered by ExBB
[Script Execution time: 0.0248]     [ ]