Extension:BetaFeatures

This page is a translated version of the page Extension:BetaFeatures and the translation is 100% complete.
MediaWiki 拡張機能マニュアル
BetaFeatures
リリースの状態: 安定
実装 メディア, フック , データベース
説明 他の拡張機能が利用者の個人設定にベータ機能を登録できるようにする
作者 Mark Holmquist (MarkTraceurトーク)
最新バージョン 0.1 (Continous updates)
互換性の方針 MediaWiki とともにリリースされるスナップショット。 master には後方互換性がありません。
MediaWiki 1.25+
PHP 5.4+
データベースの変更 はい
テーブル betafeatures_user_counts
ライセンス GNU 一般公衆利用許諾書 2.0 以降
ダウンロード Template:WikimediaDownload/gerritonly
Special:Preferences#mw-prefsection-betafeatures
Special
  • $wgBetaFeatures
  • $wgBetaFeaturesAllowList
Quarterly downloads 76 (Ranked 74th)
Public wikis using 1,031 (Ranked 249th)
translatewiki.net で翻訳を利用できる場合は、BetaFeatures 拡張機能の翻訳にご協力ください
問題点 未解決のタスク · バグを報告

BetaFeatures拡張機能は他のMediaWiki拡張機能がウィキ上の個人設定のリストにベータ機能を登録することを可能にします。既存の個人設定アーキテクチャといくつかの特別ページを使用してその機能を実現します。

インストール

  • ダウンロードして、ファイルをextensions/フォルダー内のBetaFeaturesという名前のディレクトリ内に配置します。
    開発者とコード寄稿者は、上記の代わりに以下を使用してGitからインストールします:cd extensions/
    git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/BetaFeatures
  • 以下のコードを LocalSettings.php ファイルの末尾に追加します:
    wfLoadExtension( 'BetaFeatures' );
    
  • 更新スクリプトを実行します。このスクリプトは、この拡張機能が必要とするデータベーステーブルを自動的に作成します。
  • 必要に応じて設定します。
  •   完了 – ウィキの「Special:Version」に移動して、拡張機能が正しくインストールされたことを確認します。

ご利用の拡張機能に新しいフックを取り入れる

この拡張機能を使用してベータ機能をサポートするのは簡単です。拡張機能の extension.json ファイルに「GetBetaFeaturePreferences 」タイプのフックを登録する - 構文は GetPreferences フックとほとんど同じですが、この場合に必要な設定の種類を少し変更してサポートしています。

extension.json 内:

    "Hooks": {
        "GetBetaFeaturePreferences": "MediaWiki\\Extension\\MyExtension\\Hooks::onGetBetaFeaturePreferences"
    },

MyExtension/includes/Hooks.php 内:

namespace MediaWiki\Extension\MyExtension;
class Hooks {
    public static function onGetBetaFeaturePreferences( User $user, array &$betaPrefs ) {
        $extensionAssetsPath = MediaWikiServices::getInstance()
			->getMainConfig()
			->get( 'ExtensionAssetsPath' );
        $betaPrefs['myextension-awesome-feature'] = [
            // The first two are message keys
            'label-message' => 'myextension-awesome-feature-message',
            'desc-message' => 'myextension-awesome-feature-description',
            // Paths to images that represents the feature.
            // The image is usually different for ltr and rtl languages.
            // Images for specific languages can also specified using the language code.
            'screenshot' => array(
                'ru' => "$extensionAssetsPath/MyExtension/images/screenshot-ru.png",
                'ltr' => "$extensionAssetsPath/MyExtension/images/screenshot-ltr.png",
                'rtl' => "$extensionAssetsPath/MyExtension/images/screenshot-rtl.png",
            ),
            // Link to information on the feature - use subpages on mw.org, maybe?
            'info-link' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:MyExtension/MyFeature',
            // Link to discussion about the feature - talk pages might work
            'discussion-link' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help_talk:Extension:MyExtension/MyFeature',
        ];
    }
}
現在、'label-message'と'desc-message'、'info-link'及び'discussion-link'が必須です。使用しているかどうか確認をお願いします!

確認後、ベータ版機能が提供する便利機能を使い、有効になったかどうかチェックできます。

// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {

    public function execute() {
        if ( BetaFeatures::isFeatureEnabled( $this->getUser(), 'my-awesome-feature' ) ) {
            // Implement the feature!
        }
    }
}

通常の個人設定のチェックもできますが、真偽値で判断せず - HTMLFeatureFieldクラスの値で判断します。

// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {

    public function execute() {
        if ( $this->getUser()->getOption( 'my-awesome-feature' ) === HTMLFeatureField::OPTION_ENABLED ) {
            // Implement the feature!
        }
    }
}

BetaFeaturesはすべての場面で利用できるようにする必要があるため、便利な機能に対してフックや特別ページほか利用者が探したいものを対応させることができます。ただそれらの変更から、一時的に性能あるいはキャッシュに障害が起こる可能性にご留意ください。

もし同時にベータ機能抜きで拡張機能を利用するには、まずあるかどうかを次のように確認します。

if (
    !ExtensionRegistry::getInstance()->isLoaded( 'BetaFeatures' )
    || \BetaFeatures::isFeatureEnabled( $user, 'my-awesome-feature' )
) {
    // Implement the feature!
}

設定

$wgBetaFeaturesWhitelist 構成変数を使うと、個人設定ページに表示するベータ機能を制限できます。 既定では空のため、すべての拡張機能を表示します。

