Phabricator のプロジェクト名 #BetaFeatures

Extension:BetaFeatures

From MediaWiki.org
Jump to navigation Jump to search
This page is a translated version of the page Extension:BetaFeatures and the translation is 70% complete.

Outdated translations are marked like this.
Other languages:
Bahasa Indonesia • ‎Deutsch • ‎English • ‎català • ‎dansk • ‎español • ‎français • ‎italiano • ‎polski • ‎português • ‎português do Brasil • ‎sicilianu • ‎suomi • ‎български • ‎русский • ‎հայերեն • ‎עברית • ‎العربية • ‎سنڌي • ‎中文 • ‎日本語 • ‎한국어
MediaWiki 拡張機能マニュアル
Crystal Clear action run.svg
BetaFeatures
リリースの状態: 安定
BetaFeatures 2013-09-06.png
実装 Media, Hook, Database
説明 他の拡張機能が利用者の個人設定にベータ機能を登録できるようにする
作者 Mark Holmquist (MarkTraceurtalk)
最新バージョン 0.1 (Continous updates)
MediaWiki 1.25+
PHP 5.4+
データベースの変更 はい
ライセンス GNU General Public License 2.0 or later
ダウンロード Template:WikimediaDownload/gerritonly
Multimedia Alpha site
名前空間 Special
パラメーター
  • $wgBetaFeaturesWhitelist
  • $wgBetaFeatures
使用するフック
UserSaveOptions
GetPreferences
PersonalUrls
LoadExtensionSchemaUpdates
MakeGlobalVariablesScript
ExtensionTypes
translatewiki.net で翻訳を利用できる場合は、BetaFeatures 拡張機能の翻訳にご協力ください
使用状況とバージョン マトリクスを確認してください。
問題点 未解決のタスク · バグを報告

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

インストール

  • ダウンロードして、ファイルを extensions/ フォルダー内の BetaFeatures という名前のディレクトリ内に配置します。
  • 以下のコードを LocalSettings.php の末尾に追加します:
    wfLoadExtension( 'BetaFeatures' );
    
  • 更新スクリプトを実行します。このスクリプトは、この拡張機能が必要とするデータベース テーブルを自動的に作成します。
  • Yes 完了 – ウィキの「Special:Version」に移動して、拡張機能が正しくインストールされたことを確認します。

MediaWiki 1.24 以前を稼働させている利用者へ:

上記の手順では、wfLoadExtension() を使用してこの拡張機能をインストールする新しい方法を記載しています。 この拡張機能をこれらの過去のバージョン (MediaWiki 1.24 以前) にインストールする必要がある場合は、wfLoadExtension( 'BetaFeatures' ); の代わりに以下を使用する必要があります:

require_once "$IP/extensions/BetaFeatures/BetaFeatures.php";

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

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

In extension.json:

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

In MyExtension/includes/Hooks.php:

namespace MediaWiki\Extension\MyExtension;
class Hooks {
    public static function onGetBetaFeaturePreferences( User $user, array &$betaPrefs ) {
        $extensionAssetsPath = MediaWikiServices::getInstance()
			->getMainConfig()
			->get( 'ExtensionAssetsPath' );
        $prefs['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 you want to also use your extension without BetaFeatures, you should also check for its existence, e.g.:

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

Configuration

The $wgBetaFeaturesWhitelist config variable can be used to limit which beta features are shown in preferences. By default it is empty, and all beta features are shown.

If it is used then in order for a beta feature to show up in the preferences it needs to be listed in the whitelist. This config variable accepts an array of strings. Each string should be the name of a beta feature as specified in the preference definition passed to onGetBetaFeaturePreferences(). For example, in the code given above, the name of the beta feature is myextension-awesome-feature, so you would need to add that string to the $wgBetaFeaturesWhitelist array in your wiki configs.

高度な使用法

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

自動登録グループ

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

// 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を利用する設定にすると、状況はより改善されます。

関連項目