Jump to content
MediaWiki

Příručka:Hooks/GetPreferences

From mediawiki.org
This page is a translated version of the page Manual:Hooks/GetPreferences and the translation is 100% complete.
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.

Všimněte si, že byste neměli používat '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",
}

AltStyle によって変換されたページ (->オリジナル) /