Příručka:Hooks/GetPreferences
GetPreferences | |
---|---|
Dostupné od verze 1.16.0 Úpravy uživatelských předvoleb. | |
Definice funkce: | public static function onGetPreferences( User $user, array &$preferences ) { ... }
|
Registrace háčku: | V extension.json:
{
"Hooks": {
"GetPreferences": "MediaWiki\\Extension\\MyExtension\\Hooks::onGetPreferences"
}
}
|
Volá se z: | Soubor/y: preferences/DefaultPreferencesFactory.php |
Rozhraní: | GetPreferencesHook.php |
Další informace o háčcích najdete na stránce Příručka:Háčky .
Chcete-li vědět, jaká rozšíření tento háček používají, podívejte se na stránku Category:GetPreferences extensions/cs.
Od REL1_35:
Definice funkce: |
public function onGetPreferences( $user, &$preferences ) { ... }
|
---|---|
Registrace háčku: | V extension.json: |
{
"Hooks": {
"GetPreferences": "example_tag"
},
"HookHandlers": {
"example_tag": {
"class": "MediaWiki\\Extension\\ExampleExtension\\Hooks",
"services": [
"MainConfig",
"UserOptionsLookup"
]
}
}
}
| |
Rozhraní: | GetPreferencesHook.php |
Použití
Parametry
Parametr/Možnost | Popis |
---|---|
$user | Uživatel, jehož předvolby se upravují |
&$preferences | Pole popisu předvoleb, které má být přiváděno do objektu HTMLForm |
Karty a sekce
Klíč pole section
určuje, která karta a sekce Preferences obsahuje vaše preference.
Pokud je vaše hodnota section
foo/bar, znamená to, že se vaše preference zobrazí na kartě foo (pojmenované systémovou zprávou prefs-foo
) v sekci bar (pojmenované systémem zpráva prefs-bar
).
Pokud žádná taková karta nebo sekce neexistuje, vytvoří se automaticky.
Seznam výchozích karet
Identifikátor | Zobrazuje jako |
---|---|
personal | Údaje o uživateli |
rendering | Vzhled |
editing | Editace |
rc | Poslední změny |
watchlist | Sledované stránky |
misc | Různé |
Podporované typy
Viditelné typy
type může nabývat různých hodnot nalezených v poli HTMLForm::$typeMappings
v souboru includes/htmlform/HTMLForm.php, včetně info
, multiselect
, radio
atd.
Většina předvoleb je uložena ve stejném formátu, jaký používá HTMLFormField, ale v případě 'type' => 'usersmultiselect'
by měla být provedena transformace ze seznamu uživatelských jmen oddělených novým řádkem (s čím pracuje widget formuláře) a nového řádku odděleného seznam ID uživatelů (což je to, co se ukládá do databáze).
Jako vzor se podívejte na zacházení s email-blacklist
(v jádru) nebo echo-notifications-blacklist
(v Echo ) .
Floaty
Pro typy float
můžete nastavit min
a max
, které budou ověřeny při uložení.
Předvolby API
Předvolby API používají typ api
. Nejsou zobrazeny v Special:Preferences.
They are usually set via custom front-end interfaces that call the API.
'type' => 'hidden'
pro předvolby API (tento typ existuje pro formuláře HTML, nikoli předvolby).
Výchozí předvolby
Chcete-li nastavit výchozí hodnotu předvolby (tj. hodnotu nastavenou pro nového uživatele, který si své předvolby ještě nepřizpůsobil), přidejte nastavení do globální proměnné $wgDefaultUserOptions . Použijte stejný název klíče, jaký používáte pro $preferences v háčku.
Případně, pokud píšete rozšíření, můžete přidat do sekce DefaultUserOptions souboru extensions.json.
Příklad od REL1_35
Viz: Manipulace s háčky v MediaWiki 1.35 a novější
extension.json
V extension.json
:
"Hooks": {
"GetPreferences": "main"
},
"HookHandlers": {
"main": {
"class": "MediaWiki\\Extension\\ExampleExtension\\Hooks",
"services": [
"MainConfig",
"UserOptionsLookup"
]
}
},
"AutoloadClasses": {
"MediaWiki\\Extension\\ExampleExtension\\Hooks": "includes/Hooks.php",
},
"config": {
"PersonalSettingsEnabledPageId": {
"type": "boolean",
"value": false
},
"PersonalSettingsNumberOfMostViewedPages": {
"type": "int",
"value": 50
},
"PersonalSettingsPeriodForLastViewedPages": {
"type": "string",
"value": "year"
}
},
"manifest_version": 2
Hooks.json
V includes/Hooks.php
:
namespace MediaWiki\Extension\ExampleExtension;
use MediaWiki\Preferences\Hook\GetPreferencesHook;
use GlobalVarConfig;
use MediaWiki\MediaWikiServices;
use MediaWiki\User\UserOptionsLookup;
class Hooks implements GetPreferencesHook {
private GlobalVarConfig $config;
private UserOptionsLookup $userOptionsLookup;
public function __construct(
GlobalVarConfig $config,
UserOptionsLookup $userOptionsLookup
) {
$this->config = $config;
$this->userOptionsLookup = $userOptionsLookup;
}
public function onGetPreferences( $user, &$preferences ) {
$your_new_extensions_section = 'exampleextension';
// A checkbox
$preferences_key = 'hitcounters-pageid';
$preferences_default = $this->userOptionsLookup->getOption(
$user,
$preferences_key,
$this->config->get( 'PersonalSettingsEnabledPageId' ) );
$preferences[$preferences_key] = [
'type' => 'toggle',
'label-message' => 'hitcounters-pageid-label',
'default' => $preferences_default,
'section' => $your_new_extensions_section
];
// An int input box
$preferences_key = 'hitcounters-numberofmostviewedpages';
$preferences_default = $this->userOptionsLookup->getOption(
$user,
$preferences_key,
$this->config->get( 'PersonalSettingsNumberOfMostViewedPages' ) );
$preferences[$preferences_key] = [
'type' => 'int',
'help-message' => 'hitcounters-numberofmostviewedpages-help',
'label-message' => 'hitcounters-numberofmostviewedpages-label',
'maxLength' => 4,
'default' => $preferences_default,
'section' => $your_new_extensions_section
];
// A select box
$ctx = RequestContext::getMain();
$preferences_key = 'hitcounters-periodforlastviewedpages';
$key_base = 'hitcounters-statistics-mostpopular';
// Ensure that 'default' is always the 1st array item
$preferences_default = $period = $this->config->get( 'PersonalSettingsPeriodForLastViewedPages' );
$itemDisplayName = $ctx->msg( "$key_base-$period" )->text();
$itemArray = [ $itemDisplayName => $period ];
$period = 'week';
$itemDisplayName = $ctx->msg( "$key_base-$period" )->text();
$itemArray[$itemDisplayName] = $period;
$period = 'month';
$itemDisplayName = $ctx->msg( "$key_base-$period" )->text();
$itemArray[$itemDisplayName] = $period;
$period = 'year';
$itemDisplayName = $ctx->msg( "$key_base-$period" )->text();
$itemArray[$itemDisplayName] = $period;
$usersItem = $this->userOptionsLookup->getOption(
$user,
$preferences_key,
$preferences_default );
$preferences[$preferences_key] = [
'type' => 'select',
'options' => $itemArray,
'default' => $usersItem,
'label-message' => "$preferences_key-label",
'section' => $your_new_extensions_section
];
// A set of radio buttons. Notice that in the 'options' array,
// the keys are the text (not system messages), and the values are the HTML values.
// They keys/values might be the opposite of what you expect. PHP's array_flip()
// can be helpful here.
$preferences_key = 'exampleextension-exampleselect';
$key_base = 'exampleextension-select';
$itemKey1 = 'choice1';
$itemName1 = $ctx->msg( "$key_base-$itemKey1" )->text();
$itemKey2 = 'choice2';
$itemName2 = $ctx->msg( "$key_base-$itemKey2" )->text();
$itemKey3 = 'choice3';
$itemName3 = $ctx->msg( "$key_base-$itemKey3" )->text();
// A 'default' key is required, ...
$preferences_default = $itemKey1;
// ..., but respect user's choice!
$usersItem = $this->userOptionsLookup->getOption(
$user,
$preferences_key,
$preferences_default );
$preferences[$preferences_key] = [
'type' => 'radio',
'help-message' => 'exampleextension-exampleselect-help', // a system message (optional)
'label-message' => 'exampleextension-exampleselect-label', // a system message
// Array of options. Key = text to display. Value = HTML <option> value.
'options' => [
$itemName1 => $itemKey1,
$itemName2 => $itemKey2,
$itemName3 => $itemKey3
],
'default' => $usersItem, // A 'default' key is required!
'section' => $your_new_extensions_section
];
}
<!-- [...] -->
}
i18n
V i18n/en.json
:
{
"exampleextension-select-help": "Put a help message here!",
"exampleextension-select-label": "Select an item:",
"exampleextension-select-choice1": "Pick me please",
"exampleextension-select-choice2": "No, pick me!",
"exampleextension-select-choice3": "Seriously, pick me right now",
"hitcounters-pageid-label": "Show page ID",
"hitcounters-numberofmostviewedpages-label": "Number of most viewed pages",
"hitcounters-periodforlastviewedpages-label": "Period for last viewed pages:",
"hitcounters-statistics-mostpopular-week": "Most viewed pages in the current week",
"hitcounters-statistics-mostpopular-month": "Most viewed pages in the current month",
"hitcounters-statistics-mostpopular-year": "Most viewed pages in the current year",
}
Příklad steré školy
extension.json
V extension.json
:
"Hooks": {
"GetPreferences": "ExampleExtensionHooks::onGetPreferences",
},
"AutoloadClasses": {
"ExampleExtensionHooks": "includes/Hooks.php",
},
"config": {
"PersonalSettingsEnabledPageId": false,
"PersonalSettingsNumberOfMostViewedPages": 50,
"PersonalSettingsPeriodForLastViewedPages": "year"
},
"manifest_version": 1
Hooks.json
V includes/Hooks.php
:
class ExampleExtensionHooks extends Hooks {
public static function onGetPreferences( $user, &$preferences ) {
global $wgPersonalSettingsEnabledPageId, $PersonalSettingsNumberOfMostViewedPages, $PersonalSettingsPeriodForLastViewedPages;
$your_new_extensions_section = 'exampleextension';
// A checkbox
$preferences_key = 'hitcounters-pageid';
$preferences_default = $this->userOptionsLookup->getOption(
$user,
$preferences_key,
$wgPersonalSettingsEnabledPageId );
$preferences[$preferences_key] = [
'type' => 'toggle',
'label-message' => 'hitcounters-pageid-label',
'default' => $preferences_default,
'section' => $your_new_extensions_section
];
// An int input box
$preferences_key = 'hitcounters-numberofmostviewedpages';
$preferences_default = $this->userOptionsLookup->getOption(
$user,
$preferences_key,
$PersonalSettingsNumberOfMostViewedPages );
$preferences[$preferences_key] = [
'type' => 'int',
'help-message' => 'hitcounters-numberofmostviewedpages-help',
'label-message' => 'hitcounters-numberofmostviewedpages-label',
'maxLength' => 4,
'default' => $preferences_default,
'section' => $your_new_extensions_section
];
// A select box
$ctx = RequestContext::getMain();
$preferences_key = 'hitcounters-periodforlastviewedpages';
$key_base = 'hitcounters-statistics-mostpopular';
// Ensure that 'default' is always the 1st array item
$preferences_default = $period = $PersonalSettingsPeriodForLastViewedPages;
$itemDisplayName = $ctx->msg( "$key_base-$period" )->text();
$itemArray = [ $itemDisplayName => $period ];
$period = 'week';
$itemDisplayName = $ctx->msg( "$key_base-$period" )->text();
$itemArray[$itemDisplayName] = $period;
$period = 'month';
$itemDisplayName = $ctx->msg( "$key_base-$period" )->text();
$itemArray[$itemDisplayName] = $period;
$period = 'year';
$itemDisplayName = $ctx->msg( "$key_base-$period" )->text();
$itemArray[$itemDisplayName] = $period;
$usersItem = $this->userOptionsLookup->getOption(
$user,
$preferences_key,
$preferences_default );
$preferences[$preferences_key] = [
'type' => 'select',
'options' => $itemArray,
'default' => $usersItem,
'label-message' => "$preferences_key-label",
'section' => $your_new_extensions_section
];
// A set of radio buttons. Notice that in the 'options' array,
// the keys are the text (not system messages), and the values are the HTML values.
// They keys/values might be the opposite of what you expect. PHP's array_flip()
// can be helpful here.
$preferences_key = 'exampleextension-exampleselect';
$key_base = 'exampleextension-select';
$itemKey1 = 'choice1';
$itemName1 = $ctx->msg( "$key_base-$itemKey1" )->text();
$itemKey2 = 'choice2';
$itemName2 = $ctx->msg( "$key_base-$itemKey2" )->text();
$itemKey3 = 'choice3';
$itemName3 = $ctx->msg( "$key_base-$itemKey3" )->text();
// A 'default' key is required, ...
$preferences_default = $itemKey1;
// ..., but respect user's choice!
$usersItem = $this->userOptionsLookup->getOption(
$user,
$preferences_key,
$preferences_default );
$preferences[$preferences_key] = [
'type' => 'radio',
'help-message' => 'exampleextension-exampleselect-help', // a system message (optional)
'label-message' => 'exampleextension-exampleselect-label', // a system message
// Array of options. Key = text to display. Value = HTML <option> value.
'options' => [
$itemName1 => $itemKey1,
$itemName2 => $itemKey2,
$itemName3 => $itemKey3
],
'default' => $usersItem, // A 'default' key is required!
'section' => $your_new_extensions_section
];
}
<!-- [...] -->
}
i18n
V i18n/en.json
:
{
"exampleextension-select-help": "Put a help message here!",
"exampleextension-select-label": "Select an item:",
"exampleextension-select-choice1": "Pick me please",
"exampleextension-select-choice2": "No, pick me!",
"exampleextension-select-choice3": "Seriously, pick me right now",
"hitcounters-pageid-label": "Show page ID",
"hitcounters-numberofmostviewedpages-label": "Number of most viewed pages",
"hitcounters-periodforlastviewedpages-label": "Period for last viewed pages:",
"hitcounters-statistics-mostpopular-week": "Most viewed pages in the current week",
"hitcounters-statistics-mostpopular-month": "Most viewed pages in the current month",
"hitcounters-statistics-mostpopular-year": "Most viewed pages in the current year",
}