Příručka:Speciální stránky

This page is a translated version of the page Manual:Special pages and the translation is 100% complete.
MediaWiki extensions

Speciální stránky jsou stránky, které generuje systém až v okamžiku zavolání, obvykle za účelem vykonání určité specifické funkce.

Taková speciální stránka může vygenerovat třeba seznam všech stránek, na kterých se nachází minimálně jeden odkaz na externí webovou stránku, nebo nabízet formulář, jehož prostřednictvím mohou uživatelé poskytovat zpětnou vazbu.

Speciální stránky mají svůj vlastní jmenný prostor (Special:) a na rozdíl od ostatních stránek je nelze editovat. Nové speciální stránky mohou vytvářet pouze Vývojáři .

Tyto stránky jsou ve výchozím nastavení přístupné uživatelům a obecně se zobrazí v seznamu všech speciálních stránek na Special:SpecialPages. Některé speciální stránky jsou dostupné jen uživatelům s odpovídajícím oprávněním. Některé speciální stránky se v tomto přehledu nezobrazují vůbec, protože s nimi pracuje interně sama wiki.

Obecné informace

Všechny vestavěné speciální stránky, které přicházejí s MediaWiki, se nazývají SpecialSomename.php a jsou umístěny v adresáři includes/specials. Základní speciální stránky musí být zaregistrovány v základním seznamu umístěném v includes/specialpage/SpecialPageFactory.php, aby je MediaWiki načetla. Speciální stránky vytvořené vývojáři třetích stran jsou obecně uloženy v adresáři extensions v jejich vlastním souboru nebo jako součást většího rozšíření. Všechny speciální stránky dědí z třídy s názvem SpecialPage, která je definována v includes/specialpage/SpecialPage.php. Při vytvoření nové speciální stránky lze definovat uživatelská práva potřebná pro přístup na stránku. Tato práva mimo jiné určují, zda se stránka zobrazí na Special:SpecialPages a zda je stránka zahrnuta do jiných stránek.

Speciální stránky mají také jedinečné názvy, které lze na wiki upravit. Obecná forma je "Special:Název stránky", kde lze přizpůsobit "Special" i "Název stránky". Speciální pseudo namespace lze přeložit do jiných jazyků. Tento přeložený jmenný prostor lze vytvořit pomocí wikitextu {{ns:special}}, na této wiki vkládá "Special". Jméno speciální stránky lze také předefinovat v systémové zprávě pro jazyk webu s obecným názvem speciální stránky jako ID.

Speciální stránka může nebo nemusí umožňovat vstup. Například Special:Export umožňuje uživateli definovat konkrétní stránku k exportu voláním Special:Export/Sun. Pokud speciální stránka umožňuje komplexní vstup, budou další parametry odeslány v řetězci dotazu složky URL ke zpracování, např. https://www.mediawiki.org/w/index.php?title=Special:Recentchanges&days=3&limit=250.

Základní šablona speciální stránky

Většina speciálních rozšíření stránek vyžaduje tři soubory:

  • Malý instalační soubor, který se načte při každém spuštění MediaWiki.
  • Soubor s většinou kódu.
  • Lokalizační soubor.

