Создание своего расширения для MediaWiki. Часть 2 — Служебная страница

Итак, в первой части своих заметок про создание собственного расширения 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 и, если все правильно сделано, видим радостную картинку:

2018-09-20_13-25-21

Свершилось! Наше расширение задышало. Если не заморачиваться с локализацией и оставить вызов страницы таким как есть сейчас, то можно сразу приступать к реализации основного функционала страницы. Для этого достаточно поменять, согласно необходимой логике, содержимое метода 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);

И в результате получить вот такую красивую страницу:

2018-09-20_14-43-54

На этом нетерпеливые могут убежать писать свои служебные страницы, а терпеливым могу предложить следующие части своих заметок – там будет рассмотрена локализация, которая позволит заходить на страницу по адресу http://моявики/Служебная:Телефоны. Что, согласитесь, гораздо приятнее и читабельнее. Так же там я расскажу, как через адрес передавать своей служебной странице параметры, чтобы управлять ею.


<<< Назад, к 1 части Далее, к 3 части >>>

Поделиться с друзьями:
  • Добавить ВКонтакте заметку об этой странице
  • Одноклассники
  • Facebook
  • В закладки Google
  • Мой Мир
  • Twitter
  • LiveJournal
  • Яндекс.Закладки
  • LinkedIn
  • Reddit
  • StumbleUpon
  • БобрДобр
  • Memori.ru
  • МоёМесто.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *