Erweiterungen:BetaFeatures

From mediawiki.org
This page is a translated version of the page Extension:BetaFeatures and the translation is 100% complete.
MediaWiki-Erweiterungen
BetaFeatures
Freigabestatus: stabil
Einbindung Medien, Hook , Datenbank
Beschreibung Ermöglicht anderen Erweiterungen, ihre Betafunktionen in den Benutzereinstellungen zu registrieren
Autor(en) Mark Holmquist (MarkTraceurDiskussion)
Letzte Version 0.1 (Continous updates)
Kompatibilitätspolitik Snapshots werden zusammen mit MediaWiki veröffentlicht. Der Master ist nicht abwärtskompatibel.
MediaWiki 1.25+
PHP 5.4+
Datenbankänderungen Ja
Tabellen betafeatures_user_counts
Lizenz GNU General Public License 2.0 oder neuer
Herunterladen Template:WikimediaDownload/gerritonly
Beispiel Special:Preferences#mw-prefsection-betafeatures
Special
  • $wgBetaFeatures
  • $wgBetaFeaturesAllowList
Quarterly downloads 81 (Ranked 73rd)
Public wikis using 1,031 (Ranked 249th)
Übersetze die BetaFeatures-Erweiterung, wenn sie auf translatewiki.net verfügbar ist
Probleme Offene Aufgaben · Einen Fehler melden

Die BetaFeatures-Erweiterung ermöglicht es anderen MediaWiki-Erweiterungen, Beta-Funktionen mit der Liste der Benutzereinstellungen im Wiki zu registrieren. Es verwendet die vorhandene Architektur der Benutzereinstellungen und einige spezielle Seiten, um seine Funktion zu erfüllen.

Installation

  • Die Erweiterung herunterladen und die Datei(en) in ein Verzeichnis namens BetaFeatures im Ordner extensions/ ablegen.
    Developers and code contributors should install the extension from Git instead, using:cd extensions/
    git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/BetaFeatures
  • Folgenden Code am Ende deiner LocalSettings.php -Datei einfügen:
    wfLoadExtension( 'BetaFeatures' );
    
  • Führe das Aktualisierungsskript aus, welches automatisch die notwendigen Datenbanktabellen erstellt, die diese Erweiterung braucht.
  • Konfiguriere nach Bedarf.
  • Yes Erledigt – Zu Special:Version in dem Wiki (bei Einstellung auf deutsch nach Spezial:Version) navigieren, um die erfolgreiche Installierung der Erweiterung zu überprüfen.

Verwendung der neuen Hooks in Deiner Erweiterung

Die Verwendung dieser Erweiterung zur Unterstützung Deiner Beta-Funktion ist einfach. Registriere einen Hook vom Typ "GetBetaFeaturePreferences " in Deiner Datei extension.json – die Syntax ist fast identisch mit der des Hooks GetPreferences , mit geringfügigen Änderungen, um die Art der Funktion, die wir in diesem Fall brauchen, zu unterstützen.

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',
        ];
    }
}
Nunmehr sind 'label-message', 'desc-message', 'info-link' und 'discussion-link' erforderlich. Bitte stelle sicher, dass Du alle einsetzt!

Anschließend kannst Du mithilfe der von BetaFeatures bereitgestellten zweckdienlichen Funktion überprüfen, ob die Funktion aktiviert ist.

// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {

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

Du kannst auch eine normale Prüfung der Einstellungen anwenden, jedoch keine Prüfung mit "true" oder "false" Einstellungen - verwende nur die Werte aus der HTMLFeatureField-Kategorie.

// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {

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

Da die BetaFeatures-Katwegorie überall vorhanden sein sollte, kannst Du die zweckdienliche Funktion in beliebigen Hooks, Spezialseiten oder anderen gewünschten Elementen verwenden. Beachte nur die potenziellen Performance- oder Caching-Probleme, die durch diese Änderungen möglicherweise verursacht werden.

Wenn Du Deine Erweiterung auch ohne BetaFeatures verwenden möchtest, solltest Du auch überprüfen, ob sie überhaupt vorhanden ist, z. B.:

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

Konfiguration

Mit der Konfigurationsvariablen $wgBetaFeaturesWhitelist kannst Du einschränken, welche Betafunktionen in den Einstellungen angezeigt werden. Standardmäßig ist es leer und alle Beta-Funktionen werden angezeigt.

Wenn es verwendet wird, muss es in der Whitelist aufgeführt sein, damit eine Beta-Funktion in den Einstellungen angezeigt wird. Diese Konfigurationsvariable akzeptiert ein Reihe von Zeichenfolgen. Jeder String sollte der Name eines Beta-Features sein, wie in der Definition der Einstellungen angegeben, die an onGetBetaFeaturePreferences() übergeben wird. Beispielsweise lautet der Name des Beta-Features im oben angegebenen Code myextension-awesome-feature, sodass du diesen String zum Array $wgBetaFeaturesWhitelist in deinen Wiki-Einstellungen hinzufügen musst.

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

Verwendung für Fortgeschrittene

Willst du etwas wirklich tolles sehen?

Gruppen automatisch registrieren

In diesem Beispiel wird eine Voreinstellung vorgenommen, mit der automatisch mehrere Einstellungen aktiviert werden. Wenn ein Benutzer dies aktiviert und neue Funktionen in einer bestimmten Gruppe enthalten sind, aktiviert der Benutzer automatisch alle diese Funktionen auf einmal.

// 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',
        );
    }
}

Management untergeordneter Features

Als Nächstes können wir tatsächlich das Management pro Feature definieren. Dazu registrieren wir zuerst den Namen eines Hooks, den wir dafür verwenden möchten, mit dem Hook „GetBetaFeatureDependencyHooks ”, dann aktivieren wir einen Hook dieses Typs, der die etwaige Zugehörigkeit prüft und true zurück gibt, wenn es erfüllt ist, oder false, falls nicht.

// 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;
    }
}

Du kannst diese Funktion missbrauchen, um die Funktionen pro Wiki zu deaktivieren, wenn sie als untergeordnet markiert sind. Aber das klingt wirklich abgedreht. Das solltest du möglichst nicht tun. Ich kann mir vorstellen, wie du darüber denkst, aber lass es lieber.

Datenbank Material

Es gibt eine Datenbanktabelle (betafeatures_user_counts), die von BetaFeatures definiert und verwendet wird. Es kann jedoch unübersichtlich sein, wenn Du versuchen solltest, sie lokal zu verwenden.

Wir verwenden die Jobwarteschlange, um Aktualisierungen für diese Tabelle auszuführen, wenn der Cache abläuft (30 Minuten Lebenszeit). Wenn Dein Wiki so konfiguriert ist, dass Jobs für jede Anforderung ausgeführt werden, wird dadurch etwa alle 30 Minuten eine Anforderung ausgeführt. Dies ist zwar sehr langsam, der Rest ist jedoch relativ schnell. Wenn Du Dein Wiki so konfigurierst, dass Jobs über den Cron-Daemon ausgeführt werden, funktioniert es viel besser.

Siehe auch