Manual:特別ページ

This page is a translated version of the page Manual:Special pages and the translation is 97% complete.
MediaWiki extensions

特別ページは、特定の機能を求められたときにソフトウェアが作成したページです。

例えば特定の外部サイトにひとつ以上リンクがあるページをすべて抽出させることも、利用者が提供したフィードバックをまとめたフォームの作成もできます。

特別ページは固有の名前空間 (特別:) に置かれ、他のページと違って直接、編集することはできません。 開発者 が特別ページを開設することも可能です。

利用者はこれらのページにアクセスでき、すべての特別ページをまとめた一覧は通常は Special:SpecialPages にあります。 特別ページの中には、特別な利用者権限やアクセス権がないと利用できないものがあります。 あるいは特別ページの一覧には表示されず、ウィキで内部的に使用されるだけのものもあります。

全般的な情報

MediaWiki に付属する特別ページはすべて SpecialSomename.php という形式のファイル名であり、includes/specials ディレクトリに配置されます。 コアの特別ページは、MediaWiki に読み込ませるために、includes/specialpage/SpecialPageFactory.php にあるコア リストに登録する必要があります。 通常、サードパーティ製の特別ページは個別ファイルの属するextensionsディレクトリか、もしくはさらに大きな拡張機能の一部として置かれます。 どの特別ページも includes/specialpage/SpecialPage.php で定義されているクラス SpecialPage を継承します。 新しい特別ページを作成する際には、その特別ページにアクセスするのに必要な利用者権限を定義する必要があります。 利用者権限の定義により、特に特別ページに表示するか、その他のページの下位に置くことを許可するか定義します。

また特別ページ固有の名称は、ウィキごとに変更できます。 一般形式の「特別:ページ名」の「特別」も「ページ名」も、どちらもカスタマイズできます。 「特別」の仮の namespace は他言語に翻訳可能です。 翻訳した名前空間の名称はこのウィキに「Special」として、ウィキテキストで{{ns:special}}に記述してください。 特別ページの属名を ID にすると、名称はシステム・メッセージでもサイトの使用言語で定義し直せます。

特別ページにより、入力を許可するものとしないものがあります。 一例としてページの書き出しの場合、ユーザーはSpecial:Export/Sunにより特定のページを定義できます。 複雑な指定を許可する特別ページの場合は、他のパラメーターをURLのクエリ文字列に送って処理します。例:https://www.mediawiki.org/w/index.php?title=Special:Recentchanges&days=3&limit=250. (「最近の更新」のオプションで 最近 3 日間の更新を最大 250 件表示)

  • 特別ページの作成方法は何種類もありますが、公式の extensions の大部分が採用する下記の方法に従うよう推奨します。 また新設した特別ページの 'specialpage' には必ず著作権ブロックを含めるようお願いします。詳細は $wgExtensionCredits を参照してください。
  • 他の人が作成した特別ページに気づくように、カテゴリ:特別ページの拡張機能 に追加するのをお忘れなく。
  • 特別ページは、$wgOut->allowClickjacking(); を適用しない限り、フレーム化できません。

特別ページの基本のテンプレート

一般に、特別ページの拡張機能の要件は、以下の 3 つのファイルです:

  • MediaWiki の開始時に毎回読み込む、小さな設定ファイル
  • コードの集まりであるファイル
  • 地域化ファイル

