Manual:Special pages/ja

特別ページ(Special page)は特別な機能を実行するソフトウェア上の要求によって作成されます. 例えば、特別ページが一つの外部サイトへのリンクを一つか複数のすべてのページを表示する、もしくはユーザが投稿したフィードバックのためのフィードバックフォームを特別ページが作成することが出来ます. 特別ページは独自の名前空間であるSpecial:(日本語版では特別:)に設置され、他のページと同様に直接編集することは出来ません. 開発者も新しい特別ページを作成することが出来ます. これらのページはユーザがアクセス可能でSpecial:Allpagesですべての特別ページのリストを表示されます. 特別ページの中には制限されて特定のタイプのユーザだけがアクセスできるものがあります. 他の特別ページでは特別ページリスト上にはまったく現れないでwiki内部だけで使用されるものもあります.

全般的な情報
MediaWikiに組み込みの75個以下程度の特別ページは と呼ばれ、 ディレクトリに設定されています. 特別ページはサードパーティの開発者によって作成され ディレクトリもしくはより大きな拡張機能の一部として保存されます. すべての特別ページは で定義されたSpecialPageと呼ばれるクラスから継承します. 新しい特別ページが作成されたとき、定義されたページにアクセスするためにユーザ権限が必要です. 他のことの中で、Special:SpecialPages上でページが表示されるかとそのページが他のページに含まれるのかについてこれらの権限が指定します.

特別ページはカスタマイズされたユニークな名前を持つことが出来ます. 一般的なフォームは"Special:Pagename"で"Special"と"Pagename"の両方ともカスタマイズ可能です. 特別な見せかけの名前空間は異なる言語のために定義できるようにするためにwiki上でシステムメッセージに変更することが出来ます. この再定義された名前空間はwikitextの     で作成することが出来ます. このwiki上では"   "を与えます. 特別ページの名前はサイトの言語のためにIDとして特別ページの一般的な名前によって、システムメッセージで再定義することが出来ます.

特別ページは入力の許可をする、もしくはしないことがあります. 例えば、Special:ExportはSpecial:Export/Sunを呼び出すことでエクスポートする特定のページを定義するユーザトップを許可します. 特別ページが複雑な入力を許可する場合、ページURLのパラメータは次のように変更します. 例えば http://www.mediawiki.org/w/index.php?title=Special:Recentchanges&days=3&limit=250

注記:
 * 特別ページを作成するためには様々な方法がありますが、下記のものは大部分がオフィシャルな拡張機能によって使用されるもので、MediaWikiのSVNに受け入れられるためにはこのスタイルに固有なものが必要です. また、'specialpage'のために新しい特別ページの中にクレジットブロックを含むことを確認して下さい. 詳細については$wgExtensionCreditsをご覧ください.
 * After making a new special page, be sure to add it to Category:Special page extensions so other people can find it.
 * This method is only valid for MediaWiki running on PHP5 and above. If you're using an earlier version of MediaWiki on a more-recent version of PHP, upgrade MediaWiki.
 * Special pages cannot be included within frames unless you use $wgOut->allowClickjacking;

特別ページの基本的なテンプレート
大抵の特別ページは3つのファイルが必要です: MediaWikiが動作を始めるたびに読み込まれる小さなセットアップファイル、国際化ファイル、と大部分がコードであるファイルです. それらのすべてはMediaWikiの内側のextensionsディレクトリ内部の新しいディレクトリに設置されます. MediaWikiのコーディング規約は4つのファイルを以下のように定義します:


 * - セットアップファイル.
 * - 特別ページのコード.
 * - 国際化ファイル.
 * - 特別ページの別名ファイル.

Generally the special page should be named after the extension: so the Gadgets extension has the file  and. Obviously if your extension has more than one special page, you'll need more names.

下記の例において、はMyExtensionです. A working copy is available for download, see further down.

After creating the files listed below, add the following line to LocalSettings.php

セットアップファイル
セットアップファイル (この例では  というファイル名) は次のようになります:

このスタブファイルはいくつかの重要なことを登録しています:


 * SpecialMyExtensionクラスの場所
 * メッセージファイルの場所
 * 別名ファイルの場所
 * 新しい特別ページとクラス名

You may also want to set a value for $wgSpecialPageGroups so that your special page gets put under the right heading in Special:SpecialPages, e.g.:

If your special page doesn't seem to fit into any of the preconfigured headings, you can add a new heading by adding it to your  file (see below, The Messages/Internationalization File).

特別ページファイル
The body file (in this example, named ) should contain a subclass of SpecialPage (or one of its subclasses). It will be loaded automatically when the special page is requested. This example implements the subclass SpecialMyExtension:

You need the  constructor because its first parameter names your special page.

は特別ページがアクセスされたときに呼び出されるメイン関数です. 関数は 関数をオーバーロードします. 一つの パラメータ、現在のタイトルのサブページコンポーネントを渡します. 例えば、誰かがSpecial:MyExtension/blahへのリンクに従う場合、 は"blah"を含みます.

Wikitext and HTML output should normally be run via $wgOut -- do not use 'print' or 'echo' directly when working within the wiki's user interface.

However if you're using your special page as an access point to custom XML or binary output, see Taking over output in your special page.

メッセージ/国際化ファイル

 * ''See Manual:System message for how to get them translated.

All special pages must specify a title to appear in the title and    elements of the extension's page and on Special:SpecialPages. The extension specifies the title through a message. The structure of the message is a key-value pair. The ID, 'myextension', must be in all lowercase when specified in the key portion of the key-value pair, even if everywhere else it is MyExtension. The title, 'My Extension', can be anything, however it is convenient if the page title is the same as the ID. A good example of a message/internationalization file (in this example, named ) would be:

Note that IDs should not start with an uppercase letter, and that a space in the ID should be written in the code as an underscore.

別名ファイル
We can also internationalize the name of the special page by creating aliases for it (here, in a file called "MyExtension.alias.php"). In this example, the special page  registers an alias so the page becomes accessible via .../Special:AnotherName e.g. .../Spezial:Meine_Erweiterung</tt> in German, and so on.

Again, a space in the ID should be written in the code as an underscore. For the page header and linking, the usual rules for page names apply. If  is true, a lowercase letter is converted to uppercase, and an underscore is displayed as a space. For example: instead of the above, we could have used, assuming we consistently identified the extension as my_extension</tt> elsewhere. Note that in the associative array for the English language, the string that identifies our SpecialPage ( in the example,) is also a valid title.

特別ページグループ
As mentioned above, you can set which special page group your special page is categorized under on Special:SpecialPages by setting. The standard page groups that come with MediaWiki are listed in the messages file (for example, the English messages are in ) and begin with. If your special page is to be categorized under, for example,, then the message looked for is. The value for this key is the text that should appear as the name of that category, for example,.

If your special page does not seem to fit under any of the existing categories, you can always make a new one. In your extension's internationalization file simply insert a new key for the  array. In this example, we will define the  group:

Now simply set  and reload Special:SpecialPages to see your new category.

コンストラクター
独自のデータを初期化するためにコンストラクタをオーバーロードできますが、それをする主な理由はSpecialPageクラスの振る舞いを変更することにあります: 子クラスからベースクラスコンストラクタを呼び出す時、次のパラメータが利用可能です:


 * string  リンクとURLで見られる特別ページの名前
 * string  要求されたユーザの権限、例えば"block"もしくは"delete"
 * boolean  Special:Specialpagesでページがリスト表示されるかどうか
 * string  executeによって呼ばれた関数. デフォルトでは$nameからコンストラクトされる
 * string   を使用して他のページが特別ページを含むことができるかどうか

これは特別ページの名前と説明を伴うOutputPageオブジェクトの を初期化します. executeメソッドから呼び出されなければなりません.

これは特別ページが何のコンテキストから呼び出されたのかを示す論理型の値を返します. 個別のウェブページであるならfalse、他のウェブページの範囲内に含まれているのであればtrueです. 通常はページが含まれる場合、プレゼンテーションをいくばくか解体したい時に使用します.

他のウェブページから含むことはコンストラクタに含めることが可能であるページを宣言した場合のみ可能です. 親クラスの初期化の後で メソッドに次のコードを追加することで行うことが出来ます: You can also define your special page class as extending the IncludableSpecialPage class.

The SpecialPage->including function returns a boolean value telling you what context the special page is being called from: false if it is a separate web page, and true if it is being included from within another web page. Usually you will want to strip down the presentation somewhat if the page is being included.

これは子クラスがオーバーロードする関数です. 一つのパラメータを渡し、通常はひそかに として参照されます. このパラメータは現在のタイトルのサブページコンポーネントです. 例えば、誰かがSpecial:MyExtension/blahへの一つのリンクを追跡する場合、 は"blah"を含みます.

OutputPage.php
グローバル変数 はブラウザに出力を送る方法なのでもっと使用する変数です. ( もしくは を使用してはなりません) どこかで使用する場合、グローバル変数を宣言します:

を見ることでOutPutPageオブジェクトを調べるが出来ますが(本当に、それらのすべてを調べることが出来ます)、確実に知っておかなければならないいくつかのメソッドがあります.