Konvence kódování MediaWiki definují tři soubory takto:

  • MyExtension/extension.json - Instalační soubor.
  • MyExtension/includes/Special.php - Speciální kód stránky.
  • i18n/*.json - localisation file .

Umístěte všechny soubory do nového adresáře v adresáři extensions/ MediaWiki.

Zvláštní stránkovací soubor byste měli pojmenovat podle přípony. Například Rozšíření:Gadgets obsahuje soubor SpecialGadgets.php. Pokud vaše rozšíření používá více než jednu speciální stránku, budete potřebovat více názvů.

V níže uvedeném příkladu je název speciální stránky MyExtension.

Po vytvoření souborů uvedených níže přidáním následujícího řádku do LocalSettings.php povolíte rozšíření:

wfLoadExtension( 'MyExtension' );

Instalační soubor

Příklad instalačního souboru pro MyExtension/extension.json:

{
	"name": "MyExtension",
	"version": "0.0.0",
	"author": [
		"Your Name"
	],
	"url": "https://www.mediawiki.org/wiki/Extension:MyExtension",
	"descriptionmsg": "myextension-desc",
	"license-name": "MIT",
	"type": "other",
	"AutoloadNamespaces": {
		"MediaWiki\\Extension\\MyExtension\\": "src/"
	},
	"SpecialPages": {
		"MyExtension": "MediaWiki\\Extension\\MyExtension\\Special"
	},
	"MessagesDirs": {
		"MyExtension": [
			"i18n"
		]
	},
	"manifest_version": 2,
	"requires": {
		"MediaWiki": ">= 1.40.0",
		"platform": {
			"php": ">= 5.6"
		},
		"extensions": {
			"dependendExtension": "*"
		}
	}
}

Tento soubor registruje několik důležitých a povinných věcí:

  • Umístění třídy MediaWiki\Extension\MyExtension\Special.
  • Umístění lokalizačních souborů.
  • Novou speciální stránku a její název třídy.
If you get the error InvalidArgumentException: Provided specification is not an array, it generally means that MediaWiki could not find the class specified in extension.json that implements your special page.

Soubor speciální stránky

Soubor skupiny (MyExtension/src/Special.php) by měl obsahovat podtřídu SpecialPage nebo jednu z jejích podtříd. Tento soubor se načte automaticky, když někdo požádá o speciální stránku. Níže uvedený příklad implementuje podtřídu SpecialMyExtension.

Potřebujete konstruktor __construct(), protože jeho první parametr pojmenovává vaši speciální stránku.

execute() je hlavní funkce volaná při přístupu na speciální stránku. Tato funkce přepíše funkci SpecialPage::execute(). Předá jediný parametr $par, komponentu podstránky aktuálního titulku. Pokud například někdo následuje odkaz na Special:MyExtension/blah, $par obsahuje "blah".

Wikitext a výstup HTML byste měli spustit přes $wgOut. Nepoužívejte 'print' nebo 'echo' přímo při práci v uživatelském rozhraní wiki.

Pokud však svou speciální stránku používáte jako přístupový bod k vlastnímu XML nebo binárnímu výstupu, podívejte se na stránku Taking over output in your special page .

<?php
namespace MediaWiki\Extension\MyExtension;
class SpecialMyExtension extends \SpecialPage {
	public function __construct() {
		parent::__construct( 'MyExtension' );
	}

	public function execute( $par ) {
		$request = $this->getRequest();
		$output = $this->getOutput();
		$this->setHeaders();

		# Získejte data požadavku např.
		$param = $request->getText( 'param' );

		# Udělejte
		# ...
		$wikitext = 'Hello world!';
		$output->addWikiTextAsInterface( $wikitext );
	}
}

Lokalizační soubor

Podívejte se na stránku Nápověda:Systémové zprávy , jak jej přeložit.

Všechny speciální stránky mají název, například 'My Extension'.

  • Název se používá v prvcích ‎<title> a ‎<h1> na stránce rozšíření a na Special:SpecialPages.
  • Může to být cokoliv, ale mělo by to popisovat speciální stránku a rozšíření.
  • Je specifikováno prostřednictvím zprávy. Struktura zprávy je pár klíč-hodnota. Klíč, 'myextension', musí být psán malými písmeny.

Příklad lokalizačního souboru v MyExtension/i18n/en.json:

{
	"@metadata": {
		"authors": [
			"<your username>"
		]
	},
	"myextension": "My Extension",
	"myextension-desc": "Adds the MyExtension functionality.",
	"myextension-summary": "On this special page, do this simple thing and earn wonders.",
	"group-myextensionrole": "Role of myextension",
	"group-myextensionrole-member": "Member of role of myextension",
	"grouppage-myextensionrole": "{{ns:project}}:Role of myextension",
	"action-myextension": "XYZ doing.",
	"right-myextension": "to do xyz"
}

V dokumentaci ke zprávě i18n/qqq.json:

{
	"@metadata": {
		"authors": [
			"<your username>"
		]
	},
	"myextension": "The name of the extension's entry in Special:SpecialPages",
	"myextension-desc": "{{desc}}",
	"myextension-summary": "Description appearing on top of Special:MyExtension.",
	"action-myextension": "{{doc-action|myextension}}",
	"right-myextension": "{{doc-right|myextension}}"
}

Všimněte si, že ID by neměla začínat velkým písmenem a že mezera v ID by měla být zapsána v kódu jako podtržítko.

Zpráva -summary je volitelná. Je vytvořen automaticky nadřazenou třídou a zobrazen v horní části speciální stránky, obvykle pro stručný popis toho, co na něm může uživatel dělat. Pokud nedefinujete jeho obsah, bude použit pouze tehdy, když jej administrátoři wiki přizpůsobí na wiki.

Soubor aliasů

Můžete také internacionalizovat název speciální stránky vytvořením aliasů. Níže uvedený příklad používá soubor "MyExtension.i18n.alias.php". V tomto příkladu speciální stránka MyExtension registruje alias, takže stránka bude přístupná na .../Special:My Extension a .../Spezial:Meine_Erweiterung v němčině.

Přidejte svůj soubor aliasu do extension.json:

...
	"ExtensionMessagesFiles": {
		"MyExtensionAlias": "MyExtension.i18n.alias.php"
	},
...

Přidat speciální aliasy stránky do MyExtension.i18n.alias.php:

<?php
/**
 * Aliases for myextension
 *
 * @file
 * @ingroup Extensions
 */