MediaWiki のコーディング規約の定義

  • MyExtension/extension.json - 設定ファイル
  • MyExtension/includes/Special.php - 特別ページのコード
  • i18n/*.json - localisation file ファイル。

これらのファイルを一括して MediaWiki の extensions/ に作った新しいディレクトリに保存します。

特別ページ ファイルの名前には、拡張機能の名称を対応させる必要があります。Extension:Gadgets の例だと SpecialGadgets.php が対応しています。 もし作成した拡張機能が複数の特別ページを採用するなら、名前も複数、必要です。

下記のサンプルは特別ページがMyExtensionという名前です。

リストのファイルを作成したら拡張機能を有効にするため、次の定義文を LocalSettings.php に書き加えます:

wfLoadExtension( 'MyExtension' );

設定ファイル

MyExtension/extension.json の設定ファイルの例:

{
	"name": "MyExtension",
	"version": "0.0.0",
	"author": [
		"Your Name"
	],
	"url": "https://www.mediawiki.org/wiki/Extension:MyExtension",
	"descriptionmsg": "myextension-desc",
	"license-name": "MIT",
	"type": "other",
	"AutoloadNamespaces": {
		"MediaWiki\\Extension\\MyExtension\\": "src/"
	},
	"SpecialPages": {
		"MyExtension": "MediaWiki\\Extension\\MyExtension\\Special"
	},
	"MessagesDirs": {
		"MyExtension": [
			"i18n"
		]
	},
	"manifest_version": 2,
	"requires": {
		"MediaWiki": ">= 1.40.0",
		"platform": {
			"php": ">= 5.6"
		},
		"extensions": {
			"dependendExtension": "*"
		}
	}
}

このファイルで登録する項目には重要なものも任意のものもあります。

  • MediaWiki\Extension\MyExtension\Special クラスの場所
  • 地域化ファイルの保存先
  • 新設した特別ページ名とクラス名
If you get the error InvalidArgumentException: Provided specification is not an array, it generally means that MediaWiki could not find the class specified in extension.json that implements your special page.

特別ページのファイル

ファイル本体 (MyExtension/src/Special.php) には必ず SpecialPage あるいはそれ自体のサブクラスを最低1件、含むこと。 このファイルはその特別ページを誰かが呼び出すたびに自動で読み込まれます。 次の例ではサブクラス SpecialMyExtension を実行します。

最初のパラメーターで特別ページを名付けるため、__construct() コンストラクタは必須。

execute() は特別ページにアクセスがあったときに呼び出される main 関数。 この関数は、関数 SpecialPage::execute() をオーバーライドします。 現在のタイトルの下位ページのコンポーネントである、単体のパラメーター$parを渡します。 例えば誰かがSpecial:MyExtension/blahのリンクをたどると、$parに「blah」が入ります。

ウィキテキストと HTML は $wgOut を介して走らせます。直接、ウィキの UI を操作する間、'print' 文も 'echo' 文も使用しないでください。

ただし特別ページを、カスタムの XML またはバイナリ出力を得るためのアクセスポイントとして使用する場合は、特別ページで出力を引き継ぐ を参照してください。

<?php
namespace MediaWiki\Extension\MyExtension;
class SpecialMyExtension extends \SpecialPage {
	function __construct() {
		parent::__construct( 'MyExtension' );
	}

	function execute( $par ) {
		$request = $this->getRequest();
		$output = $this->getOutput();
		$this->setHeaders();

		# リクエストデータの取得先は例えば
		$param = $request->getText( 'param' );

		# 実行する内容
		# ...
		$wikitext = 'Hello world!';
		$output->addWikiTextAsInterface( $wikitext );
	}
}

地域化ファイル

翻訳方法はHelp:システムメッセージ を参照してください。

特別ページはすべて、'My Extension'のようにタイトルを定義します。

  • タイトルは拡張機能のページで‎<title>‎<h1>の要素として、また特別ページでも使われます。
  • 特別ページと拡張機能の説明になっていれば、どんなタイトルでもかまいません。
  • タイトルを定義するのはメッセージで、その構成はキーと値のペアで構成されます。キーも'myextension'も、英文の小文字の必要があります

MyExtension/i18n/en.jsonに置く地域化ファイルの一例。

{
	"@metadata": {
		"authors": [
			"<your username>"
		]
	},
	"myextension": "My Extension",
	"myextension-desc": "Adds the MyExtension functionality.",
	"myextension-summary": "On this special page, do this simple thing and earn wonders.",
	"group-myextensionrole": "Role of myextension",
	"group-myextensionrole-member": "Member of role of myextension",
	"grouppage-myextensionrole": "{{ns:project}}:Role of myextension",
	"action-myextension": "XYZ doing.",
	"right-myextension": "to do xyz"
}

i18n/qqq.json にあるメッセージの説明文書

{
	"@metadata": {
		"authors": [
			"<your username>"
		]
	},
	"myextension": "The name of the extension's entry in Special:SpecialPages",
	"myextension-desc": "{{desc}}",
	"myextension-summary": "Description appearing on top of Special:MyExtension.",
	"action-myextension": "{{doc-action|myextension}}",
	"right-myextension": "{{doc-right|myextension}}"
}

ID は頭文字(最初の1文字)から小文字のみで表記していること、ID の文字列をコードで記すには、スペース(空白)に代わってアンダーバー(_)を使うこと。

-summary メッセージは必須ではありません。 親クラスが自動で生成すると特別ページの最上部に表示し、通常はユーザーの手続きを明示的に解説します。 その内容を定義しなければ、ウィキ管理者がそのウィキでカスタマイズするまで実行されません。

別名ファイル

特別ページの別名を作成することで、その特別ページ名を国際化する方法もあります。下記の例で使用するファイルは「MyExtension.i18n.alias.php」です。 特別ページMyExtension別名を登録することで、ドイツ語版では.../Special:My Extension.../Spezial:Meine_Erweiterungからアクセス可能にしました。

extension.jsonに別名を付ける。

...
	"ExtensionMessagesFiles": {
		"MyExtensionAlias": "MyExtension.i18n.alias.php"
	},
...

特別ページMyExtension.i18n.alias.phpに別名をつける。

<?php
/**
 * Aliases for myextension
 *
 * @file
 * @ingroup Extensions
 */