基本的に のための速くて汚い代用品です. 入力を取得してバッファに追加します: 問答無用で. 下のアクションにおいて、 はユーザデータを含む場合、XSSや害を為すもの、もしくは注入されたSatanのスポーンを含む可能性があります. エスケープを使用するか、信用のある出力をビルドするXMLビルダークラスを使用した方がいいでしょう.

多くの出力のために、この機能を使用すべきです. これはちょっとしたブラックマジック機能です: wikitextが入力されると、HTMLが出力し、難解なコード全体とデーモン召還の両方が起こります.

価値がないものはパーサが密着した全体と結果的にパラグラフとしてチャンクを見ます. すなわち

Will output three lists with one item each, which probably wasn't intended.

Note however, if you just want to insert a system message and have it treated like parsed wikitext, you can use code like. This will not have the issue with nested parser calls mentioned above.

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

As a workaround, you can have your extensions convert Wikitext to HTML using a separate Parser object and then use. Example:

workaround #2
I tried the above, and found that the same problem now applied to any s in the transcluded text. This won't be a problem for a lot of extensions, but the extension I was writing was intended to show wikitext from another page as part of its functionality, so this was a problem.

The process for parsing a page which transcludes a special page seems to be this:
 * 1) Replace  with a UNIQ-QINU marker (because SpecialPage output is expected to be ready-to-output HTML)
 * 2) Replace any s with QINU markers as above
 * 3) Parse everything else from wikitext to HTML
 * 4) Replace all QINU markers with their respective stored values, in a single pass

The process for parsing a page which transcludes a non-special page, though, is apparently like this:
 * 1) Replace  or  with contents of transcluded page (because transcluded pages contain unparsed wikitext)
 * 2) Replace any s with QINU markers as above
 * 3) Parse everything else from wikitext to HTML
 * 4) Replace all QINU markers with their respective stored values, in a single pass

The problem is apparently that in the earlier case, the parsing of the SpecialPage's wiki text is lacking the final QINU decoding step (why?), so all the QINU markers are left undecoded. (This may be a leftover from using the same syntax to invoke transclusion of a wikitext page, which is just pasted straight into the host page's wikitext contents and parsed, as is used to invoke transclusion of a SpecialPage, which must not be parsed at all. Wherever the code is that decides "wait, this is a special page -- replace it with a QINU", it should be doing the extra unstripGeneral before doing the QINU substitution.)