$specialPageAliases = [];

/** English
 * @author <vaše uživatelské jméno>
 */
$specialPageAliases['en'] = [
	'MyExtension' => [ 'MyExtension', 'My Extension' ],
];

/** Deutsch
 * @author <vaše uživatelské jméno>
 */
$specialPageAliases['de'] = [
	'MyExtension' => [ 'MeineErweiterung', 'Meine Erweiterung' ],
];

Opět byste měli do ID napsat mezeru a do kódu podtržítko.

Pro záhlaví stránky a propojení platí obvyklá pravidla pro názvy stránek.

Pokud má $wgCapitalLinks hodnotu true, malé písmeno se převede na velké a podtržítko se zobrazí jako mezera.

Například místo výše uvedeného bychom mohli použít 'my_extension' => 'My extension', za předpokladu, že jsme jinde konzistentně identifikovali rozšíření jako my_extension.

Všimněte si, že v asociativním poli pro anglický jazyk je řetězec identifikující naši SpecialPage (v příkladu MyExtension) také platným názvem.

Všimněte si také, že první prvek $specialPageAliases['en']['MyExtension'] musí být stejný jako klíč ('MyExtension')! Jinak Special:Specialpages stránku nevypíše.

Skupina speciální stránky

Můžete nastavit, pod kterou skupinou se vaše speciální stránka objeví na Special:SpecialPages přepsáním SpecialPage::getGroupName() ve vaší podtřídě.

    /**
     * Přepsáním nadřazeného prvku nastavte, kde se speciální stránka zobrazí na Special:SpecialPages
     * 'jiné' je výchozí. Pokud to chcete, nemusíte přepisovat.
     * Zadejte 'media', chcete-li použít <code>specialpages-group-media</code> systémovou zprávu rozhraní, která se v angličtině překládá jako 'Media reports and uploads';
     * 
     * @return string
     */
    function getGroupName() {
        return 'media';
    }

Některé běžné hodnoty jsou 'login', 'maintenance', 'media', 'other', 'pagetools', 'redirects', 'users'. Přijímané hodnoty můžete vidět na Special:AllMessages (hledejte specialpages-group) nebo procházet wiki pomocí pseudojazyka 'qqx' na Special:SpecialPages?uselang=qqx) a dívat se na nadpisy. Chcete-li použít zprávu rozhraní 'specialpages-group-media', zadejte slovo 'media'.

Pokud se vaše speciální stránka nevejde do žádného z předkonfigurovaných nadpisů, můžete přidat nový nadpis jeho přidáním do svého lokalizačního souboru, viz Lokalizační soubor).

Standardní skupiny stránek dodávané s MediaWiki jsou uvedeny v lokalizačním souboru. Například anglické zprávy jsou v languages/i18n/en.json a začínají specialpages-group-. Pokud chcete svou speciální stránku zařadit do kategorie users, pak je zpráva specialpages-group-users. Hodnota tohoto klíče je text, který se zobrazuje jako název dané kategorie, například Users and rights.

Pokud se vám zdá, že vaše speciální stránka nespadá do žádné ze stávajících kategorií, můžete vždy vytvořit novou. Do lokalizačního souboru vašeho rozšíření jednoduše vložte nový klíč pro pole messages. V tomto příkladu definujeme skupinu gamification:

{
    "myextension": "My Extension",
	"myextension-desc": "Adds the MyExtension functionality.",
	"myextension-summary": "On this special page, do this simple thing and earn wonders",
	"specialpages-group-gamification": "Gamification"
}

Nyní, za předpokladu, že jste v definici třídy nastavili návratovou hodnotu pro metodu SpecialPage::getGroupName() jako gamification, znovu načtěte Special:SpecialPages, abyste viděli svou novou kategorii.

Další důležité soubory

SpecialPage.php

Konstruktor

Můžete předáním konstruktoru inicializovat svá vlastní data, ale hlavním důvodem, proč byste to chtěli udělat, je změnit chování samotné třídy SpecialPage. Když zavoláte konstruktor základní třídy z vaší podřízené třídy, jsou k dispozici následující parametry:

