The BetaFeatures extension allows other MediaWiki extensions to register beta features with the list of user preferences on the wiki. It uses the existing user preferences architecture and a few special pages to accomplish its function.

Using the new hooks in your extension

Using this extension to support your beta feature is easy. Register a hook of type "GetBetaFeaturePreferences" in your extension's main file - the syntax is almost identical to the GetPreferences hook, with small changes to support the type of preference we need in this case.

For now, 'label-message', 'desc-message', 'info-link', and 'discussion-link' are required. Please be sure you use all of them!

// MyExtensionHooks.phpclassMyExtensionHooks{staticfunctiongetPreferences($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/MyFeature',// Link to discussion about the feature - talk pages might work'discussion-link'=>'https://www.mediawiki.org/wiki/Talk:MyFeature',);}}

Then, you can use the convenience function provided by BetaFeatures to check whether the feature is enabled.

Because the BetaFeatures class should be present everywhere, you could use the convenience function in any hook, special page, or anything else you wanted. Just be aware of potential performance or caching issues you may introduce with those changes.

Uso avanzado

¿Quieres ver algo muy guay?

Auto-enroll groups

With this example, we register a preference that's an "auto-enroll" one - if a user checks this, and new features come out that are in a particular group, the user will be automatically enrolled in those features.

// MyExtensionHooks.phpclassMyExtensionHooks{staticfunctiongetPreferences($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',);}}

Administración de dependencias

Next up, we can actually define dependency management per-feature. To do this we first register the name of a hook that we want to use for this with the hook "GetBetaFeatureDependencyHooks", then we register a hook of that type that checks some dependency, and returns true if it's met or false if not.

// MyExtensionHooks.phpclassMyExtensionHooks{staticfunctiongetPreferences($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,);}staticfunctiongetDependencyCallbacks(&$depHooks){$depHooks['my-awesome-feature']='CheckDependenciesForMyExtensionFeature';returntrue;}staticfunctioncheckDependencies(){$dependenciesMet=false;// Do some fancy checking and return the resultreturn$dependenciesMet;}}

You can abuse use this feature to do per-wiki disabling of features, if they're marked as dependent. But that sounds really hacky. You probably shouldn't. I can hear you thinking about it right now, just stop it.

Consideraciones sobre la base de datos

There's a database table (betafeatures_user_counts) defined, and used, by BetaFeatures. But you might get confused by it if you try to use it locally.

We use the job queue to run updates for this table, when the cache expires (30 minutes TTL). If your wiki is configured to run jobs on each request, this will make about one request every 30 minutes reeeeeeally slow, but the rest will be relatively fast. If you configure your wiki to run jobs via cron, things will work much better.