Laajennus:BetaFeatures
![]() Julkaisustatus: vakaa |
|
---|---|
![]() |
|
Toteutus | Media, Kytköspiste , Tietokanta |
Kuvaus | Sallii muiden laajennusten rekisteröidä niiden beeta-toiminnot käyttäjän asetuksiin |
Tekijä(t) | Mark Holmquist (MarkTraceurkeskustelu) |
Viimeisin versio | 0.1 (Continous updates) |
Yhteensopivuuskäytäntö | Snapshots releases along with MediaWiki. Master is not backward compatible. |
MediaWiki | 1.25+ |
PHP | 5.4+ |
Tietokantamuutokset | Kyllä |
Taulukot | betafeatures_user_counts |
Lisenssi | GNU General Public License 2.0 tai myöhempi |
Lataa | |
Esimerkki | Special:Preferences#mw-prefsection-betafeatures |
Special |
|
|
|
Quarterly downloads | 61 (Ranked 86th) |
Public wikis using | 1,031 (Ranked 249th) |
Voit kääntää BetaFeatures-laajennuksen mikäli se on saatavilla translatewiki.netissä | |
Ongelmat | Avoimet tehtävät · Raportoi ongelmasta |
BetaFeatures-laajennus sallii muiden MediaWiki-laajennusten rekisteröidä niiden beeta-toiminnot wikien käyttäjien asetuksiin. Se käyttää olemassa olevaa käyttäjän asetusarkkitehtuuria ja muutamia toimintosivuja tehtävänsä suorittamiseen.
Asennus
- Download and move the extracted
BetaFeatures
folder to yourextensions/
directory.
Developers and code contributors should install the extension from Git instead, using:cd extensions/
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/BetaFeatures - Add the following code at the bottom of your LocalSettings.php file:
wfLoadExtension( 'BetaFeatures' );
- Run the update script which will automatically create the necessary database tables that this extension needs.
- Määritä tarvittaessa.
- Tehty – Navigate to Special:Version on your wiki to verify that the extension is successfully installed.
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.json
file — the syntax is almost identical to the GetPreferences
hook, with small changes to support the type of preference we need in this case.
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' );
$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',
];
}
}
Then, you can use the convenience function provided by BetaFeatures to check whether the feature is enabled.
// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {
public function execute() {
if ( BetaFeatures::isFeatureEnabled( $this->getUser(), 'my-awesome-feature' ) ) {
// Implement the feature!
}
}
}
You can also use a normal preference check, but don't check against truthy or falsy values - use the values from the HTMLFeatureField
class.
// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {
public function execute() {
if ( $this->getUser()->getOption( 'my-awesome-feature' ) === HTMLFeatureField::OPTION_ENABLED ) {
// Implement the feature!
}
}
}
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.
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!
}
Määritys
Muuttujaa $wgBetaFeaturesWhitelist
käytetään rajoittamaan, mitä beeta-toimintoja näytetään asetuksissa.
Oletuksena se on tyhjä, ja kaikki beeta-toiminnot näytetään.
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's configuration:
$wgBetaFeaturesWhitelist = [
'myextension-awesome-feature'
];
Kehittynyt käyttö
Haluatko nähdä jotain todella hienoa?
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.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',
);
}
}
Riippuvuuden hallinta
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.
// 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;
}
}
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.
Database stuff
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.
Troubleshootings
Usage counts
The usage counts might not reflect exactly the number of users having some beta features activated at this precise moment. These should be interpreted as approximate numbers.
This number is computed by a job, which could be delayed or long-running. In the past, there was also a 30-minutes cache on these figures.
Katso myös
Tätä laajennusta käytetään yhdessä tai useammassa Wikimedian hankkeessa. Tämä on todennäköisesti merkki siitä, että laajennus on vakaa ja toimii tarpeeksi hyvin voidakseen olla käytössä suosituilla verkkosivuilla. Look for this extension's name in Wikimedia's CommonSettings.php and InitialiseSettings.php configuration files to see where it's installed. Täydellinen lista yksittäiseen wikiin asennetuista laajennuksista löytyy jokaisesta wikistä sivulta Special:Version. |
This extension is included in the following wiki farms/hosts and/or packages: This is not an authoritative list. Some wiki farms/hosts and/or packages may contain this extension even if they are not listed here. Always check with your wiki farms/hosts or bundle to confirm. |