Инструменты пользователя

Инструменты сайта


основы_плагинов

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

Поэтому настоятельно рекомендуется вносить любые изменения в функциональность MyBB по умолчанию через систему плагинов, а не изменять файлы.

Разработка плагинов требует хороших знаний PHP, SQL и достаточных знаний MyBB для навигации по основным файлам, чтобы вы могли найти ответы в исходном коде. Если вам нужна помощь, разместите тему в разделе Plugin Development на форумах Сообщества MyBB для получения помощи от сообщества.

Основы

Во-первых, вы должны выбрать название плагина в нижнем регистре, для его использование в некоторых функциях плагина. Эта строка должна быть уникальной и актуальной для вашего плагина. В этом примере мы будем использовать “myplugin”.

Создайте PHP файл для вашего плагина в inc/plugins и назовите его в соответствии с вышеизложенным, например inc/plugins/myplugin.php.

Начните с ввода следующего кода в файл плагина:

<?php

// Disallow direct access to this file for security reasons
if(!defined("IN_MYBB"))
{
	die("Direct initialization of this file is not allowed.");
}


function myplugin_info()
{
	return array(
		"name"			=> "",
		"description"	=> "",
		"website"		=> "",
		"author"		=> "",
		"authorsite"	=> "",
		"version"		=> "1.0",
		"guid" 			=> "",
		"codename"		=> "",
		"compatibility" => "*"
	);
}

function myplugin_install()
{

}

function myplugin_is_installed()
{

}

function myplugin_uninstall()
{

}

function myplugin_activate()
{

}

function myplugin_deactivate()
{

}
Перечисленные выше функции должны иметь префикс названия плагина. Поэтому вы должны заменить myplugin на имя файла вашего плагина, например myplugin_info должен называться foobar_info, если ваш файл плагина был назван foobar.php.

В _info() функция-это единственная функция. Тем не менее, вы должны убедиться, что все изменения, внесенные install или activate, отменены в uninstall или deactivate, соответственно. Например, если вы создаете таблицу в _install (), вы должны удалить эту таблицу в _uninstall().

Заполните тело функций в файле плагина по мере необходимости:

_info()

Возвращает массив информации о плагине::

name: название плагина
description: описание того, что делает плагин
website: сайт поддержки плагина (опционально)
author: автор
authorsite: сайт автора (опционально)
version: версия плагина
guid: уникальный идентификатор, выданный сайтом Mybb Extend для проверки версий (устарел, предпочитаю кодовое имя)
codename: уникальное кодовое имя плагина в разделе mods
compatibility: список поддерживаемых версий MyBB в формате CSV. Например: “121,123”, “12*”. Поддерживаются групповые символы.

N.B.

Кодовое имя совпадает с именем плагина, которое используется для обозначения функций. Желательно использовать следующий код:

$codename = str_replace('.php', '', basename(__FILE__));

_install()

Вызывается при установке плагина нажатием кнопки «Установить» в менеджере плагинов. Если процедуры установки не существует, кнопка «Установить» не отображается в панели администратора, и предполагается, что любая работа будет выполняться в подпрограмме _activate().

В этой функции обычно создаются необходимые таблицы, поля и настройки.

_is_installed()

Вызывается на странице управления плагином, чтобы определить: установлен плагин или нет.

Это должно вернуть TRUE, если плагин установлен (проверка таблицы, поля и т. д.) или FALSE, если плагин не установлен.

Обычно используется существование таблицы или настройки, созданной в функции _install(), чтобы определить, установлен ли плагин или нет. Ниже приведена общая реализация, предполагающая, что создана таблица с именем my_plugin:

function myplugin_is_installed()
{
    global $db;
    if($db->table_exists("my_plugin"))
    {
        return true;
    }
    return false;
}

_uninstall()

Вызывается всякий раз, когда плагин должен быть удален. Функция должна удалять все следы плагина от установки (таблицы и т. д.). Если функция отсутствует, кнопка удаления не отображается в панели администратора.

_activate()

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

_deactivate

Вызывается при деактивации плагина. Функция должна “прятать” действия плагина из шаблонов/изменения шаблонов и т. д. Это означает, что данная функция не должна удалять любую информацию, такую как таблицы, поля и т. д.; функция обрабатываться подпрограммой _uninstall. Когда плагин удаляется, эта процедура также будет вызвана перед _uninstall(), если плагин активен.

Хуки плагина

Чтобы ваш плагин действительно работал, вам нужно «подключить» свой код к MyBB. Это можно сделать во многих местах кода MyBB.

Вы можете найти список хуков здесь. В качестве альтернативы можно выполнить следующую команду в системе *nix в каталоге MyBB:

grep -inr '$plugins->run_hooks' ./

Основное использование

Сначала добавьте хук, поместив следующий код над функцией _info() в верхней части файла плагина:

$plugins->add_hook('<hook name>', '<function name>');
Где <hook name> - это имя хука, который вы хотите использовать, а <function name> - это имя функции в вашем плагине, которая будет запускаться каждый раз при вызове этого хука.

Внимание: здесь используется наименование функции, а не ее вызов.

Вот пример, который использовал index_start хук и вызывает функцию do_something():

$plugins->add_hook('index_start', 'do_something');
Теперь можно реализовать указанную функцию. Эта функция должна быть либо в файле плагина, либо включена вашим плагином. Например, если вы определили следующую функцию в этом файле плагина, она будет вызываться каждый раз при вызове index_start:
function do_something()
{
    // Do whatever you want here
}
Для достижения большинства целей необходимо взаимодействовать с глобальными переменными MyBB, такими как $mybb, $user, $db и т. д. Например, можно проверить, является ли текущий пользователь администратором:
function do_something()
{
    global $mybb;
    if($mybb->usergroup['cancp'] == 1)
    {
        // Admin only
    }
    else
    {
        // Everyone else
    }
}

