Итак, в первой части своих заметок про создание собственного расширения MediaWiki я добился того, что wiki признала мое расширение и стала выводит о нем информацию на странице Служебная:Версия. Но и все – больше ничего не происходит. Теперь, добьемся того, чтобы мое расширение зарегистрировало и показывало в системе свою собственную служебную страницу. Здесь уже придется приложить к мозгу немного языка php. Начнем, пожалуй.
Ready
Для начала, создадим в папке расширения папку src, в которой будем размещать php-код расширения. Это не обязательно, но я сделаю так чтобы не создавать в общей папке расширения мешанину из разнотипных файлов. Затем, создадим там файл, который будет обрабатывать вызов служебной страницы. Файл так и назовем: SpecialPage.php. Сначала приведу текст файла, потом поясню что да как:
Файл extensions/PhoneBook/src/SpecialPage.php:
<?php class PhoneBookSpecialPage extends SpecialPage { // Конструктор класса public function __construct() { // Вызываем конструктор базового класса и передаем ему идентификатор спецстраницы. parent::__construct( 'Phones' ); } // Показываем страницу пользователю public function execute( $sub ) { $out = $this->getOutput(); $out->setPageTitle( 'Телефонный справочник организации' ); $out->addWikiText( 'Здесь будет непосредственно текст справочника.' ); } } ?>
Для начала немного расскажу про базовый класс SpecialPage (документация). Это базовый класс, реализующий функционал служебных страниц. Для создания собственной служебной страницы необходимо создать свой класс, унаследовав его от класса SpecialPage. В самом простом случае, как здесь, например, у наследника необходимо переопределить конструктор и метод execute().
В конструкторе необходимо вызвать конструктор родителя и передать ему идентификатор создаваемой служебной страницы, в данном случае “Phones”. Идентификатор послужит как для вызова этой самой страницы, так и для локализации, что будет показано в следующей серии.
Метод execute() вызывается, когда происходит открытие служебной страницы (в моем случае http://моявики/Служебная:Телефоны). Этот метод обязателен к переопределению. В этом методе и происходит основная работа по формированию текста страницы. Вначале я получаю экземпляр класса OutputPage (документация). Этот класс используется для подготовки окончательного рендеринга страницы. Получаю я объект этого класса через вызов метода getOutput() родительского класса SpecialPage. Далее, я пользуюсь методами класса OutputPage, такими как setPageTitle() – чтобы установить заголовок страницы и addWikiText() чтобы добавить на страницу желаемый текст.
У классов SpecialPage и OutputPage достаточно много полезных методов, рекомендую посмотреть документацию, чтобы знать что может пригодиться. Это одни из основных классов и должны быть прочитаны по крайней мере один раз любыми новыми разработчиками
Steady
Ну что, базовый функционал написан, однако, пока это работать не будет – Wiki не знает, что это этот класс необходимо загружать при подключении расширения. Об этом ей необходимо сообщить. Для этого внесем изменение в наш главный описательный файл расширения – extensions/PhoneBook/extension.json. Добавлю туда вот такие строки:
"AutoloadClasses": { "PhoneBookSpecialPage": "src/SpecialPage.php" }
Конструкция AutoloadClasses указывает Wiki, какие классы необходимо автоматически подгружать при подключении расширения и в каком файле находятся эти классы. Теперь wiki будет знать, что при запуске необходимо подключить класс PhoneBookSpecialPage, который расположен в файле extensions/PhoneBook/src/SpecialPage.php.
Но и это еще не все. Класс-классом, однако этого мало. MediaWiki необходимо конкретно указать, что у расширения есть служебная страница, и какой класс ее обрабатывает. А для этого необходимо добавить в extension.json еще одно описание:
"SpecialPages": { "Phones": "PhoneBookSpecialPage" }
Эта конструкция важна именно для вывода служебной страницы. Здесь мы указываем системе идентификатор нашей страницы и какой класс ее обслуживает. Идентификатор должен совпадать с тем, который мы указали в нашем классе PhoneBookSpecialPage в вызове конструктора базового класса SpecialPage, т.е. “Phones”.
Приведу полный текст файла extensions/PhoneBook/extension.json после всех добавлений:
{ "name": "PhoneBook", "author": "StarXXX", "url": "https://hardisoft.ru/", "description": "Телефонный справочник организации", "version": "1.0", "license-name": "GPL-2.0+", "type": "other", "AutoloadClasses": { "PhoneBookSpecialPage": "src/SpecialPage.php" }, "SpecialPages": { "Phones": "PhoneBookSpecialPage" }, "manifest_version": 1 }
Go
Теперь пора приступать к тестированию того, что получилось. Открываем браузер и пишем http://моявики/Служебная:Phones. Почему Phones а не Телефоны? А потому, что локализация – тема следующей записки. А пока, система ничего про русский язык у нашего расширения не знает. Итак, переходим по адресу http://моявики/Служебная:Phones и, если все правильно сделано, видим радостную картинку:
Свершилось! Наше расширение задышало. Если не заморачиваться с локализацией и оставить вызов страницы таким как есть сейчас, то можно сразу приступать к реализации основного функционала страницы. Для этого достаточно поменять, согласно необходимой логике, содержимое метода PhoneBookSpecialPage.execute() – добавить необходимые запросы, получить данные из базы, сформировать текст страницы и скормить этот текст методу $out->addWikiText(); Кстати, этот метод принимает на входе wiki-разметку! Так что можно написать (или сформировать программно), например так:
$txt = <<<HERE [[Category:Справочная]] Уважаемые сотрудники! Для информационного обеспечения рабочего процесса представляем телефонный справочник нашей организации: == Телефоны руководства == {| class="wikitable" |Директор |555-111 |- |Зам. директора |555-112 |- |Секретарша |555-113 |} == Бухгалтерия == Главный бухгалтер 555-222 == АХО == Главная уборщица 555-333 == Столовая == Шеф-повар 555-444 == Медпункт == Скорая помощь 03 HERE; $out->addWikiText($txt);
И в результате получить вот такую красивую страницу:
На этом нетерпеливые могут убежать писать свои служебные страницы, а терпеливым могу предложить следующие части своих заметок – там будет рассмотрена локализация, которая позволит заходить на страницу по адресу http://моявики/Служебная:Телефоны. Что, согласитесь, гораздо приятнее и читабельнее. Так же там я расскажу, как через адрес передавать своей служебной странице параметры, чтобы управлять ею.