Manual:Special pages/ja

From MediaWiki.org

Jump to: navigation, search
タグの拡張機能 パーサー関数 フック 特別ページ スキン マジックワード

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

Contents

[edit] 一般的な情報

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

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

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

ノート:

  • 特別ページを作成するためには様々な方法がありますが、下記のものは大部分がオフィシャルな拡張機能によって使用されるもので、MediaWikiのSVNに受け入れられるためにはこのスタイルに固有なものが必要です。また、'specialpage'のために新しい特別ページの中にクレジットブロックを含むことを確認して下さい。詳細については$wgExtensionCreditsをご覧下さい。
  • 新しい特別ページを作成した後に、他の人が見つけられるようにこれをCategory:Special page extensionsExtension special page registryに追加して下さい。
  • 下で使用されるメソッドはPHP4では動作しません: PHP5で導入された"クラスのオートローディング"に依存するからです。このスタイルで書かれた特別ページはそれゆえMediaWiki 1.7.0以前のものと必ずしも互換性がありません:最近のバージョンのPHP上でより前のMediaWikiのバージョンを使用している場合は、アップグレードを検討して下さい。

[edit] 基本的な特別ページのテンプレート

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

  • <special_page_name>.setup.php - セットアップファイル
  • <special_page_name>.i18n.php - 国際化ファイル
  • <special_page_name>.body.php - 特別ページのコード

下記の例において、<special_page_name>はMyExtensionです。

[edit] セットアップファイル

セットアップファイルは次のように見えます:

<?php
# スキンファイルに直接アクセスにしてMediaWikiへの正しいエントリポイントではない場合にユーザに警告する
if (!defined('MEDIAWIKI')) {
        echo <<<EOT
To install my extension, put the following line in LocalSettings.php:
require_once( "$IP/extensions/MyExtension/MyExtension.php" );
EOT;
        exit( 1 );
}
 
$wgAutoloadClasses['MyExtension'] = dirname(__FILE__) . '/MyExtension_body.php'; # MediaWikiに拡張機能ボディをロードするように伝える。
$wgSpecialPages['MyExtension'] = 'MyExtension'; # MediaWikiに新しい特別ページについて知らせる。
$wgHooks['LoadAllMessages'][] = 'MyExtension::loadMessages'; # 特別ページのために国際化メッセージをロードする。
$wgHooks['LangugeGetSpecialPageAliases'][] = 'myExtensionLocalizedPageName'; # 特別ページのためにエイリアスを追加する。
 
function myExtensionLocalizedPageName(&$specialPageArray, $code) {
  # 特別ページのローカライズされたタイトルは拡張機能のメッセージ間にある:
  MyExtension::loadMessages();
  $text = wfMsg('myextension');
 
  # テキストにあるタイトルからDBKeyに変換してエイリアスの配列に差し込む:
  $title = Title::newFromText($text);
  $specialPageArray['MyExtension'][] = $title->getDBKey();
 
  return true;
}

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

  • myExtensionクラスの位置
  • 新しい特別ページとクラス名
  • LoadAllMessages hookはMyExtension(後で説明)のためにメッセージをロードする
  • LangugeGetSpecialPageAliases hookは特別ページのためのエイリアスを登録するためです。このエイリアスはページのタイトルを他の言語に翻訳することが出来ます。LoadMessages hookのおかげにも関わらず、ページタイトルは他の言語にカスタマイズすることが可能で、ページのURLはユーザの言語が英語ではないときでも.../Special:Myextensionのままです。これを修正するためには、myExtensionLocalizedPageNameはエイリアスを登録するので、ページは.../Special:My_extension経由でアクセスできるようになります。例えばドイツ語では.../Spezial:Meine_Erweiterungとなります。

[edit] ボディファイル

MyExtension_body.phpボディファイルはSpecialPageのサブクラスを含みます。特別ページがリクエストされたときに自動的に読み込まれます。この例では、MyExtensionサブクラスが呼ばれます:

<?php
class MyExtension extends SpecialPage
{
        function MyExtension() {
                SpecialPage::SpecialPage("MyExtension");
                self::loadMessages();
        }
 
