Extension:BetaFeatures(测试功能)
发行状态: 稳定版 |
|
|---|---|
| 实现 | 媒体, 函数钩, 数据库 |
| 描述 | 可讓其他的扩展在用户参数设置中註冊其beta功能 |
| 作者 | Mark Holmquist (MarkTraceur留言) |
| 最新版本 | 0.1 (Continous updates) |
| 兼容性政策 | 快照跟随MediaWiki发布。 master分支不向后兼容。 |
| MediaWiki | 1.25+ |
| PHP | 5.4+ |
| 数据库更改 | 是 |
|
Special |
|
|
|
| 许可证 | GNU General Public License 2.0 or later |
| 下載 | |
| 示例 | Special:Preferences#mw-prefsection-betafeatures |
| 前往translatewiki.net翻譯BetaFeatures扩展 | |
| 問題 | 开启的任务 · 报告错误 |
测试功能(BetaFeatures)扩展可讓其他的MediaWiki扩展在wiki的使用者偏好清單中登錄beta功能。它通过現有的用户设置架構和一些特殊页面達到其功能。
安装
- 下载文件,并解压
BetaFeatures文件夹到extensions/目录中。
开发者和代码贡献人员应改从Git安装此扩展,输入:cd extensions/ git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/BetaFeatures
- 請新增下列代码到您的LocalSettings.php文件的底部:
wfLoadExtension( 'BetaFeatures' );
- 請运行更新脚本,它将自动创建此扩展所必须的数据库表。
- 按需求配置。
完成 – 請导航至您的wiki上的Special:Version,以验证此扩展已成功安装。
对您的扩展使用新钩子
使用此扩展程序支持您的Beta功能非常简单。在您的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'] = [
// 前兩個是訊息鍵
'label-message' => 'myextension-awesome-feature-message',
'desc-message' => 'myextension-awesome-feature-description',
// 代表該特徵的圖片路徑。
// 圖像對於從左到右和從右到左的語言,通常會有所不同。
// 特定語言的圖片亦可透過語言代碼指定。
'screenshot' => array(
'ru' => "$extensionAssetsPath/MyExtension/images/screenshot-ru.png",
'ltr' => "$extensionAssetsPath/MyExtension/images/screenshot-ltr.png",
'rtl' => "$extensionAssetsPath/MyExtension/images/screenshot-rtl.png",
),
// 功能說明的連結--或許可以使用mw.org的子頁面?
'info-link' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:MyExtension/MyFeature',
// 此功能的討論的連結--討論頁可能可以用
'discussion-link' => 'https://www.mediawiki.org/wiki/Help_talk:Extension:MyExtension/MyFeature',
];
}
}
'label-message'、'desc-message'、'info-link'和'discussion-link'都是需要的。请确保您全部都有使用!然后,您可以使用Beta功能中提供的便捷功能来检查该功能是否已启用。
// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {
public function execute() {
if ( BetaFeatures::isFeatureEnabled( $this->getUser(), 'my-awesome-feature' ) ) {
// 請實作此功能!
}
}
}
您也可以使用常规首选项检查,但不要检查真值或假值--請使用HTMLFeatureField类中的值。
// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {
public function execute() {
if ( $this->getUser()->getOption( 'my-awesome-feature' ) === HTMLFeatureField::OPTION_ENABLED ) {
// 請實作此功能!
}
}
}
由于BetaFeatures类应该无处不在,因此您可以在任何钩子、特殊页面或您想要的任何其他内容中使用便利函数。请注意这些更改可能会引入的潜在性能或缓存问题。
如果您还想「不通过」Beta功能使用您的扩展,您还应该检查它是否存在,例如:
if (
!ExtensionRegistry::getInstance()->isLoaded( 'BetaFeatures' )
|| \BetaFeatures::isFeatureEnabled( $user, 'my-awesome-feature' )
) {
// 請實作此功能!
}
配置
$wgBetaFeaturesWhitelist配置变量可用于限制首选项中显示的Beta功能。
默认情况下,它为空,并显示所有Beta功能。
如果使用它,那么为了在参数设置中显示Beta版功能,需要在白名单中列出。
此配置变量接受字符串数组。
每个字符串应是传递给onGetBetaFeaturePreferences()的首选项定义中指定的Beta功能的名称。
例如,在上面给出的代码中,Beta功能的名称是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(
// 前兩個是訊息鍵
'label-message' => 'beta-feature-autoenroll-message',
'desc-message' => 'beta-feature-autoenroll-description',
// 功能說明的連結--或許可以使用mw.org的子頁面?
'info-link' => 'https://wwww.mediawiki.org/wiki/Special:MyLanguage/MyFeature',
// 此功能的討論的連結--討論頁可能可以用
'discussion-link' => 'https://www.mediawiki.org/wiki/Talk:MyFeature',
// 為此群組啟用自動參與功能
'auto-enrollment' => 'my-awesome-feature-group',
);
$prefs['my-awesome-feature'] = array(
// 前兩個是訊息鍵
'label-message' => 'beta-feature-message',
'desc-message' => 'beta-feature-description',
// 代表該特徵的圖片路徑。
// 圖像對於從左到右和從右到左的語言,通常會有所不同。
// 特定語言的圖片亦可透過語言代碼指定。
'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;
}
}
如果功能被标记为依赖功能,您可以滥用此功能来禁用每个wiki的功能。但这听起来真的很骇人听闻。您可能不应该这样做。我能听见您现在在想它,停手吧。
数据库填充
有一个数据库表(betafeatures_user_counts)由Beta功能定义和使用。但是,如果您尝试在本地使用它,您可能会对它感到困惑。
当缓存过期(30分钟TTL)时,我们使用作业队列来运行此表的更新。如果您的wiki配置为对每个请求运行作业,这将使每30分钟大约一个请求的速度非常慢,但其余的请求会相对较快。如果您将您的wiki配置为通过cron运行作业将会好很多。
最佳實踐
Process
The process for setting up a beta feature is documented at Extension:BetaFeatures/How to setup a beta feature
Do not make conditional
When shipping a beta feature that only works on certain skins, it is preferable to display the beta feature on all skins and note in the description if it does not apply on a certain skin or to certain people. This is particularly important for features that are mobile only as it can make beta features less discoverable.
Conditional beta features are also problematic, as when changing skin a user will be removed from beta testing.
故障排除
使用次數統計
使用次數統計可能無法精確反映當前即時啟用某些beta版功能的使用者數量。這些數據應視為近似值。
此數值由一項工作計算得出,該工作可能延遲或耗時較長。過去,這些數據還設有30分鐘的快取機制。
参见
| 此扩展用于一个或多个维基媒体项目。 这可能意味着扩展足够稳定、运作足够良好,可以用在这样的高流量的网站上。 请在维基媒体的CommonSettings.php和InitialiseSettings.php配置文件中查找此扩展的名称以查看哪些网站安装了该扩展。 特定wiki上的已安装的扩展的完整列表位于Special:Version页面。 |
| 此扩展在以下wiki农场/托管网站和/或软件包中提供: |
- Stable extensions/zh
- Media handling extensions/zh
- Hook extensions/zh
- Database extensions/zh
- ExtensionTypes extensions/zh
- GetPreferences extensions/zh
- LoadExtensionSchemaUpdates extensions/zh
- MakeGlobalVariablesScript extensions/zh
- PreferencesGetIcon extensions/zh
- SaveUserOptions extensions/zh
- SkinTemplateNavigation::Universal extensions/zh
- UserGetDefaultOptions extensions/zh
- GPL licensed extensions/zh
- Extensions in Wikimedia version control/zh
- All extensions/zh
- Pages using deprecated NoteTA template
- Extensions used on Wikimedia/zh
- Extensions included in Canasta/zh
- Extensions included in Miraheze/zh
- Beta Features/zh