これを用いた場合、ベータ機能を個人設定ページに表示させるにはホワイトリストにそのベータ機能を登録します。 この設定変数には文字列でもその配列でも入力できます。 どの文字列も個人設定ページに表示されたベータ機能名を入力してonGetBetaFeaturePreferences()に送ります。 例えば上記のコードで説明すると、myextension-awesome-featureがベータ機能名で、その文字列をご利用のウィキの設定ファイル内の $wgBetaFeaturesWhitelist 配列に記入します。

$wgBetaFeaturesWhitelist = [
        'myextension-awesome-feature' 
];

高度な使用法

ちょっとかっこいいものをお見せしましょうか?

自動登録グループ

この例では、「自動登録」の設定を登録します。利用者がこれをチェックし、特定のグループに属する新しい機能が出されると、利用者は自動的にその機能に登録されます。

// MyExtensionHooks.php
class MyExtensionHooks {

    static function getPreferences( $user, &$prefs ) {
        global $wgExtensionAssetsPath;

        $prefs['my-awesome-feature-auto-enroll'] = array(
            // The first two are message keys
            'label-message' => 'beta-feature-autoenroll-message',
            'desc-message' => 'beta-feature-autoenroll-description',
            // Link to information on the feature - use subpages on mw.org, maybe?
            'info-link' => 'https://wwww.mediawiki.org/wiki/Special:MyLanguage/MyFeature',
            // Link to discussion about the feature - talk pages might work
            'discussion-link' => 'https://www.mediawiki.org/wiki/Talk:MyFeature',
            // Enable auto-enroll for this group
            'auto-enrollment' => 'my-awesome-feature-group',
        );

        $prefs['my-awesome-feature'] = array(
            // The first two are message keys
            'label-message' => 'beta-feature-message',
            'desc-message' => 'beta-feature-description',
            // Paths to images that represents the feature.
            // The image is usually different for ltr and rtl languages.
            // Images for specific languages can also specified using the language code.
            'screenshot' => array(
                'ru' => "$wgExtensionAssetsPath/MyExtension/images/screenshot-ru.png",
                'ltr' => "$wgExtensionAssetsPath/MyExtension/images/screenshot-ltr.png",
                'rtl' => "$wgExtensionAssetsPath/MyExtension/images/screenshot-rtl.png",
            ),
            // Link to information on the feature - use subpages on mw.org, maybe?
            'info-link' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:MyExtension/SomeFeature',
            // Link to discussion about the feature - talk pages might work
            'discussion-link' => 'https://www.mediawiki.org/wiki/Extension_talk:MyExtension/SomeFeature',
            // Add feature to this group
            'group' => 'my-awesome-feature-group',
        );
    }
}

依存関係の管理

次に、依存関係の管理は機能単位で設定できます。この処理では使用したいフックの名前をフックの"GetBetaFeatureDependencyHooks "で登録し、それに続いて依存関係をチェックする同じタイプのフックを登録、一致したらtrue、不一致ならfalseを返します。

// MyExtension.php
$wgAutoloadClasses['MyExtensionHooks'] = __DIR__ . '/MyExtensionHooks.php';
Hooks::register( 'GetBetaFeaturePreferences', 'MyExtensionHooks::getPreferences' );
Hooks::register( 'GetBetaFeatureDependencyHooks', 'MyExtensionHooks::getDependencyCallbacks' );
Hooks::register( 'CheckDependenciesForMyExtensionFeature', 'MyExtensionHooks::checkDependencies' );
// MyExtensionHooks.php
class MyExtensionHooks {

    static function getPreferences( $user, &$prefs ) {
        global $wgExtensionAssetsPath;

        $prefs['my-awesome-feature'] = array(
            // The first two are message keys
            'label-message' => 'beta-feature-message',
            'desc-message' => 'beta-feature-description',
            // Paths to images that represents the feature.
            // The image is usually different for ltr and rtl languages.
            // Images for specific languages can also specified using the language code.
            'screenshot' => array(
                'ru' => "$wgExtensionAssetsPath/MyExtension/images/screenshot-ru.png",
                'ltr' => "$wgExtensionAssetsPath/MyExtension/images/screenshot-ltr.png",
                'rtl' => "$wgExtensionAssetsPath/MyExtension/images/screenshot-rtl.png",
            ),
            // Link to information on the feature - use subpages on mw.org, maybe?
            'info-link' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:MyExtension/SomeFeature',
            // Link to discussion about the feature - talk pages might work
            'discussion-link' => 'https://www.mediawiki.org/wiki/Extension_talk:MyExtension/SomeFeature',
            // Mark as dependent on something
            'dependent' => true,
        );
    }

    static function getDependencyCallbacks( &$depHooks ) {
        $depHooks['my-awesome-feature'] = 'CheckDependenciesForMyExtensionFeature';
        return true;
    }

    static function checkDependencies() {
        $dependenciesMet = false;
        // Do some fancy checking and return the result
        return $dependenciesMet;
    }
}

依存関係がマークしてある場合は、この機能を不正利用使用してウィキ単位で機能を無効にすることができます。そうは言っても作業がハッキングみたいに見えます。手を出さないほうがいいと迷いませんでしたか。今この瞬間、そう考えている姿が目に見えるようですが、ではやめましょう。

データベースとの関連

BetaFeaturesは対応するデータベースのテーブル(betafeatures_user_counts)を設定して使っています。ただローカルでそのテーブルを利用しようとしても、かえって混乱するかもしれません。

このテーブルの更新はキャッシュの期限切れ(合計30分)ごとにジョブキューで実行しています。ご利用のウィキがリクエスト単位でジョブ実行を設定している場合、テーブルの設定条件が原因で30分ごとのリクエストの遅延のみ深刻に遅く、その他の処理は比較的速まります。もしご利用のウィキでジョブ実行にcronを利用する設定にすると、状況はより改善されます。

関連項目