Расширение - это новая система изменения и дополнения функционала phpBB, представленная в версии phpBB 3.1, пришедшая на смену модам, использовавшимся в версии phpBB 3.0. Представляет из себя набор файлов, копируемых в папку
/ext
. Включение и настройка расширения осуществляется через администраторский раздел.Основное преимущество системы расширений - отсутствие необходимости вручную вносить изменения в исходный код и базу данных phpBB. Первое основано на так называемых "событиях".
Что такое событие?
Событие (event) - это строка (как правило, одна или две) в исходном коде, добавленная разработчиками. События подразделяются на два вида: событие ядра и событие шаблона. Каждое событие имеет собственный идентификатор, по которому определяется, код каких расширений и в каком месте будет выполняться.
Пример: событие ядра в posting.php
Код: Выделить всё
$vars = array('post_id', 'topic_id', 'forum_id', 'draft_id', 'lastclick', 'submit', 'preview', 'save', 'load', 'delete', 'cancel', 'refresh', 'mode', 'error');
extract($phpbb_dispatcher->trigger_event('core.modify_posting_parameters', compact($vars)));
core.modify_posting_parameters
. Массив $vars
содержит список переменных, которые будут переданы расширению и могут быть им использованы, в том числе изменены/дополнены их значения.Пример: событие шаблона в quickreply_editor.html
Код: Выделить всё
<!-- EVENT quickreply_editor_message_before -->
quickreply_editor_message_before
. О том, как работают события шаблонов, будет описано позже.В свою очередь, в расширениях имеются так называемые "слушатели" (или подписчики) событий ядра (listeners, event subscribers), представляющая собой сопоставление идентификатора события с именем функции в расширении, которая должна быть вызвана при возникновении данного события.
Например:
Код: Выделить всё
static public function getSubscribedEvents()
{
return array(
'core.page_header' => 'show_quicknick',
'core.viewtopic_modify_page_title' => 'show_bbcodes_and_smilies',
'core.modify_posting_parameters' => 'change_subject',
'core.posting_modify_template_vars' => 'delete_re',
);
}
static public function getSubscribedEvents()
является стандартной для перечисления подписчиков (или слушателей) события ядра. Как видно, при возникновении события core.page_header
будет вызвана функция function show_quicknick()
, которая задается в самом расширении. И так далее.События шаблона
Для событий шаблона система обработки немного отличается. При возникновении такого события, система пытается найти html файл, названный по имени данного события, в подпапках расширения, связанных со стилями. Например, для события
<!-- EVENT quickreply_editor_message_before -->
будет предпринята попытка найти файл quickreply_editor_message_before.html
в папках /ext/tatiana5/quickreply/styles/prosilver/template/event/
, /ext/tatiana5/quickreply/styles/subsilver2/template/event/
и аналогичных для других стилей, либо /ext/tatiana5/quickreply/styles/all/template/event/
, если данный шаблон события будет общим для всех стилей.Где находятся расширения?
Расширения должны располагаться в папке
/ext
. Внутри этой папки располагаются папки, названные по именам авторов (вендоров) расширений. Например, все расширения автора tatiana5 будут располагаться в папке /ext/tatiana5
.Вы можете сами выбрать для себя имя вендора, которое хотите использовать в этих целях. Оно будет необходимо и в коде самого расширения, но об этом чуть позже.
Из чего состоит расширение?
Расширения должны иметь определенную структуру - т.е. минимально необходимый набор папок и файлов, определяющих его работу:
Код: Выделить всё
config\
event\
migrations\
composer.json
ext.php
Папка
config
.В ней расположен единственный файл -
services.yml
, который передает системе основные сведения о расширении, его расположении и используемых им так называемых "сервисах" - т.е. встроенных классах и переменных phpBB. Например:
Код: Выделить всё
services:
tatiana5.quickreply.listener:
class: tatiana5\quickreply\event\listener
arguments:
- @auth
- @config
- @dbal.conn
- @template
- @user
- %core.root_path%
- %core.php_ext%
tags:
- { name: event.listener }
Строка
tatiana5.quickreply.listener:
задает основной сервис расширения - имя класса слушателя события listener
для расширения, находящегося в папке /ext/tatiana5/quickreply
. Строка
class: tatiana5\quickreply\event\listener
задает имя файла, в котором располагается класс. В данном случае это файл ext/tatiana5/quickreply/event/listener.php
.Блок
arguments:
задает перечень аргументов, которые будут использованы в конструкторе класса. Аргументы в конструкторе должны следовать исключительно в том же порядке, в котором они указаны здесь.В данном случае мы видим, что конструктор расширения будет использовать стандартные классы phpBB:
auth
, config
, db
, template
, user
, а также переменные phpbb_root_path
и php_ext
. А вот как это выглядит на практике:Код: Выделить всё
public function __construct(\phpbb\auth\auth $auth, \phpbb\config\config $config, \phpbb\db\driver\driver $db, \phpbb\template\template $template, \phpbb\user $user, $phpbb_root_path, $php_ext)
{
$this->auth = $auth;
$this->config = $config;
$this->db = $db;
$this->template = $template;
$this->user = $user;
$this->phpbb_root_path = $phpbb_root_path;
$this->php_ext = $php_ext;
}
services.yml
.Блок
tags:
является для слушателей событий стандартным и не подлежит изменению.Внимание: синтаксис языка YAML позволяет использовать в качестве отступов исключительно пробелы. Знаки табуляции не допускаются.