So I just did the following -- after this line: ...I added these lines (the second one is only because the function definition for the first one recommends it): Since I have now documented this, of course, I will now find a tragic flaw with it and feel really stupid... but as long as it seems to be working, I had to note it here. (It is also important to note the problem with work-around #1.) Also, I have only tested this with MediaWiki 1.10.1. The problem still exists under MW 1.14, but this solution may or may not work. --Woozle 18:26, 9 April 2009 (UTC)

多くの本当の特別ページにおいて、ひょっこり現れる 無しで を見ることはまれです.

is a MediaWiki internationalization (i18n) function.

エラーメッセージが表示されます. 引数の と はテキストではなくキーをwfMsgに指定します. 例です:


 * 'error'はテキストの"Error"を参照します.
 * 'badarticleerror'はテキストの"This action cannot be performed on this page."を参照します.

WebRequest.php
WebRequestクラスはGETとPOST配列から情報を取得するために使用されます. これを使用することは直接スーパーグローバルにアクセスすることよりもはるかにお勧めです. オブジェクトはmagic_quotesのクリーニングのようなものをからかわないからです. WebRequestオブジェクトはコードにグローバルな を含むことによって拡張機能からアクセス可能です.

名でフォームインプットに対応する一つの文字列を返します.

呼び出された関数に応じてini、boolなどを返します. チェックボックスの例では 関数は便利です.

Returns true if a form was posted.

Database.php
MediaWikiはデータベースでインタラクトするためにたくさんの便利な関数とラッパーを持ちます. 適切な場所にロードバランシングスキーマも持ちます. これらのラッパーを使用することをお勧めします. すべての関数リストを見るためには をチェックアウトして下さい、これらのドキュメントだけが明確ではないキャビートのために教えてくれます.

この名前が示すように、この関数はデータベースの参照を取得します. データベースオブジェクトを含むグローバルは存在しません.

この関数を呼び出す時、パラメータ、 もしくは として渡します. 一般的には、リードの実行時にスレーブのデータベースとインタラクトし、書き込みをするときにマスターにインタラクトします. するのは簡単で、一つのデータベースしかなくても行います.

User.php
Userクラスはシステム上のクラスを表示するために使用されます. グローバルな は現在ログインしているユーザを表示し、通常はユーザを操作するときに取り扱うものです.

ユーザが$rightをできるかどうかについてtrueもしくはfalseを返します.

ユーザがブロックされたときにtrueを返します.

Title.php
タイトルはwikiのページ名を表します. MediaWikiはURL関数へ独自の変換タイトルを転がす代わりに、面白いエスケーピングとページ名への特別なケースロジックのすべてのソートをするのでこれは便利です. ページ名でTitleオブジェクトを作成しこのページへのURLを取得するために を使用します.

This method gives you the url to the page. However, in most cases you would want to use the Linker class to make links to pages.

Custom special pages
There are various ways to provide your own special pages not bundled within MediaWiki:
 * One method is to install an extension that generates a form to create or edit an article. A list of extensions currently available, can be found at Category:Special page extensions.
 * You can also write an extension which provides your own special page. Writing your own extension requires PHP coding skill and comfort with object oriented design and databases also is helpful.  You will also need to know how to use code to create and edit MediaWiki articles. For more information, please see this discussion.
 * You can also display a custom page through Javascript, in place of the default error message "Unknown special page". In MediaWiki:Common.js, check for wgPageName, then hide the MediaWiki-generated content (just appendCSS  ), and inject custom HTML  into the   or  . For an example, see w:en:User:Splarka/electrocute.js.

拡張機能のタイトルを設定する
MediaWikiは拡張機能のタイトルを設定しません. これは開発者の仕事です. Special:Specialpagesが呼び出される、もしくは特別ページがロードされたときに拡張機能の名前を探します. (とりわけ登録されたwfSpecial*</tt>が呼び出される直前です)

拡張機能が見つかる場所(SpecialPageコンストラクタが渡されるものによって指定されます)はキー--exceptです. のため大文字化されません. 内部で使用される機能は特別ページのタイトル(もしくは説明)を見つける、名前を することです. "ThisIsACoolSpecialPage"のキーは"thisisacoolspecialpage."になります.

理論上、getDescription</tt>はメッセージキャッシュとのインタラクトを避けるためにオーバーロードすることが出来ますが、ソースコードは次のような内容を表示します: "派生クラスはこれをオーバーライドすることが出来ますが、通常デフォルトの振る舞いを保持することの方が簡単です. メッセージはrun-time--see MessageCache.phpに追加されます"さらに、これは下に示すようなMediaWikiの名前空間がメッセージをオーバーロードすることを防止します.

拡張機能名のローカライズ
輝く新しいMediaWiki拡張機能をインストールして気がつきます: "なんてこった、私のwikiはフランス語だが、ページは英語を表示する!" 多くの人は気にもしませんが、修正するのはとてもシンプルなタスクです(開発者がこのページで説明されているメソッドを使用している限り). ソースコードで遊び呆ける必要はありません. ページの名前は で、名前は"List of Dirty Pages"だが"Liste de Pages Sales"(フランス語)を表示したいとします. 次のようにシンプルです:


 * 1) MediaWiki:DirtyPagesにナビゲートして、このページは存在しないが、ともかく編集する
 * 2) "Liste de Pages Sales"を挿入して保存する

voilà (フランス語で「ほら」)、変更は適用されました:

言語の範囲内でwikiのためにタイトルをカスタマイズするために便利です: 例えば、開発者が"List of Dirty Pages"と読んでいるが、その名前が気に入らない場合、"List of Pages needing Cleanup"とリネームします. もっと学ぶためにはSpecial:Allmessagesを調べて下さい.

また、あなたの拡張機能が変更するテキストの大きなブロックを持つ場合、例えば警告など、直接テキストを出力しないで下さい:

それからこのメッセージもMediaWiki:Dirtypageshelpでカスタマイズすることが出来ます.

Help:System messagesも参照して下さい.

Do not display your SpecialPage on the Special:SpecialPages page
Sometimes you may want to limit the visibility of your SpecialPage by removing it from the Special:SpecialPages page and making it visible to only a set group of users. You can do this in the constructor by passing in a  parameter; e.g., “editinterface”, a right only assigned to sysops by default; see the User rights manual for other available user rights.

Or you can create your own right in the setup file and assign it to sysops, e.g.:

and then call the constructor with your right:

Do not allow url access to your SpecialPage
Even if you restrict your page in the constructor, as mentioned above, your SpecialPage will still be viewable directly via the url, e.g., Special:MySpecialPage. In order to limit access to your SpecialPage via the url, make sure the following is in your extension’s  method.

Disabling Special:UserLogin and Special:UserLogout pages
In LocalSettings.php you can use the SpecialPage_initList hook to unset unwanted built-in special pages. See "making a few SpecialPages restricted" if you need conditional unsetting of special pages for example for certain user groups. The general message "You have requested an invalid special page." is shown if users try to access such unset special pages.

記録の追加
On MediaWiki, all actions by users on wiki are tracked for transparency and collaboration. See Manual:Logging to Special:Log for how to do it.