Расширение phpBB SiteMaker
Вы можете расширить/изменить phpBB SiteMaker, используя сервисную замену, украшение сервиса, и систему событий phpBB. Вы можете найти список поддерживаемых событий здесь.
#
Создание блока SiteMakerБлок phpBB SiteMaker - это просто класс, расширяющий blitze\sitemaker\services\blocks\driver\block класс и возвращает массив из метода "display" с именем "title" и "content". Все остальное между собой зависит от вас. Чтобы ваш блок phpBB SiteMaker, вам нужно ввести тэг "sitemaker.block".
Скажем, у нас есть расширение с vendor/extension в качестве мои/примера. Создавать блок "my_block" для phpBB SiteMaker:
- Создать папку "блоки"
- Создайте файл my_block.php в папке блоков со следующим содержимым
namespace my\example\blocks;
use blitze\sitemaker\services\blocks\driver\block;
класс my_block extends block{ /** * {@inheritdoc} */ public function display(array $settings, $edit_mode = false) { return array( 'title' => 'my block title', 'content' => 'мое содержимое блока', ); }}
Затем в файле config.yml, добавьте следующее:
услуг:
...
my.example.block.my_block: class: my\example\blocks\my_block вызовы: - [set_name, [my.example.block.my_block]] теги: - { name: sitemaker.block }
....
Как минимум, это все, что вам нужно. Если вы заходите в режим редактирования, вы должны увидеть блок в виде 'MY_EXAMPLE_BLOCK_MY_BLOCK', который можно перетащить и вытащить на любую позицию блока. Но этот блок не делает ничего интересного. Он не имеет настроек и не переводит название блока. Давайте сделаем его более интересным.
#
Настройки блокаДавайте изменим наши блоки/my_block. hp файл и добавьте метод "get_config" на возвращает массив с ключами настроек блока и значениями, представляющими собой массив, описывающий такие параметры, как
/** * @inheritdoc */ public function get_config(array $settings) { $options = array(1 => 'SOME_LANG_VAR', 2 => 'OTHER_LANG_VAR'); возвращаемый массив( 'legend1' => 'TAB1', 'checkbox' => массив('lang' => 'SOME_LANG_VAR_1', 'validate' => 'string', 'type' => 'checkbox', 'options' => $options, 'По умолчанию' => массив(), 'объяснять' => ложь), 'yes_no' => array('lang' => 'SOME_LANG_VAR_2', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false, 'default' => false), 'radio' => массив('lang' => 'SOME_LANG_VAR_3', 'validate' => 'bool', 'type' => 'radio', 'options' => $options, 'объяснить' => false, 'default' => 'тема'), 'select' => array('lang' => 'SOME_LANG_VAR_4', 'validate' => 'string', 'type' => 'select', 'options' => $options, 'default' => '', 'объяснить' => false), 'multi' => массив('lang' => 'SOME_LANG_VAR_5', 'validate' => 'string', 'type' => 'multi_select', 'options' => $options, 'default' => array(), 'explain' => false), 'legend2' => 'TAB2', 'number' => массив('lang' => 'SOME_LANG_VAR_6', 'validate' => 'int:0:20', 'type' => 'number:0:20', 'maxlength' => 2, 'explain' => false, 'по умолчанию' => 5), 'textarea' => массив('lang' => 'SOME_LANG_VAR_7', 'validate' => 'string', 'type' => 'textarea:3:40', 'maxlength' => 2, 'explain' => true, 'по умолчанию' => ''), 'Переключатель' => массив('lang' => 'SOME_TOGLABLE_VAR', 'validate' => 'string', 'type' => 'select:1:0:toggle_key', 'options' => $options, 'по умолчанию' => '', 'append' => '<div id="toggle_key-1">показывать только при выборе варианта 1</div>'), );}
Это так же, как phpBB строит конфигурацию форумов в ACP. Вы можете посмотреть больше примеров здесь.
Если вы хотите настраиваемый тип поля, вы можете увидеть пример здесь (параметр 'content_type').
Обратите внимание на "legend1" и "legend2" - это разделение настроек на вкладки.
#
Именованные блокиКонвенция о именах блоков заключается в том, что сервис имени (например my.example.block. yблок выше) будет использоваться в качестве ключа языка, заменив точки (.) на подчеркивание () (например, MY_EXAMPLE_BLOCK_MY_BLOCK).
#
ПереводТакже обратите внимание, что у нас есть несколько языковых ключей, которые необходимо перевести. Чтобы сделать это, создайте файл с именем "blocks_admin.php" в папке языка. Этот файл будет автоматически загружен при редактировании блоков и должен иметь переводы для настроек блоков и названия.
$lang = array_merge($lang, массив( 'SOME_LANG_VAR' => 'Option 1', 'OTHER_LANG_VAR' => 'Option 2', 'SOME_LANG_VAR_1' => 'Настройки 1',.... 'MY_EXAMPLE_BLOCK_MY_BLOCK' => 'Мой блок',);
Поскольку 'blocks_admin.php' загружается только при редактировании блоков, вам нужно будет добавить другие переводы (напр. block title), загрузив языковой файл в вашем методе отображения, например $language->add_lang('my_lang_file', 'my/example');
#
Отображение блокаНовый блок будет отображаться только если он что-то рендерует. Блок может вернуть любую строку как содержимое, но в большинстве случаев вам нужен шаблон, чтобы отобразить содержимое. Чтобы отобразить ваш блок с помощью шаблонов, блок должен возвращать массив, содержащий данные, которые вы хотите передать в шаблон, и должен также использовать метод get_template
, как показано ниже:
/** * @inheritdoc */ public function get_config(array $settings) { $options = array(1 => 'SOME_LANG_VAR', 2 => 'OTHER_LANG_VAR'); возвращаемый массив( 'legend1' => 'TAB1', 'some_setting' => массив('lang' => 'SOME_LANG_VAR_1', 'validate' => 'string', 'type' => 'checkbox', 'options' => $options, 'По умолчанию' => массив(), 'объяснять' => ложь), ); }
/** * {@inheritdoc} */ public function get_template() { return '@my_example/my_block. tml'; }
/** * {@inheritdoc} */ public function display(array $data, $edit_mode = false) { if ($edit_mode) { // делаем что-то только в режиме редактирования }
return array( 'title' => 'MY_BLOCK_TITLE', 'data' => массив( 'some_var' => $data['settings']['some_setting'], ), );}
Затем файл styles/all/my_block.html или styles/prosilver/my_block.html может выглядеть следующим образом:
<p>Вы выбрали: {{ some_var }}</p>
In summary, your block must return an array with a title
key (for the block title) and a content
key (if the block just displays a string and does not use a template) or a data
key (if the block uses a template, in which case, you will also need to implement the get_template
method).
#
Блокировать активыЕсли вашему блоку нужно добавить на страницу ресурсы (css/js), я рекомендую использовать для этого инструмент утилита класса. Поскольку на странице может быть несколько экземпляров одного и того же блока, или другие блоки могут добавить один и тот же актив, утилита класса гарантирует, что актив добавляется только только.
$this->утилита>add_assets(array( 'js' => array( '@my_example/assets/some. s', 100 => '@my_example/assets/other. s', // установить приоритет ), 'css' => array( '@my_example/assets/some. ss', )));
Класс util должен, конечно, быть добавлен в ваши служебные определения в config.yml, как так: - '@blitze.sitemaker. til'
и определено конструктором вашего блока \blitze\sitemaker\services\util $util
.
Вот и всё. Мы закончили!