Manual:Páginas especiales

Las páginas especiales son páginas que son creadas por el software en demanda para realizar una función específica.
Por ejemplo, una página especial puede mostrar todas las páginas que tienen uno o más enlaces a un sitio externo, o puede crear un formulario que proporcione la retroalimentación enviada por el usuario.
Las páginas especiales se encuentran en su propio espacio de nombres (Special:) y no se pueden editar directamente como las demás páginas. Los desarrolladores también pueden crear nuevas páginas especiales.
Estas páginas por defecto son accesibles para el usuario y generalmente aparecerán en la lista de todas las páginas especiales en Special:SpecialPages. Algunas páginas especiales solo son accesibles para usuarios con ciertos permisos y accesos. Otras páginas especiales no aparecen en absoluto en la lista de páginas especiales y solo son utilizadas internamente por el wiki.
Información general
Todas las páginas especiales que vienen incluidas por defecto en MediaWiki tienen un nombre similar a SpecialSomename.php
y se encuentran en el directorio includes/specials
.
Las páginas especiales del núcleo deben estar registradas en la lista del núcleo ubicada en includes/specialpage/SpecialPageFactory.php
para poder ser cargadas por MediaWiki.
Las páginas especiales creadas por terceros se almacenan generalmente en el directorio extensions
en su propio archivo o como parte de una extensión mayor.
Todas las páginas especiales heredan de una clase denominada SpecialPage que está definida en includes/specialpage/SpecialPage.php
.
Cuando se crea una nueva página especial, se pueden definir los derechos de usuario necesarios para acceder a la página.
Estos derechos especifican, entre otras cosas, si se mostrará la página en Special:SpecialPages y si se podrá incluir en otras páginas.
Las páginas especiales también tienen nombres únicos que se pueden personalizar en una wiki. La forma general es «Special:NombreDeLaPágina» donde tanto «Special» como «NombreDeLaPágina», son personalizables. El pseudo espacio de nombres Special se puede traducir a otros idiomas. Se puede obtener la traducción de este espacio de nombres mediante el wikitexto $nsspecial, que en este wiki produce «Special» (en wikis cuyo idioma de sitio es el español, será generalmente «Especial»). El nombre de la página especial también se puede redefinir en un mensaje de sistema para el idioma del sitio, siendo el nombre genérico de la página especial su identificador.
Una página especial puede admitir entradas o no. Por ejemplo, Special:Export permite a un usuario definir una página específica para exportar llamando a Special:Export/Sun. Si la página especial admite entradas complejas, se enviarán los parámetros adicionales al componente de la cadena de consulta de la URL para su procesamiento; por ejemplo, https://www.mediawiki.org/w/index.php?title=Special:Recentchanges&days=3&limit=250.
- Hay varias formas de crear páginas especiales, pero el grueso de las extensiones oficiales utilizan la que se muestra a continuación, y se recomienda la adherencia a este estilo. Además, asegúrate de incluir un bloque de créditos en la nueva página especial para 'specialpage'. Consulta
$wgExtensionCredits
para más detalles. - Tras crear una nueva página especial, asegúrate de añadirla a Categoría:Extensiones de páginas especiales para que otras personas puedan encontrarla.
- Las páginas especiales no se pueden incluir en marcos (frames) a menos que utilices
$wgOut->allowClickjacking();
Plantilla básica de página especial
MediaWiki 1.25 introdujo una nueva forma de cargar una extensión. Para versiones más antiguas y sin soporte de MediaWiki, véase una revisión anterior. |
Special pages for extensions require at least four files, defined as follows:
MyExtension/extension.json
– El fichero de configuración.MyExtension/includes/SpecialMyExtension.php
– The PHP class file with the bulk of the code.i18n/en.json
yi18n/qqq.json
– El archivo de localización .
Coloca todos los archivos en un nuevo directorio dentro de tu directorio MediaWiki extensions/
.
Deberías nombrar el archivo de la página especial en función del nombre de la extensión. Por ejemplo, Extensión:Accesorios contiene el archivo SpecialGadgets.php
.
Si tu extensión utiliza más de una página especial, necesitarás más nombres.
En el siguiente ejemplo, el nombre de la página especial es MyExtension.
Tras crear los archivos enumerados a continuación, al añadir la siguiente línea a LocalSettings.php, se activará la extensión:
wfLoadExtension( 'MyExtension' );
Fichero de configuración
Ejemplo de archivo de configuración para MyExtension/extension.json
:
{
"name": "MyExtension",
"version": "0.1.0",
"author": [
"Your Name"
],
"url": "https://www.mediawiki.org/wiki/Special:MyLanguage/Extension:MyExtension",
"descriptionmsg": "myextension-desc",
"license-name": "MIT",
"type": "other",
"AutoloadNamespaces": {
"MediaWiki\\Extension\\MyExtension\\": "src/"
},
"SpecialPages": {
"MyExtension": "MediaWiki\\Extension\\MyExtension\\SpecialMyExtension"
},
"MessagesDirs": {
"MyExtension": [
"i18n"
]
},
"manifest_version": 2,
"requires": {
"MediaWiki": ">= 1.42.0",
"platform": {
"php": ">= 8.2"
}
}
}
Este archivo registra varios elementos importantes y obligatorios:
- La ubicación de la clase
MediaWiki\Extension\MyExtension\SpecialMyExtension
; - La ubicación de los archivos de localización;
- La nueva página especial y su nombre de clase.
InvalidArgumentException: Provided specification is not an array
, generalmente significa que MediaWiki no pudo encontrar la clase especificada en extension.json que implementa tu página especial.
Archivo de página especial
El archivo del cuerpo (MyExtension/src/SpecialMyExtension.php
) debería contener una subclase de MediaWiki\SpecialPage\SpecialPage
o una de sus subclases.
Este archivo se carga automáticamente cuando alguien solicita la página especial.
El siguiente ejemplo implementa la subclase SpecialMyExtension.
Necesitas disponer del constructor __construct()
porque su primer parámetro nombra tu página especial.
execute()
es la principal función a la que se llama cuando se accede a una página especial.
Esta función suplanta la función SpecialPage::execute()
.
Pasa el parámetro único $par
, el componente de la subpágina del título actual.
Por ejemplo, si alguien sigue un enlace a Special:MyExtension/blah, $par
contendrá «blah».
Debes ejecutar el la salida de wikitexto y HTML mediante $wgOut
. No utilices directamente 'print' o 'echo' cuando trabajes dentro de la interfaz de usuario del wiki.
Sin embargo, si utilizas tu página especial como un punto de acceso para la salida XML o binaria personalizada, consulta Hazte con el control de la salida de tu página especial .
<?php
namespace MediaWiki\Extension\MyExtension;
class SpecialMyExtension extends MediaWiki\SpecialPage\SpecialPage {
public function __construct() {
parent::__construct( 'MyExtension' );
}
public function execute( $par ) {
$request = $this->getRequest();
$output = $this->getOutput();
$this->setHeaders();
# Obtén los datos de la solicitud, por ejemplo,
$param = $request->getText( 'param' );
# Haz lo que tengas que hacer
# ...
$wikitext = 'Hello world!';
$output->addWikiTextAsInterface( $wikitext );
}
}
Archivo de localización
- Consulta Help:Mensaje de sistema para saber cómo traducirlos.
Todas las páginas especiales especifican un título, domo 'My Extension'
.
- El título se utiliza en los elementos
<title>
y<h1>
de la página de la extensión y en Special:SpecialPages. - Puede ser cualquier cosa, pero debería describir la página especial y la extensión.
- Está especificado por un mensaje. La estructura del mensaje es un par clave-valor. La clave,
'myextension'
, debe estar completamente en minúsculas.
Ejemplo de archivo de localización en 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"
}
En i18n/qqq.json
, la documentación del mensaje:
{
"@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}}"
}
Ten en cuenta que los identificadores no deberían empezar por una letra mayúscula, y que un espacio en el identificador debería reemplazarse en el código por un guion bajo.
El mensaje -summary
es opcional.
Está creado automáticamente por la clase padre y se muestra en la parte superior de la página especial, generalmente para contener una descripción concisa de qué puede hacer el usuario.
Si no defines su contenido, solo se utilizará cuando los administradores de wiki lo personalicen en la wiki.
Archivo de alias
También puedes internacionalizar el nombre de la página especial creándole alias. El siguiente ejemplo utiliza el archivo «MyExtension.i18n.alias.php».
En este ejemplo, la página especial MyExtension
registra un alias para que la página sea accesible a través de .../Special:My Extension
y de .../Spezial:Meine_Erweiterung
en alemán.
Añade tu archivo de alias a extension.json
:
...
"ExtensionMessagesFiles": {
"MyExtensionAlias": "MyExtension.i18n.alias.php"
},
...
Añade los alias de páginas especiales a MyExtension.i18n.alias.php
:
<?php
/**
* Aliases for myextension
*
* @file
* @ingroup Extensions
*/
$specialPageAliases = [];
/** English
* @author <tu nombre de usuario>
*/
$specialPageAliases['en'] = [
'MyExtension' => [ 'MyExtension', 'My Extension' ],
];
/** Deutsch
* @author <tu nombre de usuario>
*/
$specialPageAliases['de'] = [
'MyExtension' => [ 'MeineErweiterung', 'Meine Erweiterung' ],
];
De nuevo, deberías escribir un espacio en el identificador y un guion bajo en el código.
Para el encabezado de la página y los enlaces, se aplican las reglas habituales de nombres de páginas.
Si $wgCapitalLinks
es true
, se convertirá una letra minúscula en mayúscula, y se mostrará un guion bajo como un espacio.
Por ejemplo, en lugar de lo anterior, se podría utilizar 'my_extension' => 'My extension'
, asumiendo que se hubiera identificado consistentemente la extensión como my_extension
en todos los demás lugares.
Nótese que, en el vector asociativo para el inglés, la cadena que identifique nuestra página especial (MyExtension
en el ejemplo) también es un título válido.
¡Nótese también que el primer elemento de $specialPageAliases['en']['MyExtension']
debe coincidir con la clave ('MyExtension'
)! De otra manera, Special:Specialpages no listará la página.
Grupo de páginas especiales
Puedes establecer bajo qué grupo aparecerá tu página especial en Special:SpecialPages redefiniendo SpecialPage::getGroupName()
en tu subclase.
/**
* Modifica el padre para establecer dónde aparecerá la página especial en Special:SpecialPages
* 'other' es el valor por defecto. Si esto es lo que quieres, no necesitas modificar nada.
* Especifica 'media' para utilizar el mensaje de la interfaz del sistema <code>specialpages-group-media</code>, que se traduce como 'Informes y subidas multimedia';
*
* @return string
*/
function getGroupName() {
return 'media';
}
Algunos valores comunes son 'login', 'maintenance', 'media', 'other', 'pagetools', 'redirects', 'users'. Puedes ver los valores aceptados en Special:AllMessages (busca specialpages-group o navega por el wiki mediante Special:SpecialPages?uselang=qqx utilizando el pseudoidioma 'qqx') y mirando los encabezados. Especifica la palabra 'media' para utilizar el mensaje de interfaz 'specialpages-group-media'.
Si tu página especial no se ajusta a ninguno de los encabezados preconfigurados, puedes añadir uno nuevo añadiéndolo a tu archivo de localización (véase Archivo de localización).
Los grupos de páginas estándar que vienen incluidos en MediaWiki están listados en el archivo de localización. Por ejemplo, los mensajes en inglés están en languages/i18n/en.json
y empiezan por specialpages-group-
.
Si deseas categorizar tu página especial bajo users
, entonces el mensaje es specialpages-group-users
.
El valor de esta clave es el texto que aparece como el texto de esa categoría, por ejemplo, Users and rights
.
Si tu página especial no se ajusta a ninguna de las categorías existentes, siempre puedes crear una nueva.
En el archivo de localización de tu extensión solo tienes que introducir una nueva clave en el vector messages
.
En este ejemplo, definimos el grupo 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"
}
Ahora, asumiento que has establecido el valor de retorno del método SpecialPage::getGroupName()
como gamification
en la definición de tu clasem vuelve a cargar Special:SpecialPages para ver tu nueva categoría.
Otros archivos importantes
SpecialPage.php
Constructor
Puedes sobrecargar el constructor para inicializar tus propios datos, pero la razón principal por la que querrías hacerlo es para cambiar el comportamiento de la propia clase SpecialPage. Cuando llames al constructor de la clase base desde tu clase hija, están disponibles los siguientes parámetros:
function __construct( $name = '', $restriction = '', $listed = true );
- string
$name
Nombre de la página especial, tal como se ve en los enlaces y en las URL. - string
$restriction
Derecho de usuario requerido, por ejemplo, «block» or «delete»; véase también Restringir el acceso a la página - boolean
$listed
Si la página está listada en Special:Specialpages
SpecialPage->setHeaders()
Esto inicializa el objeto OutputPage $wgOut
con el nombre y descripción de tu página especial.
Debe ser llamado siempre desde tu método execute()
.
SpecialPage->getOutput()
Este método devuelve un objeto OutputPage al que se puede acceder tal como se describe a continuación. Tal como en el código de ejemplo, utiliza
$output = $this->getOutput();
$output->addWikiTextAsInterface( 'Hello, World' );
SpecialPage->getRequest()
Este método devuelve un objeto WebRequest al que se puede acceder tal como se describe a continuación. Tal como en el código de ejemplo, utiliza
$request = $this->getRequest();
$myparam = $request->getText( 'myparam' );
SpecialPage->including()
Algunas páginas especiales pueden incluirse desde otra página. Por ejemplo, si añades {{Special:RecentChanges}} al wikitexto de una página, insertará una lista de los cambios recientes en el contenido existente de la página.
Incluir una página especial desde otra página web solo es posible si declaraste la página como incluible en el constructor.
Puedes hacer esto añadiendo lo siguiente en el método __construct()
después de la inicialización de la clase padre:
$this->mIncludable = true;
También puedes definir que tu clase de página especial extienda la clase IncludableSpecialPage.
La función SpecialPage->including()
devuelve un valor booleano que indica desde qué contexto se está llamando a la página especial: 'false' si es una página web separada o 'true' si es como inclusión desde dentro de otra página web.
Normalmente querrás aligerar hasta cierto punto la presentación en caso de que se esté incluyendo la página.
SpecialPage->execute()
Esta es la función que tu clase hija debería sobrecargar.
La función pasa un solo parámetro, generalmente conocido de forma críptica como $par
(abreviatura de $parameter, ya que es el parámetro que los usuarios pueden alimentar a tu página especial).
Este parámetro es el componente de la subpágina del título actual.
Por ejemplo, si alguien sigue un enlace a Special:MyExtension/blah, $par
contendrá «blah».
Páginas de ayuda
Versión de MediaWiki: | ≥ 1.25 |
Es útil añadir páginas de ayuda a Mediawiki.org, donde serán traducibles. Para asegurarte de que los usuarios encuentren tu página de ayuda, es aconsejable y muy sencillo hacer que tu página especial enlace a la página de ayuda en cuestión:
$this->addHelpLink( 'Help:Extension:MyExtension' );
OutputPage.php
OutputPage.php contiene la definición de clase para los objetos de tipo OutputPage
.
Puedes obtener un objeto de esta clase desde tu página especial mediante
$output = $this->getOutput();
El nombre de la variable $output es, por supuesto, arbitrario.
La llames como la llames, esta es la variable que más utilizarás, ya que es como podrás enviar la salida al navegador (no, no se utiliza ni echo
ni print
).
Si quieres utilizar la variable en algún sitio, créala y luego utilízala:
function randomFunction() {
$output = $this->getOutput();
$output->addHTML( '<b>This is not a pipe...</b>' );
}
Si lo deseas, puedes crear varios objetos OutputPage en distintos métodos en tu extensión de página especial. Se añadirán a la salida en el mismo orden en que se ejecutaron.
Puedes inspeccionar la clase OutputPage revisando includes/OutputPage.php
(de hecho, todas las clases se pueden inspeccionar), pero hay algunos métodos que sin duda debes conocer.
OutputPage->addHTML()
Esencialmente el sustituto rápido y chapucero de echo
.
Toma tu entrada y la añade al búfer sin hacer preguntas.
En la siguiente acción, si $action
contiene datos de usuario, podría incluir XSS, entes maléficos o el mismísimo engendro de Satanás inyectado.
Te saldrá más a cuenta escapar los datos (por ejemplo, mediante la función de PHP htmlentities) o recurrir a la clase de constructores de XML para construir una salida segura.
$output->addHTML( '<form action="'.$action.'" method="post">' );
OutputPage->addWikiText()
Para la mayor parte de la salida, deberías utilizar esta función. Es algo así como una función de magia negra: entra wikitexto, sale HTML y entre medias se produce un montón de código arcano e invocaciones demoníacas.
$output->addWikiText("This is some ''lovely'' [[wikitext]] that will '''get''' parsed nicely.");
Lo que cabe señalar es que el analizador sintáctico considerará tus fragmentos como conjuntos cohesivos y generará los párrafos en consecuencia. Es decir...
$output->addWikiText( '* Item 1' );
$output->addWikiText( '* Item 2' );
$output->addWikiText( '* Item 3' );
...generará tres listas con un elemento cada una, que probablemente no es lo que se esperaba.
Ten en cuenta, sin embargo, que si solo quieres insertar un mensaje de sistema y que se trate como wikitexto analizado, puedes utilizar código tal como $this->getOutput()->addHtml( $this->msg( 'key-of-message' )->parse() )
.
Esto no presentará el problema ya mencionado de las llamadas anidadas al analizador.
OutputPage->showErrorPage()
Se muestra una página de error.
Los argumentos $title
y $msg
especifican las claves en $this->msg(), no texto.
Por ejemplo:
$output->showErrorPage( 'error', 'badarticleerror' );
- 'error' se refiere al texto «Error».
- 'badarticleerror' se refiere al texto «Esta acción no se puede llevar a cabo en esta página.».
También puedes especificar objetos de mensaje o añadir 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
La clase WebRequest se utiliza para obtener información de los vectores GET y POST. Se recomienda utilizar esto en lugar de acceder a los superglobales. El objeto WebRequest es accesible desde las extensiones mediante el RequestContext .
Database.php
MediaWiki tiene un montón de funciones de conveniencia y envolturas (wrappers) para interactuar con la base de datos mediante la clase \Wikimedia\Rdbms\Database.
También dispone de un interesante esquema de equilibrio de carga.
Se recomienda utilizar estas envolturas.
Consulta Database.php
para ver una lista completa de todas las funciones de conveniencia, ya que estos documentos solo informarán sobre las advertencias menos evidentes.
Véase Manual:Acceso a base de datos .
User.php
La clase User se utiliza para representar a los usuarios en el sistema.
Se debería utilizar SpecialPage->getUser() para obtener un objeto User para el usuario actualmente conectado.
El uso de la variable global $wgUser
está desaconsejado.
Title.php
Title (título) representa el nombre de una página del wiki.
Esto es útil porque MediaWiki aplica todo tipo de escapados divertidos y lógica de casos especiales a los nombres de las páginas, así que en lugar de lanzar tu propia función para convertir un título en una URL, crea un objeto Title con el nombre de tu páginay luego utiliza getLocalURL()
para obtener una URL a esa página.
Para obtener un objeto Title para tu página especial desde fuera de la clase SpecialPage, puedes utilizar SpecialPage::getTitleFor( 'YourCanonicalSpecialPageName' )
.
Te devolverá un título localizado en el idioma del wiki.
Páginas especiales personalizadas
Hay varias maneras de proporcionar tus propias páginas especiales no empaquetadas junto con MediaWiki:
- Un método consiste en instalar una extensión que genere un formulario para crear o editar un artículo. En Categoría:Extensiones de páginas especiales se encuentra una lista de extensiones actualmente disponibles.
- También puedes escribir una extensión que proporcione tu propia página especial. Escribir tu propia extensión requiere saber programar en PHP, y también ayuda tener buenos conocimientos de diseño orientado a objetos y de bases de datos. También tendrás que saber cómo utilizar código para crear y editar artículos de MediaWiki. Para más información, consulta esta página de discusión.
- También puedes mostrar una página personalizada mediante JavaScript en lugar del mensaje de error por defecto «Página especial desconocida» (o el mensaje «Esta página está en blanco de manera intencionada», si utilizas una subpágina de Special:BlankPage). En MediaWiki:Common.js, busca wgPageName , luego oculta el contenido generado por MediaWiki (basta con añadir al final el CSS
{visibility:hidden;}
) e inyecta HTML personalizado (innerHTML
) endocument.getElementById('bodyContent')
o endocument.getElementById('mw_contentholder')
. Puedes ver un ejemplo en meta:User:Krinkle/Tools/Real-Time Recent Changes.
Preguntas frecuentes
Definir un título para la extensión
MediaWiki no define el título de la extensión; ese es el trabajo del desarrollador.
Buscará el nombre de la extensión cuando se llame a Special:Specialpages o cuando se cargue la página especial.
En la sección function execute( $par ), utiliza métodos de OutputPage para dar un título a la extensión; por ejemplo, $this->getOutput()->setPageTitle("your title");
.
El lugar donde se puede encontrar la extensión (tal como se especifica en lo que se pasa al constructor de SpecialPage) es la clave – excepto que no lleva mayúsculas debido a que getDescription()
, la función interna que busca el título (o lo que denomina descripción) de la página especial, aplica strtolower
al nombre.
Así, la clave de «ThisIsACoolSpecialPage» será «thisisacoolspecialpage».
En teoría, se puede sobrecargar getDescription
para evitar interactuar con la antememoria de los mensajes, pero, como establece el código fuente, «Las clases derivadas pueden redefinir esto, pero generalmente es más sencillo mantener el comportamiento predeterminado».
Además, esto evita que el especio de nombres sobrecargue el mensaje, como más adelante.
Localizar el nombre de la extensión
Así que acabas de instalar una extensión nueva y reluciente de MediaWiki y te das cuenta: «¡Oh, no, mi wiki está en francés, pero la página se muestra en inglés!».
A la mayoría de la gente no le importará, pero es una tarea bastante simple de resolver (siempre que el desarrollador haya empleado el método explicado en esta página).
Nada de dar vueltas por el código fuente.
Digamos que el nombre de la página es DirtyPages
y que se muestra como «List of Dirty Pages» («Lista de páginas sucias»), pero deseas que sea (y disculpa mi pobre francés) «Liste de Pages Sales».
Pues bien, es así de fácil:
- Navega a MediaWiki:DirtyPages; puede que esta página no exista, pero edítala igualmente
- Inserta «Liste de Pages Sales» y guarda
Y voilà (disculpa el juego de palabras), ya se aplicó el cambio.
Esto también es útil para personalizar el título en tu wiki y en tu idioma: por ejemplo, el desarrollador nombró la página «Lista de páginas sucias», pero no te gusta ese nombre, así que deseas renombrarla como «Lista de páginas que necesitan una limpieza». Consulta Special:Allmessages para aprender más.
Además, si tu extensión contiene un gran bloque de texto que cambia, como un aviso, no pases directamente el texto a la salida. En lugar de ello, añádelo a la antememoria del mensaje y, cuando llegue la hora de pasar el texto a la salida en tu código, haz esto:
$wgOut->addWikiText( $this->msg( 'dirtypageshelp' ) );
Entonces también se podrá personalizar este mensaje en MediaWiki:Dirtypageshelp.
Véase también Help:Mensaje de sistema .
Restringir el acceso a la página
No mostrar tu página especial en Special:SpecialPages
A veces puede que quieras limitar la visibilidad de tu página especial eliminándola de Special:SpecialPages y haciéndola visible solo a los usuarios que tengan un determinado derecho.
Puedes hacerlo en el constructor pasándole un parámetro $restriction
, por ejemplo, «editinterface», un derecho que solo se asigna por defecto a los administradores (sysops); véase el manual de derechos de usuarios para ver más derechos de usuario disponibles.
function __construct() {
parent::__construct( 'MyExtension', 'editinterface' ); // restringir a administradores
}
También puedes crear tu propio derecho en el archivo de configuración y asignárselo a los administradores (sysops), por ejemplo:
"AvailableRights": [
"myextension-right"
],
"GroupPermissions": {
"sysop": {
"myextension-right": true
}
}
y luego llamar al constructor con ese derecho:
function __construct() {
parent::__construct( 'MyExtension', 'myextension-right' );
}
Impedir el acceso a tu página especial
Aunque restrinjas tu página en el constructor, como se mencionó anteriormente, seguirá siendo directamente visible a través de la URL, por ejemplo, en Special:MySpecialPage.
Para poder impedir efectivamente el acceso a tu página especial, debes llamar a $this->checkPermissions()
en el método execute
.
Si necesitas un control más fino sobre los permisos, puedes modificar $this->checkPermissions()
y/o añadir cualquier verificación de permisos que requiera tu extensión.
Deshabilitar las páginas Special:UserLogin y Special:UserLogout
En LocalSettings.php puedes utilizar el gancho SpecialPage_initList para deshabilitar las páginas especiales integradas que no necesites. Consulta «hacer que algunas páginas especiales estén restringidas» si necesitas deshabilitar páginas especiales de forma condicional, por ejemplo, para determinados grupos de usuarios. El mensaje general «Has intentado acceder a una página especial inexistente.» se muestra si un usuario trata de acceder a tales páginas especiales deshabilitadas.
$wgHooks['SpecialPage_initList'][] = function ( &$list ) {
unset( $list['Userlogout'] );
unset( $list['Userlogin'] );
return true;
};
Un enfoque diferente consiste en utilizar la retrollamada DisabledSpecialPage. Este enfoque puede ser más conveniente si solo estás deshabilitando la página especial temporalmente, ya que en este caso el mensaje por defecto diría «Esta página ha sido desactivada por el administrador del sistema.» en lugar de pretender que la página no existe en absoluto. Esto da una indicación clara de que puede que se active la página en un futuro.
$wgSpecialPages['Userlogout'] = DisabledSpecialPage::getCallback( 'Userlogout' );
$wgSpecialPages['Userlogin'] = DisabledSpecialPage::getCallback( 'Userlogin' );
También puedes añadir una explicación larga y personalizada de por qué has deshabilitado la página especial proporcionando la clave del mensaje como el segundo argumento de la retrollamada. Para hacerlo, en primer lugar crea un mensaje de sistema «MediaWiki:Userlogout-disable-reason» y escribe allí toda la explicación. El mensaje será analizado en un formato de bloque. Después, en LocalSettings.php, añade:
$wgSpecialPages['Userlogout'] = DisabledSpecialPage::getCallback( 'Userlogout', 'Userlogout-disable-reason' );
Añadir registros
En MediaWiki, se registran todas las acciones de los usuarios en el wiki por transparencia y colaboración. Consulta Manual:Registrar en Especial:Registro para saber cómo hacerlo.
Modificar los grupos en Special:Specialpages
Si eres desarrollador de extensiones, debes implementar el método #Special page group tal como se describe en la sección sobre grupos de páginas especiales de esta página.
Desde MediaWiki 1.21, se puede redefinir el grupo de páginas especiales editando un mensaje de sistema.
Este método no está destinado a ser utilizado por desarrolladores de extensiones, sino por administradores de sitio.
El nombre del grupo se debe introducir en el mensaje specialpages-specialpagegroup-<nombre de página especial>
, donde <nombre de página especial>
es el nombre canónico (en inglés) de la página especial en minúsculas.
Por ejemplo, si deseas definir el grupo bajo el cual se muestra Special:MyLittlePage
en Special:Specialpages como MyLittleGroup
, no tienes más que crear MediaWiki:Specialpages-specialpagegroup-mylittlepage
con el contenido MyLittleGroup
.
Entonces se mostrará Special:MyLittlePage
bajo el grupo MyLittleGroup
, que podrás renombrar en MediaWiki:Specialpages-group-mylittlegroup
.
Si deseas cambiar el grupo de páginas especiales existentes, revisa Special:SpecialPages&uselang=qqx y utiliza esos nombres en lugar de «mylittlepage».
Omitir la página en Special:Specialpages
Para retirar una página especial de la lista de Special:Specialpages, pasa un false
como tercer parámetro al constructor padre de SpecialPage, tal como se describe en la sección sobre el constructor de SpecialPage en esta página.
Si necesitas una lógica más compleja para determinar si la página debería aparecer en la lista o no, también puedes sobrecargar la función isListed()
, pero es más sencillo utilizar el parámetro del constructor.
Obtener una lista de páginas especiales y sus alias en un wiki
Basta con utilizar el módulo «siteinfo» de la API para obtener la información del wiki, como por ejemplo /api.php?action=query&meta=siteinfo&siprop=specialpagealiases.
Véase también
- HTMLForm – Tutorial para crear casillas de verificación, áreas de texto, botones de radio, etc. en páginas especiales