$specialPageAliases = [];

/** English
 * @author <あなたの利用者名を入力>
 */
$specialPageAliases['en'] = [
	'MyExtension' => [ 'MyExtension', 'My Extension' ],
];

/** Deutsch
 * @author <あなたの利用者名を入力>
 */
$specialPageAliases['de'] = [
	'MyExtension' => [ 'MeineErweiterung', 'Meine Erweiterung' ],
];

ここでも ID 中にスペース(空白)を用いる場合は、アンダーバー(_)を代入します。

ページのヘッダーとリンクの処理は、通常のページと同じ規則に従います。

$wgCapitalLinks が正の場合、小文字を大文字変換し、アンダーバーはスペース (空白) として表示します。

例えば拡張機能を例外なくすべてmy_extensionで定義したと仮定し、上記を'my_extension' => 'My extension'で表現することも可能です。

その場合、英語の連想配列においてSpecialPageを識別する文字列(この例ではMyExtension)は同時に有効なタイトルでもあることに注意します。

あるいはまた、$specialPageAliases['en']['MyExtension']の最初の要素はキーと同一('MyExtension')の必要があります ! さもないと特別ページはページを一覧に出力しません。

特別ページ群

サブクラスで SpecialPage::getGroupName() をオーバーライドすると、その特別ページをSpecial:SpecialPagesでどの群の下位に表示するか指定できます。

    /**
     * 特別ページを Special:SpecialPages で表示する場所を指定するには、親ページをオーバーライドしてください。
     * 既定値は 'other' です。既定値のままでよければ、オーバーライドは不要です。
     * 'media'を指定するとシステム・インターフェース<code>specialpages-group-media</code> を適用します。英語では'Media reports and uploads' (メディアのレポートと読み込み)と訳出します。
     * 
     * @return string
     */
    function getGroupName() {
        return 'media';
    }

よく使われる値は「'login'」「'maintenance'」「'media'」「'other'」「'pagetools'」「'redirects'」「'users'」です。 承認された設定値はSpecial:AllMessages (specialpages-groupを検索) もしくはSpecial:SpecialPages?uselang=qqxを開き仮の言語「qqx」を使ってウィキをブラウジング) を開いて、見出しを検索すると確認できます。 インターフェースのメッセージ「'specialpages-group-media'」を使用するには、「'media'」という用語を設定します。

ご利用の特別ページでpreconfigured見出しのどのパターンにも当てはまらない場合は、新しい見出しを地域化ファイルに追加して使用できます。詳細は地域化ファイルを参照してください。)

地域化ファイルには、MediaWikiと同梱の標準ページグループの一覧があります。例えば英語のメッセージの一覧はlanguages/i18n/en.json) に収納してあり、冒頭はspecialpages-group-で始まります。 自分の特別ページをusers配下に分類するには、メッセージはspecialpages-group-usersとなります。 このキーの値は例えば Users and rights のように、そのカテゴリ名として表示される文字列となります。

もし自分の特別ページが既存のカテゴリのどれにも当てはまらないと思える場合は、いつでも新規に作成できます。 拡張機能の地域化ファイルを開き、messages配列に対応する新しいキーを挿入するだけで処理できます。 この例ではgamificationグループを以下のとおり定義しています。

{
    "myextension": "My Extension",
	"myextension-desc": "Adds the MyExtension functionality.",
	"myextension-summary": "On this special page, do this simple thing and earn wonders",
	"specialpages-group-gamification": "Gamification"
}

