Розширення:Бета-функції

From mediawiki.org
Jump to navigation Jump to search
This page is a translated version of the page Extension:BetaFeatures and the translation is 100% complete.
Довідка про розширення MediaWiki
OOjs UI icon advanced-invert.svg
BetaFeatures
Статус релізу: стабільний
BetaFeatures 2013-09-06.png
Реалізація Медіа, Хук , База даних
Опис Дозволяє іншим розширенням реєструвати свої бета-функції в налаштуваннях користувача
Автор(и) Mark Holmquist (MarkTraceurобговорення)
Найновіша версія 0.1 (Continous updates)
Compatibility policy Snapshots releases along with MediaWiki. Master is not backward compatible.
MediaWiki 1.25+
PHP 5.4+
Зміни в БД Yes
Tables betafeatures_user_counts
Ліцензія GNU General Public License 2.0 or later
Завантажити Template:WikimediaDownload/gerritonly
Приклад Special:Preferences#mw-prefsection-betafeatures
Special
  • $wgBetaFeatures
  • $wgBetaFeaturesWhitelist
Translate the BetaFeatures extension if it is available at translatewiki.net

Переглянути використання

Issues Open tasks · Report a bug

Розширення BetaFeature дозволяє іншим розширенням MediaWiki реєструвати бета-функції зі списком налаштувань користувача у вікі. Він використовує існуючу архітектуру налаштувань користувача та кілька спеціальних сторінок для виконання своєї функції.

Встановлення

  • Завантажте і розмістіть файли в каталозі з назвою BetaFeatures у вашій extensions/ папці.
  • Додайте такий код унизу вашого LocalSettings.php:
    wfLoadExtension( 'BetaFeatures' );
    
  • Запустіть скрипт оновлення, який автоматично створить необхідні таблиці бази даних, які потрібні цьому розширенню.
  • Налаштуйте як вимагається.
  • Yes Готово – Перейдіть до Special:Version вашої вікі, щоб переконатися, що розширення встановлено успішно.

Використання нових гачків у вашому розширенні

Використовувати це розширення для підтримки вашої бета-функції легко. Зареєструйте хук типу «GetBetaFeaturePreferences » у вашому файлі extension.json — синтаксис майже ідентичний хуку GetPreferences , з невеликими змінами для підтримки типу переваги, який нам потрібен у цьому випадку.

У extension.json:

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

У 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',
        ];
    }
}
Наразі потрібні «label-message», «desc-message», «info-link» і «discussion-link». Будь ласка, переконайтеся, що ви використовуєте їх усі!

Потім ви можете скористатися зручною функцією, наданою бета-функціями, щоб перевірити, чи ввімкнено цю функцію.

// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {

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

Ви також можете використовувати звичайну перевірку налаштувань, але не перевіряйте істинні чи хибні значення – використовуйте значення з класу HTMLFeatureField.

// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {

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

Оскільки клас бета-функцій повинен бути присутнім скрізь, ви можете використовувати функцію зручності в будь-якому хуку, спеціальній сторінці чи будь-якому іншому, що забажаєте. Просто пам’ятайте про потенційні проблеми із продуктивністю або кешуванням, які можуть виникнути внаслідок цих змін.

Якщо ви також хочете використовувати своє розширення без бета-функцій, Ви також повинні перевірити його існування, наприклад:

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

Конфігурація

Змінну конфігурації $wgBetaFeaturesWhitelist можна використовувати, щоб обмежити, які бета-функції відображаються в налаштуваннях. За замовчуванням він порожній, і відображаються всі бета-функції.

Якщо вона використовується, то для того, щоб бета-функція відображалася в налаштуваннях, її потрібно занести в білий список. Ця змінна конфігурації приймає масив рядків. Кожен рядок має бути ім’ям бета-функції, як зазначено у визначенні налаштувань, переданому до onGetBetaFeaturePreferences(). Наприклад, у коді, наведеному вище, назва бета-функції — myextension-awesome-feature, тому вам потрібно буде додати цей рядок до масиву $wgBetaFeaturesWhitelist у конфігурація вашої вікі:

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

Розширене використання

Хочете побачити щось дійсно круте?

Автоматична реєстрація груп

У цьому прикладі ми реєструємо параметр «автоматична реєстрація» — якщо користувач перевірить це, і з’являться нові функції, які входять до певної групи, користувач буде автоматично зареєстрований в цих функціях.

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

Управління залежностями

Далі ми можемо визначити управління залежностями для кожної функції. Для цього ми спочатку реєструємо ім’я хука, який ми хочемо використовувати для цього, за допомогою гачка «GetBetaFeatureDependencyHooks », потім ми реєструємо хук цього типу, який перевіряє деяку залежність і повертає true якщо він виконаний або false, якщо ні.

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

Ви можете зловживати використанням цієї функції, щоб вимкнути функції для кожної вікі, якщо вони позначені як залежні. Але це звучить дійсно халтурно. Ви, мабуть, не повинні. Я чую, як ти зараз думаєш про це, просто перестань.

Речі бази даних

Бета-функції визначає та використовує таблицю бази даних (betafeatures_user_counts). Але ви можете заплутатися, якщо спробуєте використовувати його локально.

Ми використовуємо чергу завдань для запуску оновлень для цієї таблиці, коли закінчується термін дії кешу (30 хвилин TTL). Якщо ваша вікі налаштована на виконання завдань за кожним запитом, це буде робити приблизно один запит кожні 30 хвилин дуже повільно, але решта буде відносно швидкою. Якщо ви налаштуєте свою вікі на виконання завдань через cron, все буде працювати набагато краще.

Див. також