Jump to content

Extensão: BetaFeatures

From mediawiki.org
This page is a translated version of the page Extension:BetaFeatures and the translation is 81% complete.
Manual de extensões do MediaWiki
BetaFeatures
Estado de lançamento: estável
Implementação Multimédia, Hook , Base de dados
Descrição Permite que as outras extensões registem as suas funcionalidades beta nas preferências do utilizador
Autor(es) Mark Holmquist (MarkTraceurdiscussão)
Última versão 0.1 (Continous updates)
Política de compatibilidade Lançamentos de capturas de ecrã em conjunto com o MediaWiki. Original não é compatível com as versões anteriores.
MediaWiki 1.25+
PHP 5.4+
Alterações à base de dados Sim
Tabelas betafeatures_user_counts
Licença GNU - Licença Pública Geral 2.0 ou superior
Transferência Template:WikimediaDownload/gerritonly
Exemplo Special:Preferences#mw-prefsection-betafeatures
Special
  • $wgBetaFeatures
  • $wgBetaFeaturesAllowList
Traduza a extensão BetaFeatures se esta estiver disponível em translatewiki.net
Problemas Tarefas em aberto · Reportar um erro

A extensão BetaFeatures permite que as outras extensões do MediaWiki registem as funcionalidades beta com a lista de preferências do utilizador na wiki. Esta utiliza a arquitetura de preferências do utilizador existente e algumas páginas especiais para realizar a sua função.

Instalação

  • Exporte e coloque o ficheiro, ou ficheiros, num diretório chamado BetaFeatures, na sua pasta extensions/.
    Developers and code contributors should install the extension from Git instead, using:
    cd extensions/
    git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/BetaFeatures
    
  • Acrescente o seguinte código ao fundo do ficheiro $LocalSettings:
    wfLoadExtension( 'BetaFeatures' );
    
  • Execute o script de atualização que irá criar automaticamente as tabelas da base de dados necessárias para esta extensão.
  • Configure conforme necessário.
  • Yes Pronto – Na página especial Special:Version da sua wiki verifique se a extensão foi instalada.

Utilizar os novos hooks na sua extensão

Utilizar esta extensão para suportar a sua funcionalidade beta é fácil. Registe um hook do tipo GetBetaFeaturePreferences no seu ficheiro extension.json - a sintaxe é quase idêntica ao hook GetPreferences , com pequenas alterações para suportar o tipo de preferência que nós precisamos neste caso.

Em extension.json:

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

Em 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'] = [
            // Os dois primeiros são chaves de mensagem
            'label-message' => 'myextension-awesome-feature-message',
            'desc-message' => 'myextension-awesome-feature-description',
            // Os caminhos para as imagens que representa a funcionalidade.
            // A imagem é normalmente diferente para os idiomas ltr e rtl.
            // As imagens para os idiomas específicos também podem ser especificadas utilizando o código de idioma.
            'screenshot' => array(
                'ru' => "$extensionAssetsPath/MyExtension/images/screenshot-ru.png",
                'ltr' => "$extensionAssetsPath/MyExtension/images/screenshot-ltr.png",
                'rtl' => "$extensionAssetsPath/MyExtension/images/screenshot-rtl.png",
            ),
            // Hiperligação para a informação sobre a funcionalidade - utilizar as subpáginas em mw.org, talvez?
            'info-link' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:MyExtension/MyFeature',
            // Hiperligação para a discussão sobre a funcionalidade - as páginas de discussão talvez funcionem
            'discussion-link' => 'https://www.mediawiki.org/wiki/Help_talk:Extension:MyExtension/MyFeature',
        ];
    }
}
Por agora, 'label-message', 'desc-message', 'info-link', e 'discussion-link' são necessários. Por favor, certifique-se que os utiliza todos!

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' ) ) {
            // Implementar a funcionalidade!
        }
    }
}

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 ) {
            // Implementar a funcionalidade!
        }
    }
}

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' )
) {
    // Implementar a funcionalidade!
}

Configuração

A variável de configuração $wgBetaFeaturesWhitelist pode ser utilizada para limitar quais as funcionalidades beta que são mostradas nas preferências. Esta por predefinição está vazia, e são mostradas todas as funcionalidades beta.

Se for utilizada para que uma funcionalidade beta apareça nas preferências, esta precisa de ser listada na lista branca. Esta variável de configuração aceita uma série de strings. Cada string deveria ser o nome de uma funcionalidade beta, conforme especificado na definição da preferência passada para onGetBetaFeaturePreferences(). Por exemplo, no código dado em cima, o nome da funcionalidade beta é myextension-awesome-feature, então você precisaria de adicionar esta string $wgBetaFeaturesWhitelist à matriz na configuração da sua wiki:

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

Utilização Avançada

Quer ver algo realmente genial?

Grupos de inscrição automática

Com este exemplo, nós registamos uma preferência que é uma "inscrição automática" - se um utilizador marcar isto e surgirem novas funcionalidades que estejam num grupo específico, o utilizador será automaticamente inscrito nessas funcionalidades.

// MyExtensionHooks.php
class MyExtensionHooks {

    static function getPreferences( $user, &$prefs ) {
        global $wgExtensionAssetsPath;

        $prefs['my-awesome-feature-auto-enroll'] = array(
            // Os dois primeiros são chaves de mensagem
            'label-message' => 'beta-feature-autoenroll-message',
            'desc-message' => 'beta-feature-autoenroll-description',
            // Hiperligação para a informação na funcionalidade - utilizar as subpáginas em mw.org, talvez?
            'info-link' => 'https://wwww.mediawiki.org/wiki/Special:MyLanguage/MyFeature',
            // Hiperligação para a discussão sobre a funcionalidade - as páginas de discussão talvez funcionem
            'discussion-link' => 'https://www.mediawiki.org/wiki/Talk:MyFeature',
            // Ativar inscrição automática para este grupo
            'auto-enrollment' => 'my-awesome-feature-group',
        );

        $prefs['my-awesome-feature'] = array(
            // Os dois primeiros são chaves de mensagem
            'label-message' => 'beta-feature-message',
            'desc-message' => 'beta-feature-description',
            // Os caminhos para as imagens que representa a funcionalidade.
            // A imagem é normalmente diferente para os idiomas ltr e rtl.
            // As imagens para os idiomas específicos também podem ser especificadas utilizando o código de idioma.
            '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',
        );
    }
}

Gestão de dependência

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.

Coisas da base de dados

Existe uma tabela da base de dados (betafeatures_user_counts) definida, e utilizada, por BetaFeatures. Mas pode ficar confuso com esta se tentar utilizá-la localmente.

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.

Resoluções de problemas

Contagens de utilização

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.

Consultar também