Manual:特別ページ
![MediaWiki extensions](http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/MediaWiki-extensions-icon.svg/125px-MediaWiki-extensions-icon.svg.png)
特別ページは、特定の機能を求められたときにソフトウェアが作成したページです。
例えば特定の外部サイトにひとつ以上リンクがあるページをすべて抽出させることも、利用者が提供したフィードバックをまとめたフォームの作成もできます。
特別ページは固有の名前空間 (特別:) に置かれ、他のページと違って直接、編集することはできません。 開発者 が特別ページを開設することも可能です。
利用者はこれらのページにアクセスでき、すべての特別ページをまとめた一覧は通常は 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();
を適用しない限り、フレーム化できません。
特別ページの基本のテンプレート
MediaWiki 1.25 で拡張機能を読み込む新しい方法を採用しました。サポートしていない旧版の MediaWiki については過去の改訂版を参照してください。 |
一般に、特別ページの拡張機能の要件は、以下の 3 つのファイルです:
- MediaWiki の開始時に毎回読み込む、小さな設定ファイル
- コードの集まりであるファイル
- 地域化ファイル
MediaWiki のコーディング規約の定義
MyExtension/extension.json
– 設定ファイルMyExtension/includes/Special.php
– 特別ページのコードi18n/*.json
– The 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.41.0",
"platform": {
"php": ">= 5.6"
},
"extensions": {
"dependendExtension": "*"
}
}
}
このファイルで登録する項目には重要なものも任意のものもあります。
- MediaWiki\Extension\MyExtension\Special クラスの場所
- 地域化ファイルの保存先
- 新設した特別ページ名とクラス名
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 {
public function __construct() {
parent::__construct( 'MyExtension' );
}
public 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
当該ページが Special:Specialpages に掲載されているかどうか
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つのリストを出力します。
しかしながら注意点として、システムメッセージの挿入と、解析したウィキ適すとの用に処理したいだけの場合、$this->getOutput()->addHtml( $this->msg( 'key-of-message' )->parse() )
のようなコードを使用してください。
これは、上記で取上げた入れ子のパーサコールでは問題となりません。
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」に表示したいとします。
すると処理は、以下のように実に簡単です。
- MediaWiki:DirtyPagesを探して開きたいのですが、ページが存在しなくても、編集します。
- "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 pages の無効化
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>
は小文字で表記します。
例えば、Special:Specialpages で Special:MyLittlePage
を MyLittleGroup
のグループに表示したい場合は、MediaWiki:Specialpages-specialpagegroup-mylittlepage
を作成し、内容を MyLittleGroup
にするだけです。
すると Special:MyLittlePage
は MyLittleGroup
のグループに表示されます。このグループの名前は MediaWiki:Specialpages-group-mylittlegroup
で設定できます。
既存の特別ページのグループを変更するには、Special:SpecialPages&uselang=qqx を参照して前述の「mylittlepage」の部分を書き換えます。
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.
ウィキ上の特別ページとそのエイリアスの一覧を取得する
"siteinfo" APIモジュールを使用して、ウィキから情報を取得します。例: /api.php?action=query&meta=siteinfo&siprop=specialpagealiases
関連項目
- HTMLForm – チェックボックスやテキストエリア、ラジオボタン他を、特別ページに作る方法