こうして自分のクラス定義でメソッド SpecialPage::getGroupName() の返り値を gamification にしたと仮定し、Special:SpecialPagesをリロードして新しいカテゴリを確認します。

その他の重要なファイル

SpecialPage.php

コンストラクター

コンストラクターは多重定義して利用者自身のデータを初期化することができますが、多重定義をする主な理由はSpecialPageクラス自体の挙動を変更するためです。 子クラスから基本クラスのコンストラクターを呼び出すときは、以下の引数を利用できます。

function __construct( $name = '', $restriction = '', $listed = true );
  • string $name リンクやURLで表示される特別ページの名称
  • string $restriction 「"block"」や「"delete"」など利用者権限が必要です。制限つきページのアクセスも参照してください。
  • boolean $listed 当該ページが特別ページ:特別ページに掲載されているかどうか

SpecialPage->setHeaders()

これにより OutputPage のオブジェクト $wgOut をファイル名と特別ページの説明で初期化します。 常にexecute()メソッドから呼び出します。

SpecialPage->getOutput()

このメソッドが返すOutputPageオブジェクトは、以下の方法でアクセスができます。 サンプルコードのとおり、以下を使用

$output = $this->getOutput();
$output->addWikiTextAsInterface( 'Hello, World' );

上記は廃止予定の $wgOut グローバル変数の代用です。

SpecialPage->getRequest()

このメソッドが返すWebRequestオブジェクトは、以下の方法でアクセスできます。 サンプルコードのとおり、以下を使用

$request = $this->getRequest();
$myparam = $request->getText( 'myparam' );

廃止予定の $wgRequest グローバル変数の代替

SpecialPage->including()

特別ページによっては、他のページ内から取り込むことができます。 例えば、ページに {{Special:RecentChanges}} を追加すると、ページの既存のコンテンツ内に最近の変更のリストが挿入されます。

別のWebページから特別なページを含めることができるのは、そのページをコンストラクターに含めることができると宣言した場合のみです。 これを行うには、親クラスの初期化後に __construct() メソッドに以下を追加します。

$this->mIncludable = true;

IncludableSpecialPage クラスを拡張するものとして特別ページクラスを定義することもできます。

SpecialPage->including() 関数は、特別なページが呼び出されているコンテキストを示す真偽値を返します。別のWebページの場合はfalse、別のWebページ内からインクルードされている場合は true です。 通常、ページが含まれている場合は、プレゼンテーションをいくらか削除する必要があります。

SpecialPage->execute()

これは子クラスがオーバーロードするべき関数です。 これは、通常は暗号的に $par と呼ばれる単一のパラメーターを渡します(ユーザーが特別なページにフィードできるパラメーターであるため、$parameter の略です)。 このパラメーターは、現在のページ名の下位ページ コンポーネントです。 たとえば、誰かが Special:MyExtension/blah へのリンクをたどると、$par には「blah」が含まれます。

ヘルプ ページ
MediaWiki バージョン:
1.25

MediaWiki.orgに ヘルプページ を追加すると便利です。ここで 翻訳可能 になります。 利用者がヘルプページを確実に見つけられるようにするには、特別なページで問題のヘルプページをリンクすることをお勧めします。

$this->addHelpLink( 'Help:Extension:MyExtension' );

OutputPage.php

OutputPage.php には、タイプ OutputPage のオブジェクトのクラス定義が含まれています。 このクラスのオブジェクトは、特別ページ から次を使用して取得できます。

$output = $this->getOutput();

もちろん、変数名 $output は任意です。 何と呼んでも、これはブラウザに出力を送信する方法であるため、最も使用する変数です。(いいえ、echo または print は使用しません。) どこかで使用したい場合、グローバル変数を宣言します。

function randomFunction() {
        $output = $this->getOutput();
	$output->addHTML( '<b>This is not a pipe...</b>' );
}

必要に応じて、特別ページ 拡張機能のさまざまなメソッドで複数の OutputPage オブジェクトを作成できます。 それらは、実行された順序で出力に追加されます。

includes/OutputPage.php を表示することで OutputPage クラスを検査できます(実際、これらはすべて検査できます。)が、必ず知っておくべきメソッドがいくつかあります。

OutputPage->addHTML()