function __construct( $name = '', $restriction = '', $listed = true );
  • string $name název speciální stránky, jak je vidět v odkazech a adresách URL
  • string $restriction uživatelské právo vyžaduje, např. "block" (blokovat) nebo "delete" (smazat); viz také Omezení přístupu na stránku
  • boolean $listed zda je stránka uvedena ve Special:Specialpages

SpecialPage->setHeaders()

Tím se inicializuje objekt OutputPage $wgOut s názvem a popisem vaší speciální stránky. Mělo by být vždy voláno z vaší metody execute().

SpecialPage->getOutput()

Tato metoda vrací objekt OutputPage, ke kterému lze přistupovat, jak je popsáno níže. Stejně jako v příkladu kódu použijte

$output = $this->getOutput();
$output->addWikiTextAsInterface( 'Hello, World' );

namísto zastaralé globální proměnné $wgOut

SpecialPage->getRequest()

Tato metoda vrací objekt WebRequest, ke kterému lze přistupovat, jak je popsáno níže. Stejně jako v příkladu kódu použijte

$request = $this->getRequest();
$myparam = $request->getText( 'myparam' );

namísto zastaralé globální proměnné $wgRequest

SpecialPage->including()

Některé speciální stránky lze zahrnout z jiné stránky. Pokud například přidáte {{Special:RecentChanges}} do wikitextu stránky, vloží se seznam posledních změn do stávajícího obsahu stránky.

Zahrnutí speciální stránky z jiné webové stránky je možné pouze v případě, že jste stránku prohlásili za zahrnutou ve konstruktoru. Můžete to udělat přidáním následujícího do metody __construct() po inicializaci nadřazené třídy:

$this->mIncludable = true;

Můžete také definovat svou speciální třídu stránky jako rozšíření třídy IncludableSpecialPage.

Funkce SpecialPage->včetně() vrací booleovskou hodnotu, která vám říká, z jakého kontextu je speciální stránka volána: False, pokud se jedná o samostatnou webovou stránku, a true, pokud je zahrnuta z jiné webové stránky. Obvykle budete chtít prezentaci poněkud zmenšit, pokud je zahrnuta stránka.

SpecialPage->execute()

Toto je funkce, kterou by vaše třída měla předat. Předává jeden parametr, obvykle označovaný krypticky jako $par (zkratka pro $parameter, protože je to parametr, který mohou uživatelé vložit na vaši speciální stránku). Tento parametr je součástí podstránky aktuálního titulu. Pokud například někdo následuje odkaz na Special:MyExtension/blah, $par bude obsahovat "blah".

Nápověda
Verze MediaWiki:
1.25

Je užitečné přidat stránky nápovědy na MediaWiki.org, kde budou přeložitelné. Chcete-li zajistit, aby uživatelé nalezli vaši stránku nápovědy, je vhodné a velmi jednoduché, aby vaše speciální stránka odkazovala na příslušnou stránku nápovědy:

$this->addHelpLink( 'Help:Extension:MyExtension' );

OutputPage.php

OutputPage.php obsahuje definici třídy pro objekty typu OutputPage. OutputPage.php obsahuje definici třídy pro objekty typu $OutputPage.

$output = $this->getOutput();

Název proměnné $output je samozřejmě libovolný. Ať už to nazýváte jakkoli, toto je proměnná, kterou budete používat nejvíce, protože je to způsob, jak odeslat výstup do prohlížeče (ne, nepoužíváte echo nebo print). Pokud ji chcete někde použít, deklarujte proměnnou global:

function randomFunction() {
        $output = $this->getOutput();
	$output->addHTML( '<b>This is not a pipe...</b>' );
}

Pokud chcete, můžete v rozšíření SpecialPage vytvořit různými metodami více objektů OutputPage. Přidají se k výstupu v pořadí, v jakém jsou prováděny.

Třídu OutputPage můžete zkontrolovat zobrazením includes/OutputPage.php (ve skutečnosti lze zkontrolovat všechny), ale existuje několik metod, o kterých byste měli určitě vědět.

OutputPage->addHTML()

V podstatě rychlá a nečistá náhrada za echo. Vezme váš vstup a přidá ho do vyrovnávací paměti: Žádné otázky. V níže uvedené akci, pokud $action obsahuje uživatelská data, může snadno vložit XSS, špatné věci nebo spawn Satan. Pro vytvoření důvěryhodného výstupu je lepší použít escapování (například pomocí funkce php htmlentities) nebo třídu XML builders.

$output->addHTML( '<form action="'.$action.'" method="post">' );

OutputPage->addWikiText()

