Расширение - это новая система изменения и дополнения функционала 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 позволяет использовать в качестве отступов исключительно пробелы. Знаки табуляции не допускаются.

 ).
 ).