        function execute( $par ) {
                global $wgRequest, $wgOut;
 
                $this->setHeaders();
 
                # リクエストデータを取得する
                $param = $wgRequest->getText('param');
 
                # 処理を行う
                ...
 
                # 出力
                # $wgOut->addHTML( $output );
        }
 
        function loadMessages() {
                static $messagesLoaded = false;
                global $wgMessageCache;
                if ( $messagesLoaded ) return;
                $messagesLoaded = true;
 
                require( dirname( __FILE__ ) . '/MyExtension.i18n.php' );
                foreach ( $allMessages as $lang => $langMessages ) {
                        $wgMessageCache->addMessages( $langMessages, $lang );
                }
                return true;
        }
}

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

MyExtension::loadMessages()は現在のところ、少し込み入っていますが、願わしくはMediaWikiの将来のバージョンでは簡単になります。国際化ファイル(MyExtension.i18n.php)で定義されたメッセージをロードします。それからこれらのメッセージをキャッシュに保存します。この関数はスタブファイルにあるLoadAllMessages、 MyExtension.setup.phpから呼び出されたので、MediaWikiは定義されたメッセージのすべてを見つけ、トランスレータにそれを渡します。

MyExtension.i18n.phpは、究極的には多言語に翻訳されるテキスト(例えばメッセージ)のスニペットを与えます。すべての特別ページが定義しなければならないとても重要なメッセージがあります: 特別ページの説明です。Special:Specialpages上と、特別ページの<H1>要素に現れます。このメッセージの名前は小文字に変換された特別ページの名前です。

[edit] 国際化ファイル

最小のi18nファイルは次のように現れます:

<?php
$allMessages = array(
        'en' => array( 
                'myextension' => 'My Extension'
        ),
        'de' => array(
                'myextension' => 'Meine Erweiterung'
        )
);

"My Extension"と等しいmyextensionの英語(en)バージョンのメッセージを定義します。もちろん、他の言語のメッセージのバージョンを追加することが出来ます: この例ではドイツ語(de)を持ちます。

英語ページタイトルがIDと同じ場合は便利です。しかしながらIDは大文字で始まるべきではないことと、IDに空白が ある場合はアンダースコアとしてコードにかかれるべきであることを覚えておいて下さい。ページヘッダとページ名に適用する通常のルールにリンクするために: $wgCapitalLinksがtrueの場合、小文字は大文字に変換され、アンダースコアは空白として表示されます。例:

<code>'my_extension' => 'My extension'</code>

ローカライズされたページ名のエイリアス無しでのこの例のバージョンがテストされ、 MediaWiki SVNにあるexamples/ThreeFileTemplateにチェックインしました。

[edit] 他の重要なファイル

[edit] SpecialPage.php

[edit] コンストラクタ

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

function SpecialPage( $name = '', $restriction = '', $listed = true, $function = false, $file = 'default', $includable = false )
  • string $name リンクとURLで見られる特別ページの名前
  • string $restriction 要求されたユーザの権限、例えば"block"もしくは"delete"
  • boolean $listed Special:Specialpagesでページがリスト表示されるかどうか
  • string $function execute()によって呼ばれた関数。デフォルトでは$nameからコンストラクトされる
  • string $file</code execute()によって含まれるファイル。デフォルトでは$nameからコンストラクトされる。
  • boolean $includable {{Special:...}}を使用して他のページが特別ページを含むことができるかどうか

[edit] SpecialPage->setHeaders()

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

[edit] SpecialPage->including()

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

他のウェブページから含むことはコンストラクタに含めることが可能であるページを宣言した場合のみ可能です。 親クラスの初期化の後で__construct()メソッドに次のコードを追加することで行うことが出来ます:

$this->mIncludable = true;

[edit] SpecialPage->execute()

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

[edit] OutputPage.php

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

function randomFunction() {
  global $wgOut;
  $wgOut->addHTML('<b>This is not very random...</b>');
}

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

[edit] OutputPage->addHTML()

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

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

[edit] OutputPage->addWikiText()

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

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

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

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

一つの項目ごとに3つのリストを出力します。おそらくは意図されていませんが。