Pro většinu výstupu byste měli používat tuto funkci. Je to trochu funkce černé magie: Wikitext vstupuje, vychází HTML a mezi tím se odehrává spousta tajemných kódů a vyvolávání démonů.

$output->addWikiText("This is some ''lovely'' [[wikitext]] that will '''get''' parsed nicely.");

Co stojí za zmínku, je to, že analyzátor bude vaše kousky považovat za soudržné celky a svým způsobem za odstavec. To je...

$output->addWikiText( '* Item 1' );
$output->addWikiText( '* Item 2' );
$output->addWikiText( '* Item 3' );

Vypíše tři seznamy s jednou položkou, což pravděpodobně nebylo zamýšleno.

  Varování: Pokud má být vaše speciální stránka zahrnuta do jiných stránek, pravděpodobně byste neměli používat addWikiText() (nebo jakoukoli jinou funkci, která volá analyzátor, kromě funkcí souvisejících se zprávami, které analyzují ($this->msg()), které lze volat na moderních verzích MediaWiki) . Kvůli chybě v MediaWiki (phab:T18129) zahrnutá speciální stránka zkazí jakékoli zahrnutí před ní na stejné včetně stránky a zobrazí řetězce jako UNIQ10842e596cbb71da.

Pokud však chcete pouze vložit systémovou zprávu aby s ní bylo zacházeno jako s analyzovaným wikitextem, můžete použít kód jako $this->getOutput()->addHtml( $this->msg( 'key-of-message' )->parse() ). To nebude mít problém s vnořenými voláními analyzátoru uvedenými výše.

řešení č. 1

Důležité: Tato řešení jsou potřeba pouze v případě, že vytváříte speciální stránku, kterou lze převést. Běžné speciální stránky je nepotřebují.

Jako náhradní řešení můžete nechat svá rozšíření převést Wikitextem do HTML pomocí samostatného objektu Parser a poté použít addHTML(). Příklad:

$wgOut->addHTML( $this->sandboxParse( "Here's some '''formatted''' text." ) );
# Za předpokladu, že je to uvnitř stejné třídy jako zbytek kódu vaší speciální stránky
function sandboxParse( $wikiText ) {
	$myParser = new Parser();
        $user = $this->getUser();
        $title = self::getTitleFor('YourCanonicalSpecialPageName');
	$myParserOptions = ParserOptions::newFromUser( $user );
	$result = $myParser->parse( $wikiText, $title, $myParserOptions );
	return $result->getText();
}

řešení č. 2

Vyzkoušel jsem výše uvedené a zjistil jsem, že stejný problém se nyní vztahuje na všechny značky v transkludovaném textu. U spousty rozšíření to nebude problém, ale rozšíření, které jsem psal, mělo v rámci své funkčnosti zobrazovat wikitext z jiné stránky, takže to byl problém.

Proces analýzy stránky, která převádí speciální stránku, vypadá takto:

  1. Nahraďte {{Special:MyExtension}} značkou UNIQ-QINU (protože se očekává, že výstup SpecialPage bude připravený k výstupu HTML).
  2. Nahraďte všechny štítky za značky QINU, jak je uvedeno výše.
  3. Analyzujte vše ostatní od wikitextu po HTML.
  4. Nahraďte všechny značky QINU jejich příslušnými uloženými hodnotami v jediném průchodu.

Proces analýzy stránky, která převádí ne-speciální stránku, je však zřejmě tento:

  1. Nahraďte {{:Normal Article Name}} nebo {{Template Name}} obsahem transkludované stránky (protože transkludované stránky obsahují neanalyzovaný wikitext).
  2. Nahraďte všechny štítky za značky QINU, jak je uvedeno výše.
  3. Analyzujte vše ostatní od wikitextu po HTML.
  4. Nahraďte všechny značky QINU jejich příslušnými uloženými hodnotami v jediném průchodu.

Problém je zřejmě v tom, že v předchozím případě postrádá analýza textu wiki na SpecialPage poslední krok dekódování QINU (proč?), takže všechny značky QINU zůstávají nedekódované. (Může to být pozůstatek z použití stejné syntaxe k vyvolání transkluze stránky wikitextu, která se pouze vloží přímo do obsahu wikitextu hostitelské stránky a analyzuje, jak se používá k vyvolání transkluze speciální stránky, která nesmí být analyzována vůbec. Kdekoli je kód, který rozhodne "počkej, toto je speciální stránka -- nahraď ji QINU", měl by před provedením nahrazení QINU provést extra unstripGeneral.)


Takže jsem udělal následující -- po tomto řádku:

$htOut = $wgParser->recursiveTagParse( $iText );

