Extension:BetaFeatures

From mediawiki.org
This page is a translated version of the page Extension:BetaFeatures and the translation is 100% complete.
Manuel des extensions MediaWiki
OOjs UI icon advanced-invert.svg
BetaFeatures
État de la version : stable
BetaFeatures 2013-09-06.png
Implémentation Média, Accroche , Base de données
Description Autorise les autres extensions à enregistrer leur fonctionnalités beta dans les préférences utilisateur.
Auteur(s) Mark Holmquist (MarkTraceurdiscussion)
Dernière version 0.1 (Continous updates)
Politique de compatibilité Versions ponctuelles alignées avec MediaWiki. Le master n'est pas compatible arrière.
MediaWiki 1.25+
PHP 5.4+
Modifie la base
de données
Oui
Tables betafeatures_user_counts
Licence Licence publique générale GNU v2.0 ou supérieur
Téléchargement Template:WikimediaDownload/gerritonly
Exemple Special:Preferences#mw-prefsection-betafeatures
Special
  • $wgBetaFeatures
  • $wgBetaFeaturesWhitelist
Traduire l’extension BetaFeatures sur translatewiki.net si elle y est disponible

Vérifier la matrice des utilisations et des versions.

Problèmes Tâches ouvertes · Signaler un bogue

L'extension BetaFeatures autorise les autres extensions MediaWiki à enregistrer leur fonctionnalités beta avec la liste des préférences utilisateur sur le wiki. Elle utilise l'architecture des préférences déjà existante et quelques pages spéciales pour accomplir sa fonction.

Installation

  • Téléchargez et placez le(s) fichiers (s) dans un répertoire appelé BetaFeatures dans votre dossier extensions/.
  • Ajoutez le code suivant à la fin de votre fichier LocalSettings.php  :
    wfLoadExtension( 'BetaFeatures' );
    
  • Exécutez le script de mise à jour qui va créer automatiquement les tables de base de données dont cette extension a besoin.
  • Configuration requise.
  • Yes Fait – Accédez à Special:Version sur votre wiki pour vérifier que l'extension a bien été installée.

Utiliser les nouveaux crochets dans votre extension

L'utilisation de cette extension pour prendre en charge votre fonctionnalité bêta est facile. Enregistrez un crochet de type "GetBetaFeaturePreferences " dans votre fichier extension.json — la syntaxe est presque identique au crochet GetPreferences , avec de petites modifications pour prendre en charge le type de préférence dont nous avons besoin dans ce cas.

Dans extension.json :

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

Dans 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',
        ];
    }
}
Pour l'instant, 'label-message', 'desc-message', 'info-link', and 'discussion-link' sont requis. S'il vous plait soyez sur de tous les utiliser !

Alors vous pouvez utiliser la fonction commodité fournie par les Fonctionnalités Bêta pour vérifier si la fonctionnalité est activée.

// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {

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

Vous pouvez également utiliser une vérification de préférence normale, mais ne vérifiez pas les valeurs véridiques ou fausses - utilisez les valeurs de la classe HTMLFeatureField.

// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {

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

Étant donné que la classe BetaFeatures doit être présente partout, vous pouvez utiliser la fonction de commodité dans n'importe quel crochet, page spéciale ou tout autre élément de votre choix. Soyez simplement conscient des problèmes potentiels de performances ou de mise en cache que vous pourriez introduire avec ces modifications.

Si vous souhaitez également utiliser votre extension sans BetaFeatures, vous devez également vérifier son existence, par exemple :

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

Configuration

La variable de configuration $wgBetaFeaturesWhitelist peut être utilisée pour limiter les fonctionnalités bêta affichées dans les préférences. Par défaut, il est vide et toutes les fonctionnalités bêta sont affichées.

S'il est utilisé, pour qu'une fonctionnalité bêta apparaisse dans les préférences, elle doit être répertoriée dans la liste blanche. Cette variable de configuration accepte un tableau de chaînes. Chaque chaîne doit être le nom d'une fonctionnalité bêta, comme spécifié dans la définition de préférence transmise à onGetBetaFeaturePreferences(). Par exemple, dans le code ci-dessus, le nom de la fonctionnalité bêta est myextension-awesome-feature, vous devez donc ajouter cette chaîne au tableau $wgBetaFeaturesWhitelist dans la configuration de votre wiki :

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

Utilisation avancée

Vous voulez voir quelque chose de vraiment cool ?

Groupes d'inscription automatique

Avec cet exemple, nous enregistrons une préférence qui est une "inscription automatique" - si un utilisateur vérifie cela et que de nouvelles fonctionnalités sortent dans un groupe particulier, l'utilisateur sera automatiquement inscrit à ces fonctionnalités.

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

Gestion des dépendances

Ensuite, nous pouvons en fait définir la gestion des dépendances par fonctionnalité. Pour ce faire, nous enregistrons d'abord le nom d'un crochet que nous voulons utiliser pour cela avec le crochet "GetBetaFeatureDependencyHooks ", puis nous enregistrons un crochet de ce type qui vérifie certaines dépendances et renvoie true ' si elle est remplie ou false' sinon.

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

Vous pouvez abuser utiliser cette fonctionnalité pour désactiver des fonctionnalités par wiki, si elles sont marquées comme dépendantes. Mais cela semble vraiment hacky. Vous ne devriez probablement pas. Je peux vous entendre y penser en ce moment, arrêtez simplement.

Contenu de la base de données

Il existe une table de base de données (1 $) définie et utilisée par BetaFeatures. Mais vous pourriez être confus si vous essayez de l'utiliser localement.

Nous utilisons la file d'attente des tâches pour exécuter les mises à jour de cette table, lorsque le cache expire (30 minutes TTL). Si votre wiki est configuré pour exécuter des tâches à chaque requête, cela rendra environ une requête toutes les 30 minutes très lente, mais le reste sera relativement rapide. Si vous configurez votre wiki pour exécuter des tâches via cron, les choses fonctionneront beaucoup mieux.

Voir aussi