警告: 特別ページが他のページに含まれることが意図される場合、おそらくはaddWikitext()を使用すべきではないでしょう。what seems to be a bug in MediaWikiのおかげで、含まれた特別ページはそれ以前はUNIQ10842e596cbb71daといったものを表示して含んだものをめちゃくちゃにします。次善策としては、個別にParserオブジェクトを使用してWikitextをHTMLに変換し、それからaddHTML()を使用します。例です:

$wgOut->addHTML(sandboxParse("Here's some '''formated''' text."));
function sandboxParse($wikiText) {
        global $wgTitle, $wgUser;
        $myParser = new Parser();
        $myParserOptions = new ParserOptions();
        $myParserOptions->initialiseFromUser($wgUser);
        $result = $myParser->parse($wikiText, $wgTitle, $myParserOptions);
        return $result->getText();
}

[edit] wfMsg()

多くの本当の特別ページにおいて、ひょっこり現れるwfMsg()無しで$wgOut->addWikitext()を見ることはまれです。


wfMsg()MediaWiki国際化 (i18n)関数です。

[edit]

$wgOut->addWikiText( wfMsg( 'flubbersuccess' ) );

wfMsg()flubbersuccessと呼ばれるシステムメッセージを探し、それを返します。メッセージの実際のテキストは様々な場所からやってきます。メッセージの文字列の後で数字のパラメータ($1, $2)をwfMsg()に渡すことでそれらを値に置き換えすることもできます。$wgMessageCacheに出力するものをMediaWikiに伝える方法をより詳しく調べて下さい。

[edit] 関連項目

  • wfMsgForContent() - ユーザーの言語ではなく、内容の言語のシステムメッセージを使います。これはリンクに対して便利です。


[edit] OutputPage->showErrorPage()

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

$wgOut->showErrorPage('error','badarticleerror');
    • 'error'はテキストの"Error"を参照します。
  • 'badarticleerror'はテキストの"This action cannot be performed on this page."を参照します。

[edit] MessageCache.php

MessageCacheはメッセージをwikiで定義された値に変換するクラスです。もっと詳細な情報についてはm:Help:System messageをご覧下さい。多くの環境では、システムメッセージは重要性に応じてこれらの場所から来ます:

  1. デフォルトの言語ファイル
  2. Messages defined in extension internationalization files
  3. 拡張機能の国際化ファイルで定義されたメッセージ
  4. MediaWikiの名前空間

デフォルトの言語ファイルはすべてWikipediaに搭載されているものです。我々は拡張機能を書いて、新しい機能を実装していますが、あまり有用ではありません。次の拡張機能の文字列です。メッセージはこのページに含まれる$wgMessageCacheによって拡張機能からアクセス可能です。

[edit] MessageCache->addMessages()

MessageCache->addMessages()は通常メッセージを追加するために使用され、内部的にそのようなものとしてマークされる、構文はとてもシンプルです:

function addMessages( $messages )

$messagesの配列は次のようなものです:

array (
    'key1' => 'Value 1',
    'key2' => 'Value 2'
)

キーが何であれ、値はwfMsg('key')を使用して取得されます。MediaWikiデータベース、とりわけMediaWiki:Keyにあるページからカスタマイズされた文字列を渡すことを可能にします。

[edit] WebRequest.php

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

[edit] WebRequest->getVal($key)

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

[edit] WebRequest->get*()

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

[edit] WebRequest->wasPosted()

Returns true if a form was posted.

[edit] Database.php

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

[edit] wfGetDB()

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

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

[edit] User.php

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

[edit] User->isAllowed($right)

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

[edit] User->isBlocked()

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

[edit] Title.php

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

[edit] Title::makeTitle()

[edit] Title->escapeLocalURL()

[edit] FAQ

[edit] 拡張機能のタイトルを設定する

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

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

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

[edit] 拡張機能名をローカライズする

輝く新しいMediaWiki拡張機能をインストールして気がつきます: "なんてこった、私のwikiはフランス語だが、ページは英語を表示する!" 多くの人は気にもしませんが、修正するのはとてもシンプルなタスクです(開発者がこのページで説明されているメソッドを使用している限り)。ソースコードで遊び呆ける必要はありません。ページの名前はDirtyPagesで、名前は"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を調べて下さい。

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

$wgOut->addHTML( wfMsg( 'dirtypageshelp' ) );

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

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

Personal tools