...Přidal jsem tyto řádky (druhý je pouze proto, že to definice funkce pro první doporučuje):

$htOut = $wgParser->mStripState->unstripGeneral( $htOut );
$htOut = $wgParser->mStripState->unstripNoWiki( $htOut );

Protože jsem to nyní zdokumentoval, samozřejmě na tom nyní najdu tragickou chybu a budu se cítit opravdu hloupě... ale dokud to vypadá, že to funguje, musel jsem to zde poznamenat. (Je také důležité upozornit na problém s řešením č. 1.) Také jsem to testoval pouze s MediaWiki 1.10.1. Problém stále existuje pod MW 1.14, ale toto řešení může nebo nemusí fungovat. --Woozle 18:26, 9 April 2009 (UTC)

OutputPage->showErrorPage()

Zobrazí se chybová stránka. Argumenty $title a $msg specifikují klíče do $this->msg(), nikoli text. Například:

$output->showErrorPage( 'error', 'badarticleerror' );
  • 'error' odkazuje na text "Chyba".
  • 'badarticleerror' odkazuje na text "Tuto činnost nelze na této stránce provést.".

Můžete také určit objekty zpráv nebo přidat parametry:

$output->showErrorPage( 'error', 'badarticleerror', [ 'param1', 'param2' ] );
$messageObject = new Message(...);
...
$output->showErrorPage( 'error', $messageObject );
$titleMessageObject = new Message(...);
$messageObject = new Message(...);
...
$output->showErrorPage( $titleMessageObject, $messageObject );

WebRequest.php

Třída WebRequest se používá k získávání informací z polí GET a POST. Použití tohoto se doporučuje přes přímý přístup k superglobálům. Objekt WebRequest je přístupný z rozšíření pomocí RequestContext .

Database.php

MediaWiki má spoustu užitečných funkcí a návrhů pro interakci s databází pomocí třídy \Wikimedia\Rdbms\Database. Má také zajímavé schéma vyvažování zátěže. Doporučuje se tyto návrhy používat. Podívejte se na Database.php , kde najdete úplný seznam všech vhodných funkcí, protože tyto dokumenty vám řeknou pouze o neviditelných upozorněních. Viz Příručka:Přístup k databázi .

User.php

Třída User se používá k reprezentaci uživatelů v systému. SpecialPage->getUser() by měl být použit k získání User objektu pro aktuálně přihlášeného uživatele. Používání globálního $wgUser je zastaralé

Title.php

Title představuje název stránky na wiki. To je užitečné, protože MediaWiki dělá všechny druhy escapování a speciální logiku pro názvy stránek, takže místo převádění vlastní funkce převodu názvu na URL vytvoříte objekt Title s názvem vaší stránky a poté použijete getLocalURL() k získání URL na tuto stránku.

Chcete-li získat objekt title pro vaši speciální stránku mimo třídu speciálních stránek, můžete použít SpecialPage::getTitleFor( 'YourCanonicalSpecialPageName' ). Poskytne vám lokalizovaný název v jazyce wiki.

Vlastní speciální stránky

Existují různé způsoby, jak poskytnout své vlastní speciální stránky, které nejsou součástí MediaWiki:

  • Jednou z metod je instalace rozšíření, které vygeneruje formulář pro vytvoření nebo úpravu článku. Seznam aktuálně dostupných rozšíření naleznete na stránce Kategorie:Rozšíření, která používají speciální stránky .
  • Můžete také napsat rozšíření, které poskytne vaši vlastní speciální stránku. Psaní vlastního rozšíření vyžaduje dovednost kódování PHP a zkušenosti s objektově orientovaným návrhem a databázemi. Budete také potřebovat vědět, jak používat kód k vytváření a úpravám článků MediaWiki. Další informace naleznete v této diskusi.
  • Můžete také zobrazit vlastní stránku prostřednictvím JavaScriptu místo výchozí chybové zprávy "Unknown special page" (neznámá speciální stránka) (nebo zprávy "This page is intentionally left blank." (tato stránka je záměrně ponechána prázdná), pokud používáte podstránku Special:BlankPage). V MediaWiki:Common.js vyhledejte wgPageName , poté skryjte obsah vygenerovaný MediaWiki (stačí appendCSS {visibility:hidden;} ) a vložte vlastní HTML (innerHTML) do document.getElementById('bodyContent') nebo document.getElementById('mw_contentholder'). Příklad viz meta:User:Krinkle/Tools/Real-Time Recent Changes.

FAQ

Nastavení názvu rozšíření