基本的に、echo の迅速で汚い代替品です。 それはあなたの入力を受け取り、それをバッファに追加します:質問はありません。 以下の操作では、$action に利用者データが含まれている場合、XSS、邪悪なもの、またはサタンの spawn が簡単に挿入される可能性があります。 信頼できる出力を構築するには、エスケープ(php関数htmlentitiesなど)またはXMLビルダークラスを使用することをお勧めします。

$output->addHTML( '<form action="'.$action.'" method="post">' );

OutputPage->addWikiText()

ほとんどの出力では、この関数を使用する必要があります。 これは少し黒魔術の機能です。ウィキテキストが入り、HTMLが出て、その間にたくさんの難解なコードと悪魔の召喚が行われます。

$output->addWikiText("This is some ''lovely'' [[wikitext]] that will '''get''' parsed nicely.");

注目に値するのは、パーサーがチャンクをまとまりのある全体として表示し、それに応じて段落を表示することです。あれは...

$output->addWikiText( '* Item 1' );
$output->addWikiText( '* Item 2' );
$output->addWikiText( '* Item 3' );

おそらく意図されていなかった、それぞれ1つのアイテムを含む3つのリストを出力します。

  警告: もしご利用の特別ページを他のページに読みこむつもりなら、おそらくはaddWikiText()の使用を避けたほうがよいでしょう (あるいは他のパーサーを呼び出す関数も使用外に該当。関数 ($this->msg()) を解析するメッセージ関連関数は最近のバージョンのMediaWikiに影響しないため除外されます。) あるページに別のページが含まれている場合、MediaWikiのバグが原因で (phab:T18129) そのページ上に後から特定の特別ページを内包したため、既存ページすべてに悪影響を与えてしまい、UNIQ10842e596cbb71daのような文字列が表示されます。

しかしながら注意点として、システムメッセージの挿入と、解析したウィキ適すとの用に処理したいだけの場合、$this->getOutput()->addHtml( $this->msg( 'key-of-message' )->parse() )のようなコードを使用してください。 これは、上記で取上げた入れ子のパーサコールでは問題となりません。

回避手段 #1

Important: these work arounds are only needed if you are making a transcludable special page. Normal special pages do not need these.

回避策として、別のパーサーオブジェクトを使用して拡張機能でウィキテキストをHTMLに変換してから、addHTML(). を使用することができます。 例:

$wgOut->addHTML( $this->sandboxParse( "Here's some '''formatted''' text." ) );
# これが他の特別なページコードと同じクラス内にあると仮定します。
function sandboxParse( $wikiText ) {
	$myParser = new Parser();
        $user = $this->getUser();
        $title = self::getTitleFor('YourCanonicalSpecialPageName');
	$myParserOptions = ParserOptions::newFromUser( $user );
	$result = $myParser->parse( $wikiText, $title, $myParserOptions );
	return $result->getText();
}

回避手段 #2

上記を試してみたところ、参照読み込みされたテキスト内のすべてのタグに同じ問題が適用されることがわかりました。 これは多くの拡張機能では問題になりませんが、私が書いていた拡張機能は、機能の一部として別のページのウィキテキストを表示することを目的としていたため、これは問題でした。

特別なページを変換するページを解析するプロセスは次のように思われます。

  1. {{Special:MyExtension}} をUNIQ-QINUマーカーに置き換えます(SpecialPageの出力はすぐに出力できるHTMLであることが期待されるため)
  2. 上記のように、タグをQINUマーカーに置き換えます
  3. ウィキテキストからHTMLまで他のすべてを解析します。
  4. 1回のパスで、すべてのQINUマーカーをそれぞれの保存された値に置き換えます。

ただし、「非」特殊ページを変換するページを解析するプロセスは、明らかに次のようになります。

  1. {{:Normal Article Name}} または {{Template Name}} を参照読み込みされたページのコンテンツに置き換えます(参照読み込みされたページには解析されていないウィキテキストが含まれているため)
  2. 上記のように、タグをQINUマーカーに置き換えます
  3. ウィキテキストからHTMLまで他のすべてを解析します。
  4. 1回のパスで、すべてのQINUマーカーをそれぞれの保存された値に置き換えます。

問題は、前のケースでは、SpecialPageのwikiテキストの解析に最後のQINUデコードステップがないため(なぜ?)、すべてのQINUマーカーがデコードされないままになっていることです。 (これは、ホストページのウィキテキストコンテンツに直接貼り付けられて解析されるウィキテキストページのトランスクルージョンを呼び出すために同じ構文を使用することによる残り物である可能性があります。これは、まったく解析してはならないSpecialPageのトランスクルージョンを呼び出すために使用されます。「待機、これは特別ページです。QINUに置き換えてください」と決定するコードがある場合は常に、QINU置換を行う前に、追加のunstripGeneralを実行する必要があります。)


