امتداد:مزايا_تجريبية

This page is a translated version of the page Extension:BetaFeatures and the translation is 100% complete.
الدليل المرجعي لامتدادات ميدياويكي
BetaFeatures
حالة الإصدار مستقر
تنفيذ وسائط, وصلة , قاعدة بيانات
بيان يسمح للامتدادات الأخرى تسجيل مزاياها التجريبية في تفضيلات المستخدم
المؤلف/المؤلفون Mark Holmquist (MarkTraceurنقاش)
آخر إصدار 0.1 (Continous updates)
سياسة التوافق تصدر اللقطات البرمجية مع ميدياويكي. الإصدار الرئيسي لا يتوافق مع الإصدارات السابقة.
MediaWiki 1.25+
PHP 5.4+
تغييرات قاعدة البيانات نعم
جداول betafeatures_user_counts
ترخيص رخصة جنو العمومية 2.0 أو ما بعدها
التنزيل Template:WikimediaDownload/gerritonly
مثال Special:Preferences#mw-prefsection-betafeatures
Special
  • $wgBetaFeatures
  • $wgBetaFeaturesAllowList
تنزيلات ربع سنوية 81 (Ranked 73rd)
استخدام مواقع الويكي العمومية 1,031 (Ranked 249th)
ترجم الامتداد BetaFeatures لو كان متوفرا على translatewiki.net
المسائل المهام المفتوحة · الإبلاغ عن عطل تقني

يسمح امتداد BetaFeatures لامتدادات ميدياويكي الأخرى تسجيل مزايا تجريبية في قائمة تفضيلات المستخدم على موقع الويكي. يستعين الامتداد ببنية تفضيلات المستخدم القائمة وبضع صفحات أخرى لتنفيذ وظيفته.

التنصيب

  • نزّل الملف/الملفات وضعها في دليل يحمل اسم ‎BetaFeatures داخل مجلد ‎extensions/‎ لديك.
    يجب على مطوري البرمجيات والمساهمين بالكود البرمجي تثبيت الامتداد من غت بدلا من ذلك، مستخدمين:cd extensions/
    git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/BetaFeatures
  • أضف الكود التالي في الجزء الأسفل من ملف LocalSettings.php :
    wfLoadExtension( 'BetaFeatures' );
    
  • شغل نص التحديث البرمجي الذي سوف ينشئ تلقائيا جداول قاعدة البيانات الضرورية التي يحتاج إليها الامتداد.
  • أعدّ الامتداد حسب ما هو مطلوب.
  •   تم التنفيذ – اذهب إلى 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' بنود مطلوبة. يرجى الحرص على استخدامها جميعا!

ومن ثم، يمكنك استخدام وظيفة الملائمة التي يقدمها BetaFeatures كي تتأكد من كون السمة ناشطة أم لا.

// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {

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

يمكنك أيضا استخدام سبيل تحقق من التفضيلات معتاد، لكن عليك ألا تتحقق مستخدما قيم «صحيح - truthy» أو «خطأ - falsy» - بل عليك استخدام قيم من فئة HTMLFeatureField.

// SpecialMyExtension.php
class SpecialMyExtension extends SpecialPage {

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

منذ أن فئة BetaFeatures يجب أن تكون قائمة في كل مكان، يمكنك استخدام وظيفة الملائمة في أي رابط أو صفحة خاصة أو أي شيء آخر تريد. إلا أن عليك أن تحذر من حدوث مشاكل محتملة في الأداء أو الحفظ المؤقت التي ربما تنتج عن تنفيذ تلك التغييرات.

لو كنت ترغب أيضا في استخدام امتدادك دون BetaFeatures، يتعين عليك أيضا أن تتحقق من وجوده، مثال:

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) محدد، ومستخدم، في BetaFeatures. إلا أنك ربما تنتابك الحيرة بسببه لو حاولت استخدامه محليا.

نستعين بطابور المهام كي نشغل التحديثات على هذا الجدول، حينما تنتهي صلاحية الحفظ المؤقت (30 دقيقة TTL). لو أعدّ موقعك الويكي كي يشغل مهام لكل طلب، سوف يجعل هذا حوالي طلب واحد فقط كل 30 دقيقة بطيء للغاية، إلا أن الباقي سوف يكون سريعا إلى حد ما. لو أعددت موقعك الويكي كي يشغل المهام مستخدما cron، سوف تعمل الأمور أفضل كثيرا.

انظر أيضا