MediaWiki nenastavuje název rozšíření, což je práce vývojáře. Při volání Special:Specialpages nebo načtení speciální stránky bude hledat název rozšíření. V sekci function execute( $par ) použijte metody OutputPage k pojmenování rozšíření jako: $this->getOutput()->setPageTitle("your title");

Místo, kde lze rozšíření nalézt (jak je specifikováno tím, co je předáno do konstruktoru SpecialPage), je klíč --kromě, že se neuvádí velkými písmeny kvůli getDescription(), interně používané funkci, která zjišťuje název (nebo, jak říkají, popis) speciální stránky, strtolower název. Klíč "ThisIsACoolSpecialPage" by byl "thisacoolspecialpage".

Teoreticky může být getDescription přepsán, aby se zabránilo interakci s mezipamětí zpráv, ale jak uvádí zdrojový kód: "Odvozené třídy to mohou přepsat, ale obvykle je jednodušší zachovat výchozí chování. Navíc to zabrání tomu, aby jmenný prostor MediaWiki přetížil zprávu, jak je uvedeno níže.

Lokalizace názvu rozšíření

Takže jste právě nainstalovali zbrusu nové rozšíření MediaWiki a uvědomte si: "Ach ne, moje wiki je ve francouzštině, ale stránka se zobrazuje v angličtině!" Většině lidí by to bylo jedno, ale ve skutečnosti je docela jednoduchý úkol to opravit (pokud vývojář použil metodu vysvětlenou na této stránce). Žádná nuda se zdrojovým kódem. Řekněme, že název stránky je DirtyPages a název je uveden jako "List of Dirty Pages", ale chcete, aby to bylo (a omluvte mou francouzštinu) "Liste de Pages Sales". No, je to tak jednoduché:

  1. Přejděte na MediaWiki:DirtyPages, tato stránka možná neexistuje, ale přesto ji upravte
  2. Vložte "Liste de Pages Sales" a uložte

A voilà (promiňte slovní hříčku), změna se použije.

To je také užitečné pro přizpůsobení názvu vaší wiki ve vašem jazyce: Vývojář ji například nazval "List of Dirty Pages", ale vám se tento název nelíbí, takže ji přejmenujete na "List of Pages needing Cleanup". Podívejte se na Special:Allmessages a dozvíte se více.

Pokud má vaše rozšíření velký blok textu, který se mění, například varování, nevydávejte text přímo. Místo toho jej přidejte do mezipaměti zpráv a až přijde čas na výstup textu ve vašem kódu, udělejte toto:

$wgOut->addWikiText( $this->msg( 'dirtypageshelp' ) );

Tuto zprávu lze také upravit na MediaWiki:Dirtypageshelp.

Viz také Nápověda:Systémové zprávy .

Omezení přístupu na stránku

Nezobrazujte svou speciální stránku na Special:SpecialPages

Někdy můžete chtít omezit viditelnost své speciální stránky tím, že ji odstraníte ze Special:SpecialPages a zpřístupníte ji pouze uživatelům s konkrétním právem. Můžete to udělat v konstruktoru předáním parametru $restriction. Např. "editinterface", právo standardně přiřazené pouze sysopům. Další dostupná uživatelská práva naleznete v Příručce uživatelských práv.

function __construct() {
	parent::__construct( 'MyExtension', 'editinterface' ); // omezit na sysopy
}

Nebo si můžete vytvořit své vlastní právo v souboru nastavení a přiřadit ho sysopům, např.:

"AvailableRights": [
	"myextension-right"
],
"GroupPermissions": {
	"sysop": {
		"myextension-right": true
	}
}

a poté zavolejte konstruktor svým právem:

function __construct() {
	parent::__construct( 'MyExtension', 'myextension-right' );
}

Zabraňte přístupu na vaši speciální stránku

I když svou stránku omezíte v konstruktoru, jak je uvedeno výše, bude stále viditelná přímo přes adresu URL, např. na Special:MySpecialPage. Abyste skutečně omezili přístup ke své SpecialPage, musíte zavolat $this->checkPermissions() v metodě execute.

Pokud potřebujete podrobnější kontrolu nad oprávněními, můžete přepsat $this->checkPermissions() anebo přidat jakoukoli kontrolu oprávnění, kterou vaše rozšíření vyžaduje.

Zakázání stránek Special:UserLogin a Special:UserLogout

V LocalSettings.php můžete použít SpecialPage_initList hook k deaktivaci nechtěných vestavěných speciálních stránek. Viz "omezování několika speciálních stránek", pokud potřebujete podmíněné zrušení nastavení speciálních stránek, například pro určité skupiny uživatelů. Obecná zpráva "You have requested an invalid special page" (požádali jste o neplatnou speciální stránku). Pokud se uživatelé pokusí o přístup k takto nenastaveným speciálním stránkám, zobrazí se.

