Manual:Páginas especiais
Páginas especiais são páginas que são criadas pelo software sob demanda para executar uma função específica.
Por exemplo, uma página especial pode mostrar todas as páginas que têm um ou mais links para um site externo ou pode criar um formulário que fornece feedback enviado pelo usuário.
As páginas especiais estão localizadas em seu próprio namespace (Especial:) e não são editáveis diretamente como outras páginas. Desenvolvedores também pode criar novas páginas especiais.
Essas páginas podem ser acessíveis ao usuário e geralmente aparecerão na lista de todas as páginas especiais em Special:SpecialPages. Algumas páginas especiais só são acessíveis aos usuários com determinadas permissões e acessos. Outras páginas especiais não aparecem na lista de páginas especiais e são usadas apenas pelo wiki internamente.
Informações Gerais
As páginas especiais integradas que vêm com o MediaWiki são chamadas de SpecialSomename.php
e estão localizadas na diretoria includes/specials
.
Páginas especiais centrais são registradas na lista central localizada em includes/specialpage/SpecialPageFactory.php
em ordem de carregamento pelo Mediawiki.
Páginas especiais são criadas por desenvolvedores terceiros são geralmente armazenadas no diretório extensions
(extensões) na raiz do seu servidor com seus arquivos para seu devido funcionamento.
Todas as páginas especiais herdam a classe de página especial e são declaradas na página de Páginas Especiais.
Quando uma nova página especial é criadas, os direitos do usuário são necessários para que esta seja definida.
Esses direitos específicos, entre outras coisas, se a página será mostrada em Special:SpecialPages (Páginas Especiais) e se a página será incluída em outras páginas.
As páginas especiais devem possuir nomes únicos que possam ser customizados na Wiki. De forma geral o "Especial:Nome da Página", onde "Especial" e "Nome da Página" podem ser customizavéis. O pseudo-namespace especial podem ser traduzido para outras línguas. This translated namespace can be produced with the wikitext {{ns:special}}, on this wiki giving "Special". O nome da página especial também pode ser redefinido em uma mensagem do sistema, para o idioma do site, com o nome genérico da página especial como o ID.
A special page may or may not allow input. For example, Special:Export allows a user to define a specific page to export by calling Special:Export/Sun. If the special page allows complex input, additional parameters will be sent to the query string component of the URL for processing, e.g. https://www.mediawiki.org/w/index.php?title=Special:Recentchanges&days=3&limit=250.
- There are various ways to make special pages, but the one below is used by the bulk of official extensions , and adherence to this style is recommended.
$wgExtensionCredits
for more details.
- After making a new special page, be sure to add it to Category:Special page extensions so other people can find it.
- Special pages cannot be included within frames unless you use
$wgOut->allowClickjacking();
Modelo básico de página especial
MediaWiki 1.25 introduced a new way to load an extension. For older unsupported versions of MediaWiki, see an older revision. |
Most special page extensions require three files:
- Small setup file, which loads every time MediaWiki starts.
- File with the bulk of the code.
- Localisation file
MediaWiki coding conventions define the three files like this:
MyExtension/extension.json
– The setup file.MyExtension/includes/Special.php
– The special page code.i18n/*.json
– The localisation file .
Place all of the files in a new directory inside your MediaWiki extensions/
directory.
You should name the special page file after the extension. For example, Extension:Gadgets contains the file SpecialGadgets.php
.
If your extension uses more than one special page, you'll need more names.
In the example below, the special page's name is MyExtension.
After creating the files listed below, adding the following line to LocalSettings.php enables the extension:
wfLoadExtension( 'MyExtension' );
The setup file
Example setup file for 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.41.0",
"platform": {
"php": ">= 5.6"
},
"extensions": {
"dependendExtension": "*"
}
}
}
This file registers several important and mandatory things:
- The location of the MediaWiki\Extension\MyExtension\Special class;
- The location of the localisation files;
- The new special page and its class name.
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.The special page file
The body file (MyExtension/src/Special.php
) should contain a subclass of SpecialPage
or one of its subclasses.
This file loads automatically when someone requests the special page.
The example below implements the subclass SpecialMyExtension.
You need the __construct()
constructor because its first parameter names your special page.
execute()
is the main function called when a special page is accessed.
This function overrides the function SpecialPage::execute()
.
It passes the single parameter $par
, the subpage component of the current title.
For example, if someone follows a link to Special:MyExtension/blah, $par
contains "blah".
You should run Wikitext and HTML output through $wgOut
. Do not use 'print' or 'echo' directly when working within the wiki's user interface.
However, if you use your special page as an access point to custom XML or binary output, see 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();
# Get request data from, e.g.
$param = $request->getText( 'param' );
# Do stuff
# ...
$wikitext = 'Hello world!';
$output->addWikiTextAsInterface( $wikitext );
}
}
The localisation file
- See Help:Mensagem do sistema for how to get them translated.
All special pages specify a title, like 'My Extension'
.
- The title is used in the
<title>
and<h1>
elements of the extension's page and on Special:SpecialPages.
- It can be anything, but should describe the special page and extension.
- It's specified through a message. The structure of the message is a key-value pair. The key,
'myextension'
, must be all lowercase.
An example of a localisation file in 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"
}
In i18n/qqq.json
, the message documentation:
{
"@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}}"
}
Note that IDs should not start with an uppercase letter, and that a space in the ID should be written in the code as an underscore.
The -summary
message is optional.
It's created automatically by the parent class and shown on top of the special page, usually for a concise description of what the user can do on it.
If you don't define its content, it will only be used when wiki administrators customize it on the wiki.
The aliases file
You can also internationalize the name of the special page by creating aliases for it. The example below uses the file "MyExtension.i18n.alias.php".
In this example, the special page MyExtension
registers an alias so the page becomes accessible at .../Special:My Extension
and .../Spezial:Meine_Erweiterung
in German.
Add your alias file to extension.json
:
...
"ExtensionMessagesFiles": {
"MyExtensionAlias": "MyExtension.i18n.alias.php"
},
...
Add special page aliases to MyExtension.i18n.alias.php
:
<?php
/**
* Aliases for myextension
*
* @file
* @ingroup Extensions
*/
$specialPageAliases = [];
/** English
* @author <seu nome de usuário>
*/
$specialPageAliases['en'] = [
'MyExtension' => [ 'MyExtension', 'My Extension' ],
];
/** Deutsch
* @author <seu nome de usuário>
*/
$specialPageAliases['de'] = [
'MyExtension' => [ 'MeineErweiterung', 'Meine Erweiterung' ],
];
Again, you should write a space in the ID and an underscore in the code.
Para o cabeçalho da página e links, as regras usuais para nomes de página se aplicam.
If $wgCapitalLinks
is true, a lowercase letter is converted to uppercase, and an underscore is displayed as a space.
For example, instead of the above, we could use 'my_extension' => 'My extension'
, assuming we consistently identified the extension as my_extension
elsewhere.
Note that in the associative array for the English language, the string identifying our SpecialPage (MyExtension
in the example) is also a valid title.
Also note, the first element of $specialPageAliases['en']['MyExtension']
must be the same as the key ('MyExtension'
)! Otherwise Special:Specialpages will not list the page.
Special page group
You can set which group your special page appears under on Special:SpecialPages by overriding SpecialPage::getGroupName()
in your subclass.
/**
* Override the parent to set where the special page appears on Special:SpecialPages
* 'other' is the default. If that's what you want, you do not need to override.
* Specify 'media' to use the <code>specialpages-group-media</code> system interface message, which translates to 'Media reports and uploads' in English;
*
* @return string
*/
function getGroupName() {
return 'media';
}
Some common values are 'login', 'maintenance', 'media', 'other', 'pagetools', 'redirects', 'users'. You can see the accepted values at Special:AllMessages (search for specialpages-group) or browse the wiki using the pseudo language 'qqx' by going to Special:SpecialPages?uselang=qqx) and looking at the headings. Specify the word 'media' to use the interface message 'specialpages-group-media'.
If your special page doesn't fit into any of the preconfigured headings, you can add a new heading by adding it to your localisation file, see The localisation file).
The standard page groups that come with MediaWiki are listed in the localisation file. For example, the English messages are in languages/i18n/en.json
and begin with specialpages-group-
.
If you want to categorize your special page under users
, then the message is specialpages-group-users
.
The value for this key is the text that appears as the name of that category, for example, Users and rights
.
If your special page does not seem to fit under any of the existing categories, you can always make a new one.
In your extension's localisation file simply insert a new key for the messages
array.
In this example, we define the gamification
group:
{
"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"
}
Now, assuming you set the return value for the method SpecialPage::getGroupName()
as gamification
in your class definition, reload Special:SpecialPages to see your new category.
Outros arquivos importantes
SpecialPage.php
Construtor
You can overload the constructor to initialize your own data, but the main reason you would want to do it is to change the behavior of the SpecialPage class itself. When you call the base class constructor from your child class, the following parameters are available:
function __construct( $name = '', $restriction = '', $listed = true );
- string
$name
Nome da página especial, conforme visto em links e URLs - string
$restriction
User right required, e.g. "block" or "delete"; also see Restricting page access - boolean
$listed
Whether the page is listed in Special:Specialpages
SpecialPage->setHeaders()
This initialises the OutputPage object $wgOut
with the name and description of your special page.
It should always be called from your execute()
method.
SpecialPage->getOutput()
This method returns an OutputPage object which can be accessed as described below. As in the example code, use
$output = $this->getOutput();
$output->addWikiTextAsInterface( 'Hello, World' );
instead of the deprecated $wgOut
global variable
SpecialPage->getRequest()
This method returns a WebRequest object which can be accessed as described below. As in the example code, use
$request = $this->getRequest();
$myparam = $request->getText( 'myparam' );
instead of the deprecated $wgRequest
global variable
SpecialPage->including()
Some special pages can be included from within another page. For example, if you add {{Special:RecentChanges}} to the wikitext of a page, it will insert a listing of recent changes within the existing content of the page.
Including a special page from another web page is only possible if you declared the page to be includable in the constructor.
You can do this by adding the following in the __construct()
method after the parent class initialization:
$this->mIncludable = true;
You can also define your special page class as extending the IncludableSpecialPage class.
The SpecialPage->including()
function returns a boolean value telling you what context the special page is being called from: false if it is a separate web page, and true if it is being included from within another web page.
Usually you will want to strip down the presentation somewhat if the page is being included.
SpecialPage->execute()
This is the function which your child class should overload.
It passes a single parameter, usually referred to cryptically as $par
(short for $parameter, as it is the parameter the users can feed to your special page).
This parameter is the subpage component of the current title.
For example, if someone follows a link to Special:MyExtension/blah, $par
will contain "blah".
Página de ajuda
Versão MediaWiki: | ≥ 1.25 |
It's useful to add help pages on MediaWiki.org, where they'll be translatable. To make sure users find your help page, it's advisable and very simple for your special page to link the help page in question:
$this->addHelpLink( 'Help:Extension:MyExtension' );
OutputPage.php
OutputPage.php contains the class definition for objects of type OutputPage
.
You can get an object of this class from your SpecialPage using
$output = $this->getOutput();
The variablename $output is, of course, arbitrary.
Whatever you call it, this is the variable you will use the most, because it is the way to send output to the browser (no, you don't use echo
or print
).
If you want to use it somewhere, create the variable and then use it:
function randomFunction() {
$output = $this->getOutput();
$output->addHTML( '<b>This is not a pipe...</b>' );
}
If you want to, you can create multiple OutputPage objects in different methods in your SpecialPage extension. They will add to the output in the order they are executed.
You can inspect the OutputPage class by viewing includes/OutputPage.php
(indeed, all of these can be inspected), but there are a few methods you should definitely know about.
OutputPage->addHTML()
Essentially the quick and dirty substitute for echo
.
It takes your input and adds it to the buffer: no questions asked.
In the below action, if $action
contains user-data, it could easily have XSS, evil stuff, or the spawn of Satan injected in.
You're better off using escaping (such as with the php function htmlentities) or the XML builders class to build trusted output.
$output->addHTML( '<form action="'.$action.'" method="post">' );
OutputPage->addWikiText()
For most output, you should be using this function. It's a bit of a black magic function: wikitext goes in, HTML comes out, and a whole lotta arcane code and demon summonings happen in between.
$output->addWikiText("This is some ''lovely'' [[wikitext]] that will '''get''' parsed nicely.");
What's worth noting is that the parser will view your chunks as cohesive wholes and paragraph accordingly. That is...
$output->addWikiText( '* Item 1' );
$output->addWikiText( '* Item 2' );
$output->addWikiText( '* Item 3' );
Will output three lists with one item each, which probably wasn't intended.
Note however, if you just want to insert a system message and have it treated like parsed wikitext, you can use code like $this->getOutput()->addHtml( $this->msg( 'key-of-message' )->parse() )
.
This will not have the issue with nested parser calls mentioned above.
OutputPage->showErrorPage()
Uma página de erro é mostrada.
The arguments $title
and $msg
specify keys into $this->msg(), not text.
Um exemplo:
$output->showErrorPage( 'error', 'badarticleerror' );
- 'error' refere-se ao texto "Erro".
- 'badarticleerror' refere-se ao texto "Esta ação não pode ser realizada nesta página."
Você também pode especificar mensagens ou adicionar parâmetros:
$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
The WebRequest class is used to obtain information from the GET and POST arrays. Using this is recommended over directly accessing the superglobals. The WebRequest object is accessible from extensions by using the RequestContext .
Database.php
MediaWiki has a load of convenience functions and wrappers for interacting with the database, using the \Wikimedia\Rdbms\Database class.
It also has an interesting load balancing scheme in place.
It's recommended you use these wrappers.
Check out Database.php
for a complete listing of all the convenience functions, because these docs will only tell you about the non-obvious caveats.
See Manual:Database access .
User.php
The User class is used to represent users on the system.
SpecialPage->getUser() should be used to obtain a User object for the currently logged in user.
The use of the global $wgUser
is deprecated
Title.php
Title represents the name of a page in the wiki.
This is useful because MediaWiki does all sorts of fun escaping and special case logic to page names, so instead of rolling your own convert title to URL function, you create a Title object with your page name, and then use getLocalURL()
to get a URL to that page.
To get a title object for your special page from outside of the special page class, you can use SpecialPage::getTitleFor( 'YourCanonicalSpecialPageName' )
.
It will give you a localised title in the wiki's language.
Páginas especiais personalizadas
Existem várias maneiras de fornecer suas próprias páginas especiais não agrupadas no MediaWiki:
- One method is to install an extension that generates a form to create or edit an article. A list of extensions currently available, can be found at Category:Special page extensions .
- You can also write an extension which provides your own special page. Writing your own extension requires PHP coding skill and comfort with object oriented design and databases also is helpful. You will also need to know how to use code to create and edit MediaWiki articles. For more information, please see this discussion.
- You can also display a custom page through JavaScript, in place of the default error message "Unknown special page" (or the "This page is intentionally left blank." message, if using a subpage of Special:BlankPage). In MediaWiki:Common.js, check for wgPageName , then hide the MediaWiki-generated content (just appendCSS
{visibility:hidden;}
), and inject custom HTML (innerHTML
) into thedocument.getElementById('bodyContent')
ordocument.getElementById('mw_contentholder')
. For an example, see meta:User:Krinkle/Tools/Real-Time Recent Changes.
Perguntas frequentes
Definir um título para extensão
O MediaWiki não define o título da extensão, que é trabalho do desenvolvedor.
Ele irá procurar pelo nome da extensão quando Special:Specialpages for chamado ou a página especial for carregada.
In the function execute( $par ) section, use OutputPage methods to title the extension like: $this->getOutput()->setPageTitle("your title");
The place where the extension can be found (as specified by what is passed into the SpecialPage constructor) is the key--except that it is not capitalized because of getDescription()
, the internally used function that finds out the title (or, what they call description) of the special page, strtolower
the name.
"ThisIsACoolSpecialPage"'s key would be "thisisacoolspecialpage."
Theoretically, getDescription
can be overloaded in order to avoid interacting with the message cache but, as the source code states: "Derived classes can override this, but usually it is easier to keep the default behavior.
Furthermore, this prevents the MediaWiki namespace from overloading the message, as below.
Localizing the Extension Name
So you've just installed a shiny new MediaWiki extension and realize: "Oh no, my wiki is in French, but the page is showing up as English!"
Most people wouldn't care, but it's actually a quite simple task to fix (as long as the developer used the method explained on this page).
No noodling around in source code.
Let's say the name of the page is DirtyPages
and the name comes out to "List of Dirty Pages" but you want it to be (and excuse my poor French) "Liste de Pages Sales".
Well, it's as simple as this:
- Navigate to MediaWiki:DirtyPages, this page may not exist, but edit it anyway
- Insert "Liste de Pages Sales" and save
And voilà (pardon the pun), the change is applied.
This is also useful for customizing the title for your wiki within your language: for instance, the developer called it "List of Dirty Pages" but you don't like that name, so you rename it "List of Pages needing Cleanup". Check out Special:Allmessages to learn more.
Also, if your extension has a large block of text that does change, like a warning, don't directly output the text. Instead, add it to the message cache and when the time comes to output the text in your code, do this:
$wgOut->addWikiText( $this->msg( 'dirtypageshelp' ) );
Then this message too can be customized at MediaWiki:Dirtypageshelp.
See also Help:Mensagem do sistema .
Restringindo acesso à página
Do not display your Special Page on Special:SpecialPages
Sometimes you may want to limit the visibility of your Special Page by removing it from Special:SpecialPages and making it visible to only those users with a particular right.
You can do this in the constructor by passing in a $restriction
parameter; e.g., “editinterface”, a right only assigned to sysops by default; see the User rights manual for other available user rights.
function __construct() {
parent::__construct( 'MyExtension', 'editinterface' ); // restrict to sysops
}
Or you can create your own right in the setup file and assign it to sysops, e.g.:
"AvailableRights": [
"myextension-right"
],
"GroupPermissions": {
"sysop": {
"myextension-right": true
}
}
and then call the constructor with your right:
function __construct() {
parent::__construct( 'MyExtension', 'myextension-right' );
}
Prevent access to your Special Page
Even if you restrict your page in the constructor, as mentioned above, it will still be viewable directly via the URL, e.g. at Special:MySpecialPage.
In order to actually limit access to your SpecialPage you must call $this->checkPermissions()
in the execute
method.
If you need more fine-grained control over permissions, you can override $this->checkPermissions()
, and/or add whatever permissions-checking is required for your extension.
Disabling Special:UserLogin and Special:UserLogout pages
In LocalSettings.php you can use the SpecialPage_initList hook to unset unwanted built-in special pages. See "making a few SpecialPages restricted" if you need conditional unsetting of special pages for example for certain user groups. The general message "You have requested an invalid special page." is shown if users try to access such unset special pages.
$wgHooks['SpecialPage_initList'][] = function ( &$list ) {
unset( $list['Userlogout'] );
unset( $list['Userlogin'] );
return true;
};
A different approach would be to use the DisabledSpecialPage callback. This approach may be preferred if you're only disabling the special page "temporarily", because the default message in this case would say: "Esta página foi desativada por um administrador do sistema." instead of pretending the page does not exist at all. This gives clear hint that the page maybe activated at a later time.
$wgSpecialPages['Userlogout'] = DisabledSpecialPage::getCallback( 'Userlogout' );
$wgSpecialPages['Userlogin'] = DisabledSpecialPage::getCallback( 'Userlogin' );
It is also possible to add custom lengthy explanation of why you're disabling the special page, by giving a message key as the second argument of the callback. To do so first create a system message "MediaWiki:Userlogout-disable-reason" and write all the explanation there. The message will be parsed in a block format. Then in LocalSettings.php add:
$wgSpecialPages['Userlogout'] = DisabledSpecialPage::getCallback( 'Userlogout', 'Userlogout-disable-reason' );
Adicionando logs
No MediaWiki, todas as ações dos usuários são rastreadas para transparência e colaboração. Veja Manual:Registrando para Special:Log para saber como fazer.
Changing the groups on Special:Specialpages
If you're an extension developer, you have to implement the getGroupName()
method as described in the Special page group section of this page.
Since MediaWiki 1.21, the special page group can be overridden by editing a system message.
Este método não se destina a ser usado por desenvolvedores de extensões, mas por administradores de sites.
The group name must be placed in the specialpages-specialpagegroup-<special page name>
message, where <special page name>
is the canonical name (in english) of the special page in lowercase.
For example, if you want to set the group under which Special:MyLittlePage
is displayed on Special:Specialpages to MyLittleGroup
, you just have to create MediaWiki:Specialpages-specialpagegroup-mylittlepage
with content MyLittleGroup
.
Special:MyLittlePage
will then show up under the group MyLittleGroup
, which you can name under MediaWiki:Specialpages-group-mylittlegroup
.
Se você quiser mudar o grupo de páginas especiais existentes, dê uma olhada em Special:SpecialPages&uselang=qqx e use esses nomes ao invés de "mylittlepage".
Unlisting the page from Special:Specialpages
To remove a special page from the Special:Specialpages altogether, pass a false
as a third parameter to the SpecialPage parent constructor, as described in the SpecialPage Constructor section of this page.
If you need more complicated logic to determine whether the page should be listed or not, you can also override the isListed()
function, but using the constructor parameter is simpler.
Getting a list of special pages and their aliases on a wiki
Simply use the "siteinfo" API module to retrieve the information from the wiki like e.g. /api.php?action=query&meta=siteinfo&siprop=specialpagealiases.
Ver também
- HTMLForm – Tutorial on creating checkboxes, text areas, radio buttons, etc. in special pages