だから私はちょうど次のことをしました-この行の後に:

$htOut = $wgParser->recursiveTagParse( $iText );

...私はこれらの行を追加しました(2番目の行は最初の行の関数定義がそれを推奨しているためだけです):

$htOut = $wgParser->mStripState->unstripGeneral( $htOut );
$htOut = $wgParser->mStripState->unstripNoWiki( $htOut );

もちろん、これを文書化したので、悲劇的な欠陥を見つけて、本当に愚かだと感じます...しかし、それが機能しているように見える限り、ここでそれを書き留めなければなりませんでした。 (回避策#1の問題に注意することも重要です。) また、私はこれを MediaWiki 1.10.1 でのみテストしました。 問題は MediaWiki 1.14 でもまだ存在しますが、この解決策は機能する場合と機能しない場合があります。 --Woozle 18:26, 9 April 2009 (UTC)

OutputPage->showErrorPage()

エラーページが表示されます。 引数 $title$msg は、テキストではなく $this->msg() へのキーを指定します。 例:

$output->showErrorPage( 'error', 'badarticleerror' );
  • 「error」は、テキスト「エラー」を指します。
  • 「badarticleerror」は、テキスト「このページでは要求された操作を行えません。」を指します。

メッセージオブジェクトを指定したり、パラメータを追加したりすることもできます。

$output->showErrorPage( 'error', 'badarticleerror', [ 'param1', 'param2' ] );
$messageObject = new Message(...);
...
$output->showErrorPage( 'error', $messageObject );
$titleMessageObject = new Message(...);
$messageObject = new Message(...);
...
$output->showErrorPage( $titleMessageObject, $messageObject );

WebRequest.php

WebRequest クラスは、GET配列とPOST配列から情報を取得するために使用されます。 スーパーグローバルに直接アクセスするよりも、これを使用することをお勧めします。 WebRequestオブジェクトには、RequestContext を使用して拡張機能からアクセスできます。

Database.php

MediaWikiには、\Wikimedia\Rdbms\Database クラスを使用してデータベースと対話するための便利な関数とラッパーがたくさんあります。 また、興味深い負荷分散スキームも用意されています。 これらのラッパーを使用することをお勧めします。 すべての便利な機能の完全なリストについては、Database.php をチェックしてください。これらのドキュメントでは、明らかでない警告についてのみ説明しているためです。 Manual:データベース アクセス を参照してください。

User.php

User クラスは、システム上のユーザーを表すために使用されます。 SpecialPage->getUser() は、現在ログインしている利用者の User オブジェクトを取得するために使用する必要があります。 グローバル $wgUser の使用は非推奨です

Title.php

タイトルは、Wiki内のページの名前を表します。 MediaWikiはページ名に対してあらゆる種類の楽しいエスケープと特殊なケースロジックを実行するため、これは便利です。したがって、独自のタイトルをURLに変換する関数をロールする代わりに、ページ名を使用してTitleオブジェクトを作成し、getLocalURL() を使用してURLを取得します。そのページに。

特別ページクラスの外部から特別ページのタイトルオブジェクトを取得するには、SpecialPage::getTitleFor( 'YourCanonicalSpecialPageName' ) を使用できます。 それはあなたにWikiの言語でローカライズされたタイトルを与えます。

カスタム特別ページ

MediaWikiにバンドルされていない独自の特別なページを提供するさまざまな方法があります。

  • 1つの方法は、記事を作成または編集するためのフォームを生成する拡張機能をインストールすることです。現在利用可能な拡張機能のリストは、カテゴリ:特別ページの拡張機能 にあります。
  • 独自の特別なページを提供する拡張機能を作成することもできます。独自の拡張機能を作成するには、PHP コーディングのスキルと、オブジェクト指向の設計とデータベースに関する快適さが必要です。また、コードを使用して MediaWiki 記事を作成および編集する方法を知る必要があります。詳細については、この議論 を参照してください。
  • 既定のエラー メッセージ「不明な特別ページ」(または特別:白紙ページ の下位ページを使用している場合は、「このページは意図的に空白になっています。」)の代わりに、JavaScriptを使用してカスタム ページを表示することもできます。 MediaWiki:Common.jsで、wgPageName を確認してから、MediaWikiで生成されたコンテンツを非表示にし(appendCSS {visibility:hidden;} のみ)、カスタムHTML(innerHTML)を document.getElementById('bodyContent') または document.getElementById('mw_contentholder') に挿入します。 例については、meta:User:Krinkle/Tools/Real-Time Recent Changes を参照してください。

よくある質問

拡張機能の名称を設定する

拡張機能の題名を設定するのはMediaWikiではなく、開発者のしごとです。 Special:Specialpages が呼びされたとき、または特別ページが読み込まれたときに、拡張機能の名前を探します。 function execute( $par ) 節では、拡張機能に題名を与えるため OutputPage メソッドを以下のように使用します: $this->getOutput()->setPageTitle("your title");

拡張機能を探せる場所 (特別ページのコンストラクターに渡すものとして定義) とは、キーであり--ただしgetDescription()の影響で大文字表記しない点が異なります。当初使われ特別ページの題名を探す関数 (もしくはdescriptionとよばれるもの) 、strtolowerの名称です。 例えば"ThisIsACoolSpecialPage"のキーは"thisisacoolspecialpage"となります。

理論上、メッセージキャッシュに影響を与えないためgetDescriptionをオーバーロードしても、ソースコードに記述してあるとおり、以下の結果となります。「"これを派生クラスでオーバーライドできるものの、通常は既定の動作を維持する方が簡単です。 さらに、MediaWiki名前空間がメッセージをオーバーロードしようとしても、これは以下のように予防します。

拡張機能の名称を地域化する

さて、ぴかぴかのMediaWiki拡張機能をインストールした直後だとします。そのとき気づきました。「自分のウィキはフランス語版なのに、ページは英語で表示されてしまった、困った。」 ほとんどの人は見過ごしますが、実は簡単なタスクで修正できます (ただし、開発者がこのページで解説した方法を使った場合に限る。) ソースコードをめぐる処理はありません。 仮にページ名をDirtyPagesとすると、その名前は「List of Dirty Pages」の一覧に (訳注:英語版として) 表示されるものの、(訳注:フランス語版で使うという仮定なので・excuse my poor Frenchつまり読者にはフランス語はわからないだろうけれど) 「Liste de Pages Sales」に表示したいとします。 すると処理は、以下のように実に簡単です。

  1. MediaWiki:DirtyPagesを探して開きたいのですが、ページが存在しなくても、編集します。
  2. "Liste de Pages Sales"を追加して保存

するとヴアラ (voilàってダジャレですが) 変更が適用されました。

この方法だと、利用者のウィキの題名を使用言語にカスタマイズするためにも便利に使えます。例として、開発者が名づけた「汚れたページ一覧」という名称が気に入らないなら、(訳注:この方法で)「クリーンアップが必要なページ一覧」と改名します。 詳細については、Special:Allmessagesを参照してください。

また、例えば警告文など自分の拡張機能に変化させる文章がまとまった量ある場合は、直接、文を出力しません。. 代わりに、メッセージキャッシュに変化する部分の文章を取り込み、ご利用の言語コードで出力する段階が来たら、次の処理をします。

$wgOut->addWikiText( $this->msg( 'dirtypageshelp' ) );

さらにこのメッセージ自体もMediaWiki:Dirtypageshelpでカスタム化することができます。

Help:システムメッセージ も参照してください。

ページのアクセスを制限する

Special:SpecialPagesに自分の特別ページを表示しない

特別ページの表示を制限したい場合、特別ページをSpecial:SpecialPagesから除去して特定の権限を持つ利用者限定で表示する処理をしようと考えるかもしれません。 これをコンストラクターで実行するには、$restrictionパラメータに渡します。例えば、既定では管理者限定で割り当てられる「editinterface」という権限が対象です。利用できるその他の利用者権限については、利用者権限のマニュアル利用者権限のマニュアルを参照してください。

function __construct() {
	parent::__construct( 'MyExtension', 'editinterface' ); // システム管理者に限定
}

または、セットアップ ファイルに独自の権限を作成して、それをシステム管理者に、次の例のように割り当てます。

"AvailableRights": [
	"myextension-right"
],
"GroupPermissions": {
	"sysop": {
		"myextension-right": true
	}
}

次に、右でコンストラクターを呼び出します。

function __construct() {
	parent::__construct( 'MyExtension', 'myextension-right' );
}

Prevent 自分の特別ページへのアクセスを防止する

コンストラクター上で上記の手順に従い自分のページに制限をかけても、例えばSpecial:MySpecialPageを開くと、依然としてURL経由で直接、見ることができます。 自分の特別ページへのアクセスを制限するには、executeメソッドで$this->checkPermissions()を呼び出す必要があります。

権限に関してもっと細かいコントロールが必要な場合は、$this->checkPermissions()をオーバーライド、そして/もしくは拡張機能に必要な権限チェック機能をなんでも追加します。

Special:UserLogin ならびにSpecial:UserLogout ページの無効化

LocalSettings.phpではSpecialPage_initList hook を使って不要なビルトインの特別ページを解除 することが可能です。 "複数のSpecialPagesに制限をかける"を参照して、例えば特定の利用者グループについて条件付きの特別ページ解除の実施も参照してください。 一般的なメッセージ「無効な特別ページを要求しました。」が表示されるのは、利用者が解除された特別ページにアクセスしようとした場合です。

$wgHooks['SpecialPage_initList'][] = function ( &$list ) {
	unset( $list['Userlogout'] );
	unset( $list['Userlogin'] );
	return true;
};

別のアプローチは、DisabledSpecialPage コールバックを使用することです。 この場合のデフォルトのメッセージは、ページがまったく存在しないふりをする代わりに「このページはシステム管理者により無効化されています。」と表示されるため、特別なページを「一時的に」無効にするだけの場合は、このアプローチが推奨されます。 これにより、ページが後でアクティブ化される可能性があることが明確に示されます。

$wgSpecialPages['Userlogout'] = DisabledSpecialPage::getCallback( 'Userlogout' );
$wgSpecialPages['Userlogin'] = DisabledSpecialPage::getCallback( 'Userlogin' );

コールバックの2番目の引数としてメッセージキーを指定することにより、特別なページを無効にする理由のカスタムの長い説明を追加することもできます。 これを行うには、最初にシステムメッセージ「MediaWiki:Userlogout-disable-reason」を作成し、そこにすべての説明を書き込みます。 メッセージはブロック形式で解析されます。 次に、LocalSettings.php に次を追加します。

$wgSpecialPages['Userlogout'] = DisabledSpecialPage::getCallback( 'Userlogout', 'Userlogout-disable-reason' );

記録の追加

MediaWiki では透明性と共同作業のために、ユーザーの行動をすべて記録します。 その方法は Manual:Special:Log 用に記録を登録する で解説してあります。

特別ページのグループを変更する

拡張機能の開発者の皆さんは、このページの特別ページのグループの節の説明に従い、getGroupName() メソッドを実行してください。

MediaWiki 1.21 以降、特別ページのグループはシステムメッセージを編集すると、オーバーライド可能になりました。 ただしサイト管理者が実行する方法であり、拡張機能の開発者向けではありません。 グループ名はspecialpages-specialpagegroup-<special page name>メッセージに配し、特別ページの英語版の正規名称<special page name>は小文字で表記します。 例えばグループ「MyLittleGroup」を作り特別ページで下位ページとして「Special:MyLittlePage」を示したいなら、「MediaWiki:Specialpages-specialpagegroup-mylittlepage」を作成しコンテンツページを「MyLittleGroup」と指定するだけです。 すると「Special:MyLittlePage」は「MyLittleGroup」の下位ページになります。後者の命名は「MediaWiki:Specialpages-group-mylittlegroup」で行います。
既存の特別ページのグループを変更するには、Special:SpecialPages&uselang=qqx を参照して前述の「mylittlepage」の部分を書き換えます。

Unlisting the page from Special:Specialpages

To remove a special page from the Special:Specialpages altogether, pass a false as a third parameter to the SpecialPage parent constructor, as described in the SpecialPage Constructor section of this page. If you need more complicated logic to determine whether the page should be listed or not, you can also override the isListed() function, but using the constructor parameter is simpler.

Getting a list of special pages and their aliases on a wiki

Simply use the "siteinfo" API module to retrieve the information from the wiki like e.g. /api.php?action=query&meta=siteinfo&siprop=specialpagealiases.

関連項目

  • HTMLForm – チェックボックスやテキストエリア、ラジオボタン他を、特別ページに作る方法