$wgHooks['SpecialPage_initList'][] = function ( &$list ) {
	unset( $list['Userlogout'] );
	unset( $list['Userlogin'] );
	return true;
};

Jiným přístupem by bylo použití zpětného volání DisabledSpecialPage. Tento přístup může být preferován, pokud speciální stránku deaktivujete pouze "dočasně", protože výchozí zpráva by v tomto případě zněla: "Tato stránka byla vypnuta správcem systému." namísto předstírání, že stránka vůbec neexistuje. To jasně naznačuje, že stránka může být aktivována později.

$wgSpecialPages['Userlogout'] = DisabledSpecialPage::getCallback( 'Userlogout' );
$wgSpecialPages['Userlogin'] = DisabledSpecialPage::getCallback( 'Userlogin' );

Je také možné přidat vlastní dlouhé vysvětlení, proč deaktivujete speciální stránku, zadáním klíče zprávy jako druhého argumentu zpětného volání. Nejprve vytvořte systémovou zprávu "MediaWiki:Userlogout-disable-reason" a napište tam veškeré vysvětlení. Zpráva bude analyzována v blokovém formátu. Poté v LocalSettings.php přidejte:

$wgSpecialPages['Userlogout'] = DisabledSpecialPage::getCallback( 'Userlogout', 'Userlogout-disable-reason' );

Přidávání protokolů

V rámci MediaWiki se zaznamenávají veškeré akce uživatelů realizované v rámci wiki, neboť cílem je spolupráce a transparentnost. Podívejte se na stránku Příručka:Přihlášení do Special:Log jak se to dělá.

Změna skupin na Special:Specialpages

Pokud jste vývojář rozšíření, tak určitě máte implementovanou funkci getGroupName(), což je metoda popsaná na této stránce v sekci o názvu speciální stránky.

Od MediaWiki verze 1.21, může být výchozí jméno speciální stránky přepsáno pomocí systémové zprávy. Tahle funkcionalita má svůj význam především pro administrátory stránek nikoliv pro vývojáře rozšíření. Je pro to nutné vytvořit ve jmenném prostoru pro systémové zprávy stránku, jejíž název tvoří následující řetězec specialpages-specialpagegroup-<jméno speciální stránky> kde je místo řetězce <jméno speciální stránky> uvedeno, malými písmeny kanonické jméno speciální stránky. Konkrétně, pokud nechcete, aby se pro vaši jazykovou verzi zobrazoval výchozí překlad speciální stránky, musíte nejprve zjistit kanonické jméno této speciální stránky, které může být dejme tomu "Special:MyLittlePage". Pak máte dvě možnosti. Jednou z nich je vytvoření nové systémové zprávy. Nejprve si zvolíte nové kanonické jméno. Dejme tomu "MyLittleGroup", pak vytvoříte ve jmenném prostoru MediaWiki podle výše uvedeného schématu stránku "MediaWiki:Specialpages-specialpagegroup-mylittlepage", do níž napíšete zvolený řetězec nového kanonického jména, tedy "MyLittleGroup". "Special:MyLittlePage" se pak bude zobrazovat jako "MyLittleGroup", kterou pak lze lokalizovat přes systémovou zprávu "MediaWiki:Specialpages-group-mylittlegroup".
Druhá varianta pak je, podívat se na seznam speciálních stránek přes URL Special:SpecialPages&uselang=qqx, zjistit jak vypadá řetězec překládané systémové zprávy, a ten pak lokalizovat, jako ostatní systémové zprávy přes podstránku /cs

Zrušení zařazení stránky z Special:Specialpages

Chcete-li speciální stránku z Special:Specialpages úplně odstranit, předejte false jako třetí parametr nadřazenému konstruktoru SpecialPage, jak je popsáno v sekci Konstruktor SpecialPage této stránky. Pokud potřebujete složitější logiku k určení, zda má být stránka uvedena nebo ne, můžete také přepsat funkci isListed(), ale použití parametru konstruktoru je jednodušší.

Získání seznamu speciálních stránek a jejich aliasů na wiki

Jednoduše použijte modul API "siteinfo" k získání informací z wiki, jako je např. /api.php?action=query&meta=siteinfo&siprop=specialpagealiases.

Související odkazy

  • HTMLForm – Výukový program pro vytváření zaškrtávacích políček, textových oblastí, přepínačů atd. na speciálních stránkách