Хуки с аргументами

Некоторые хуки также передают значение, относящееся к местоположению, где они вызываются. Эти хуки добавляются таким же образом, за исключением того, что вы должны добавить аргумент в функцию плагина. В некоторых случаях необходимо также вернуть это значение (которое может быть изменено вашим плагином).

Вот пример двух хуков:

$plugins->add_hook("pre_output_page", "hello_world");
$plugins->add_hook("postbit", "hello_world_postbit");
И две связанные функции плагина, первая изменяет содержимое $content и возвращает его, вторая изменяет значение, передаваемое по ссылке.
function hello_world($page)
{
	// This will add Hello World to the top of pages
	$page = str_replace(
        '<div id="content">',
        '<div id="content"><p>Hello World!</p>',
        $page
	);
	return $page;
}

function hello_world_postbit(&$post)
{
	// This will add Hello World to the top of all posts
	$post['message'] = '<strong>Hello world!</strong><br />' . $post['message'];
}
Вам нужно будет проверить контекст, в котором вызывается хук, чтобы определить, нужно ли возвращать аргумент обратно, или он должен быть изменен по ссылке.

Другие варианты хука

Есть еще два необязательных аргумента, которые можно передать в $plugins→add_hook(): priority и file. Например:

$plugins->add_hook('<hook name>', '<function name>', '<priority>', '<file>');

// With values
$plugins->add_hook('index_start', 'do_something', 5, 'anotherfile.php');
<Priority> учитывает, есть ли две или более функции, связанные с обработчиком. Меньшее значение в параметре priority будет означать, что функция будет выполнена раньше других функций с более высоким приоритетом (например, приоритет 0 будет выполняться до 10). Приоритет по умолчанию 10. Обычно вам не нужно будет использовать этот параметр, если у вас нет двух плагинов, которые конфликтуют друг с другом в одном хуке.

Имя файла в параметре <file> будет included-once при запуске хука, перед выполнением функции.

Настройки плагина

Плагины могут создавать настройки, которые интегрируются с вкладкой «конфигурация» ACP. Общие параметры плагина должны быть реализованы с помощью этого метода для обеспечения согласованности между плагинами.

Настройки обычно добавляются и удаляются в методах _install() и _uninstall() соответственно, так что плагин может быть деактивирован без потери настроек.

Добавление настроек

Для создания параметров необходимо сначала создать группу параметров и получить ее идентификатор:

global $db, $mybb;

$setting_group = array(
    'name' => 'mysettinggroup',
    'title' => 'My Plugin Settings',
    'description' => 'This is my plugin and it does some things',
    'disporder' => 5, // The order your setting group will display
    'isdefault' => 0
);

$gid = $db->insert_query("settinggroups", $setting_group);
Теперь вы можете добавить некоторые настройки в группу:
$setting_array = array(
    // A text setting
    'fav_colour' => array(
        'title' => 'Favorite Colour',
        'description' => 'Enter your favorite colour:',
        'optionscode' => 'text',
        'value' => 'Blue', // Default
        'disporder' => 1
    ),
    // A select box
    'green_good' => array(
        'title' => 'Is green good?',
        'description' => 'Select your opinion on whether green is good:',
        'optionscode' => "select\n0=Yes\n1=Maybe\n2=No",
        'value' => 2,
        'disporder' => 2
    ),
    // A yes/no boolean box
    'enable_lasers' => array(
        'title' => 'Enable lasers?',
        'description' => 'Do you want the lasers turned on?',
        'optionscode' => 'yesno',
        'value' => 1,
        'disporder' => 3
    ),
);

foreach($setting_array as $name => $setting)
{
    $setting['name'] = $name;
    $setting['gid'] = $gid;

    $db->insert_query('settings', $setting);
}

// Don't forget this!
rebuild_settings();
Следующий тип поля настройки (он же. код опций) поддерживает значения:

  • text : обычное текстовое поле
  • numeric : числовое поле
  • textarea : большое текстовое поле
  • yesno : логическое значение да/нет
  • onoff : логическое управление вкл/выкл
  • select : поле выбора (в формате select с последующим = по одному в новой строке)
  • forumselect : встроенный переключатель + флажок для выбора форумов
  • forumselectsingle : встроенный флажок, чтобы выбрать только один форум
  • groupselect : встроенный переключатель + флажок для выбора групп
  • groupselectsingle : встроенный флажок, чтобы выбрать только одну группу пользователей
  • radio : набор переключателей (в формате select, за которым следует = с одним в новой строке)
  • checkbox : логическое поле checkbox
  • language : выбор языка
  • adminlanguage : язык админ панели
  • cpstyle : выбор темы
  • php : php код

Если вы установите плагин, вы теперь сможете увидеть вашу новую группу настроек и ее настройки на вкладке “конфигурация” ACP.

Вы можете открыть эти значения через $mybb→settings['<setting name>'], например $mybb→settings['enable_lasers'].

Удаление настроек

Если вы добавляете настройки в функцию _install(), их также необходимо удалить в функции _uninstall().

Вот пример удаления вышеуказанных настроек:

global $db;

$db->delete_query('settings', "name IN ('fav_colour','green_good','enable_lasers')");
$db->delete_query('settinggroups', "name = 'mysettinggroup'");

// Don't forget this
rebuild_settings();

Использование параметров для ''_is_installed()''

Вы можете использовать один из параметров для реализации функции _is_installed(); Например:

global $mybb;
if(isset($mybb->settings['green_good']))
{
    return true;
}

return false;
Vladimir 24.12.2018 17:38

основы_плагинов.txt · Последние изменения: 24.12.2018 17:41 — vladimir