Handleiding: Extensies ontwikkelen
Als u van plan bent uw extensie op Wikimediasites te gebruiken, lees dan Writing an extension for deployment |

Deze pagina is een handleiding voor het ontwikkelen van extensies voor MediaWiki. Voordat u begint, blader eens door de lijst met extensies om te zien of er al een extensie bestaat voor uw doel.
De ontwikkeling van een extensie bestaat uit de volgende onderdelen:
Instellen
Om een nieuwe extensie op te zetten, begint u met het opzetten van een lokale ontwikkelomgeving voor MediaWiki , en volgt u de instructies om de extensie BoilerPlate te installeren en te kopiëren.
$wgMainCacheType = CACHE_NONE
en $wgCacheDirectory = false
in te stellen, anders zullen systeemmeldingen en andere veranderingen wellicht niet weergeven worden
Structuur
Een minimale extensie heeft de volgende structuur:
- MyExtension/extension.json
- Bevat de instel-instructies. De bestandsnaam moet
extension.json
zijn. (Voor MediaWiki 1.25 zaten de opzet instructies in eenMyExtension/MyExtension.php
bestand vernoemd naar de extensienaam. Veel extensies hebben 'backwards-compatibility' functies in dit PHP bestand.) - MyExtension/includes/ (or MyExtension/src/)
- Bevat de uit te voeren code voor de extensie.
- MyExtension/resources/ (or MyExtension/modules/)
- Slaat de bronnen aan de kant van de cliënt op zoals JavaScript, CSS en LESS voor de extensie.
- MyExtension/i18n/*.json
- Bevat lokalisatie informatie voor de extensie.
- MyExtension/README.md
- Het is goed om standaard een bestand README toe te voegen, in dat bestand kan dan de installatie en de configuratie van de extensie beschreven worden. Gebruik of platte tekst of Markdown. Voorbeeld bij Extension:Page Forms/nl : phabricator diffusion pagina. Als er markdown wordt gebruikt, voeg dan het achtervoegsel
.md
toe. Voorbeeld bij Parsoid : deREADME.md
code van de phabricator diffusion pagina.
Als u een extensie ontwikkelt, vervang MyExtension hierboven met de naam van uw extensie. Gebruik "UpperCamelCase" naamgeving voor uw bestandsmappen en PHP bestand(en); dit is de algemene Bestandsbenaming conventie.[1]
Registratie
MediaWiki-versie: | ≥ 1.25 |
Het bestand extension.json
bevat de configuratiegegevens voor de extensie. Hier is een voorbeeld van een minimale extension.json
:
{
"name": "MyExtension",
"author": "John Doe",
"url": "https://www.mediawiki.org/wiki/Extension:MyExtension",
"description": "This extension is an example.",
"version": "1.5",
"license-name": "GPL-2.0-or-later",
"type": "validextensiontype",
"manifest_version": 2
}
Veel velden zijn optioneel, maar het is verstandig om ze in te vullen.
Voor een meer volledig voorbeeld van extension.json
, zie de extensie BoilerPlate.
De manifest_version
refereert naar de versie van het schema die in het extension.json bestand is geschreven.
De documentatie van deze functie
Tenzij u een oudere versie van de MediaWiki moet ondersteunen, kies de meest recente versie.
Zodra u een bestand extension.json
heeft ingesteld voor uw extensie, verschijnt de extensie op uw lokale pagina Special:Version
.
Licentie
MediaWiki is een open-source project en gebruikers worden aangemoedigd om MediaWiki extensions te maken onder een Open Source Initiative (OSI) goedgekeurde licentie compatibel met GPL-2.0 of hoger (Wikimedia's standaard software licentie).
Wij bevelen aan om een van de volgende compatibele licenties voor uw projecten in Gerrit, te kiezen:
- GNU General Public Licentie, versie 2.0 of hoger (GPL-2.0-or-later)
- MIT Licentie (MIT)
- BSD Licentie (BSD-3-Clause)
- Apache Licentie 2.0 (Apache-2.0)
Voor extensies die een compatibele licentie hebben, u kunt verzoeken om toegang als ontwikkelaar tot de MediaWiki bron repositories voor extensies.
Om de licentie in code te specificeren door met "license-name
" de korte naam door te geven, bijv. "GPL-2.0-or-later" of "MIT" te koppelen aan de lijst identifiers op spdx.org.
De extensie configureerbaar maken voor gebruikers
Idealiter zouden gebruikers uw extensie kunnen installeren door slechts één tegel toe te voegen aan LocalSettings.php
:
wfLoadExtension( 'MyExtension' );
Als u de extensie door gebruikers wilt laten aanpassen, dan moet u configuratieparameters definiëren en documenteren, de gebruikersinstellingen zien er dan ongeveer zo uit:
wfLoadExtension( 'MyExtension' );
$wgMyExtensionConfigThis = 1;
$wgMyExtensionConfigThat = false;
Als u gebruikers de extensie wilt laten configureren, dan moet u één of meerdere configuratievariabelen verschaffen. Het is slim om deze variabelen unieke namen te geven. Ze moeten ook de MediaWiki naamgevingsconventies volgen (bijvoorbeeld: globale variabelen moeten beginnen met $wg).
Bijvoorbeeld, als de extensie MyExtension
heet, dan wilt u dat al uw variabelen beginnen met $wgMyExtension
.
Het is belangrijk wat u kiest, kies geen beginwaarde die door MediaWiki core variabelen worden gebruikt of door gepubliceerde variabelen van extensies.
Gebruikers zullen het niet waarderen als ze moeten kiezen tussen extensies omdat uw variabelenamen overlappen met een andere extensie.
Het is ook een goed idee om uitgebreide documentatie voor alle configuratievariabelen in de installatienotities te plaatsen.
Hier is een voorbeeld van hoe een configuratie-variabele in extension.json
wordt ingesteld:
{
"config": {
"BoilerPlateEnableFoo": {
"value": true,
"description": "Enables the foo functionality"
}
}
}
Let op, na het aanroepen van wfLoadExtension( 'BoilerPlate' );
bestaat de globale variabele $wgBoilerPlateEnableFoo
niet.
Indien u de variabele een waarde geeft, bijvoorbeeld in LocalSettings.php
dan wordt de standaardwaarde die in de extension.json wordt gegeven, niet gebruikt.
Lees Configuration for developers voor meer informatie over hoe globale variabelen binnen aangepaste extensies te gebruiken.
Classes klaarmaken om automatisch in te laden
Als u ervoor kiest om classes te gebruiken om de extensie te implementeren, dan biedt MediaWiki een versimpeld mechanisme om PHP te helpen met het vinden van het bronbestand waar de class staat.
In de meeste gevallen hoeft u dan niet uw eigen __autoload($classname)
methode te schrijven.
Om MediaWiki's autoloading mechanisme te gebruiken, voegt u vermeldingen toe aan het AutoloadClasses veld. De sleutel voor elke vermelding is de classname; de waarde is het bestand dat de definitie van uw class bevat. Voor een extensie met maar 1 class heeft de class meestal dezelfde naam als de extensie, dus uw autoloading sectie zit er ongeveer zo uit(extensie is genaamd MyExtension):
{
"AutoloadClasses": {
"MyExtension": "includes/MyExtension.php"
}
}
De bestandsnaam is gerelateerd aan de map waar uw extension.json bestand in staat.
Overweeg namespaces bij meer complexere extensies. Lees Manual:Extension.json/Schema#AutoloadNamespaces voor details.
Afhankelijkheden
Als een extensie een andere extensie nodig heeft, bijvoorbeeld omdat die functionaliteit of database tabellen worden gebruikt moeten foutmelding vanwege het ontbreken ervan worden voorkomen.
Stel: extensie CountingMarker heeft de extensie HitCounters voor een bepaald functie nodig.
Een manier om dit te specificeren zou zijn met [[
key in extension.json .
requires
|requires]]
Een andere optie is het gebruik van ExtensionRegistry (beschikbaar vanaf MediaWiki 1.25):
if ( ExtensionRegistry::getInstance()->isLoaded( 'HitCounters', '>=1.1' ) {
/* do some extra stuff, if extension HitCounters is present in version 1.1 and above */
}
Momenteel (vanaf februari 2024, MediaWiki 1.41.0) moet de naam van de te controleren extensie precies overeenkomen met de naam in hun extension.json
.[2][3]
Voorbeeld: als u de laadstatus van extensie OpenIDConnect wilt controleren, moet u deze gebruiken met een spatie
if ( ExtensionRegistry::getInstance()->isLoaded( 'OpenID Connect' ) {
...
}
Implementatie
Voor een overzicht van de codearchitectuur, structuur en conventies voor extensies, zie Best practices for extensions .
Extensie-punten
MediaWiki core biedt verschillende manieren voor extensies om het gedrag, de functionaliteit en het uiterlijk van een wiki te veranderen. De meeste extensies gebruiken meer dan één van deze extensie-punten. Voor een volledige lijst van extensie-punten die in extension.json worden ondersteund, zie de schemareferentie .
Algemeen
- Hooks : Aangepaste code toevoegen op belangrijke punten in de kerncode van MediaWiki, zoals wanneer een gebruiker inlogt of een pagina opslaat. Extensies kunnen pok nieuwe hooks definiëren.
- API-modules : Definieer API-modules gebaseerd op de Action API of de REST API . Deze modules kunnen worden aangeroepen door bots en clients.
- Jobs : Voeg jobs toe aan MediaWiki's JobQueue om procesintensieve taken asynchroon uit te voeren, zoals het verzenden van e-mails voor het doen van meldingen.
Pagina's
- Een speciale pagina tonen : Speciale pagina's bieden dynamisch gegenereerde inhoud, vaak gebaseerd op systeemstatus, database-queries en gebruikersinvoer.
- En pagina-actie uitvoeren : De URL-parameter
action
genereert een aangepaste pagina op basis van de huidige pagina, meestal om informatie te verstrekken (zoals paginageschiedenis) of om een actie uit te voeren (zoals het bewerken van de pagina). Naast de standaardacties die worden aangeboden door de MediaWiki core, kunnen extensies een nieuwe pagina-actie definiëren. - Een trackingcategorie toevoegen : Helpt gebruikers om pagina's met vergelijkbare kenmerken te vinden door pagina's automatisch aan aangepaste categorieën toe te voegen.
Inhoud
- Wiki opmaak uitbreiden : Extensies kunnen gebruikersvriendelijke functionaliteit toevoegen aan de wikitext-opmaak van MediaWiki met behulp van template syntaxis (
{{...}}
) of tags (<example />
). Deze uitbreidingen worden gebruikt om inhoud te genereren en om te communiceren met MediaWiki tijdens de opbouw van pagina's. - Een content-model ondersteunen : Standaard kunnen wiki-pagina's worden opgeslagen met behulp van een paar standaard content-modellen, zoals wikitext en JSON. Extensies kunnen ondersteuning bieden voor nieuwe content-modellen door een content-handler toe te voegen.
- Een media-type ondersteunen : Extensies kunnen de standaardset ondersteunde mediabestandstypen uitbreiden door een media-handler toe te voegen.
Moderatie hulpmiddelen
- Een gebruikers- of systeemactie loggen : Op wiki worden acties gevolgd voor transparantie en samenwerking. Om deze functie te ondersteunen, kunnen extensies aangepaste vermeldingen en functionaliteit toevoegen aan Special:Log.
- Een vlag aan iets toevoegen om aan te geven dat het recent gewijzigd is : Extensies kunnen aangepaste vlaggen toevoegen aan de volgende speciale pagina's om moderators te helpen bij het volgen van paginawijzigingen: Special:RecentChanges, Special:Watchlist, Special:RecentChangesLinked
- Een vlag toevoegen vanwege een revisie : Extensies kunnen annotaties toevoegen die zijn verbonden aan een revisie of log-invoer, zoals voor bewerkingen die met de extensie VisualEditor worden gemaakt.
Authenticatie
- Een provider toevoegen : Extensies kunnen ondersteuning toevoegen voor nieuwe inlog-mechanismen en sessiebeheermethoden.
Database-tabellen toevoegen
Controleer dat de extensie niet de kern database tabellen aanpast. Een extensie moet eigen tabellen aanmaken met foreign keys naar de bestaande tabellen.
Als uw extensie eigen tabellen moet toevoegen, gebruik de hook LoadExtensionSchemaUpdates . Bekijk de handleidingpagina voor meer informatie over het gebruik.
Registeren attributen voor andere extensies
Met attributen kunnen extensies iets registreren, zoals een module, met een andere extensie. Extensies kunnen bijvoorbeeld gebruik maken van attributen om een plug-in module te registreren met de extensie VisualEditor. Voor meer informatie, zie Extension registration .
Lokalisatie
|
$wgMainCacheType = CACHE_NONE
en $wgCacheDirectory = false
, anders zullen systeemmeldingen waarschijnlijk niet weergeven worden.Als u wilt dat de extensie gebruikt wordt op meertalige wiki's, dan is het verstandig om lokalisatie te ondersteunen in uw extensie.
Berichten opslaan in <language-key>.json
Sla berichtdefinities in een lokalisatie JSON-bestand op, één voor elke taal waarin uw extensie vertaald is. De berichten worden opgeslagen met een berichtsleutel en het bericht zelf in standaard JSON format. Elk bericht ID moet kleine letters bevatten en mag geen spaties bevatten. Elke key moet beginnen met de naam van de extensie in kleine letters. Een voorbeeld hiervan kunt u zien in de extensie MobileFrontend. Hier is een voorbeeld van een minimum JSON bestand (in dit geval "en.json":
en.json
{
"myextension-desc": "Adds the MyExtension great functionality.",
"myextension-action-message": "This is a test message"
}
Berichtdocumentatie opslaan in "qqq".json
De documentatie voor berichtsleutels kan opgeslagen worden in het JSON bestand for de pseudo-taal met de code qqq. de documentatie voor het voorbeeld hierboven kan er zo uitzien:
qqq.json:
{
"myextension-desc": "The description of MyExtension used in Extension credits.",
"myextension-action-message": "Adds 'message' after 'action' triggered by user."
}
lokalisatiebestand laden
In uw extension.json
, definieer de locatie van uw berichtbestanden (bijv. in de map i18n/
):
{
"MessagesDirs": {
"MyExtension": [
"i18n"
]
}
}
Gebruik wfMessage in PHP
in uw installatie- en implementatiecode, vervang elke statisch bericht met een call naar wfMessage( $msgID, $param1, $param2, ... )
.
In classes die IContextSource toepassen (alsook sommige subclasses van SpecialPage), kunt u in plaats daarvan $this->msg( $msgID, $param1, $param2, ... )
gebruiken.
Voorbeeld:
wfMessage( 'myextension-addition', '1', '2', '3' )->parse()
Gebruik mw.message in JavaScript
het is mogelijk om i18n functies in JavaScript te gebruiken. zie Handleiding:Messages API voor details.
Publiceren
Om de documentatie van de bestaande extensie te auto-categoriseren en te standaardiseren, zie Sjabloon:Extensie . om uw nieuwe extensie aan deze Wiki toe te voegen:
Een ontwikkelaar die de eigen code deelt in de MediaWiki code repository kan verwachten:
- Feedback / Kritiek / Review van de code
- Review en commentaar door andere ontwikkelaars over zaken als framework gebruik, veiligheid, efficiëntie en bruikbaarheid.
- Optimaliseren, verbeteren
- Andere ontwikkelaars kunnen uw code aanpassen om het te verbeteren, optimaliseren, op te schonen, te voldoen aan standaarden over bijvoorbeeld codeer conventies, aanpassen voor nieuwe framework classes en methoden en vertalingen.
- Verbeterde toegang voor wiki systeembeheerders
- Als u besluit om uw code op de wiki te zetten,mag een andere ontwikkelaar besluiten het te verplaatsen naar de MediaWiki code repository omdat het daar eenvoudiger te onderhouden is. U kunt dan een Ontwikkelaarsaccount aanmaken om het beheer ervan te blijven doen.
- Toekomstige versies van andere ontwikkelaars.
- Er worden automatisch nieuwe branches van uw code aangemaakt als er een nieuwe versie van MediaWiki uitkomt. U dient deze branches te backporten als u oudere versies wilt blijven ondersteunen.
- Het overnemen van uw code in een andere extensie met hetzelfde of vergelijke doelen, het overnemen van de beste functies van elke extensie.
- Credit
- Het bedanken voor uw werk wordt ook in toekomstige versies gedaan, ook bij elke extensie die uw code heeft overgenomen.
- Dat betekent ook dat u dat zelf moet aangeven, geef de credits aan degenen waar u wat code van heeft overgenomen.
Als u zich niet gemakkelijk voelt bij het uitvoeren van een van deze acties, plaats uw code dan niet in de repository. Ongeacht waar u uw code neerzet, zien we graag dat u een samenvattingspagina op de wiki aanmaakt voor uw extensie zodat iedereen kan lezen over uw extensie, en waar het te downloaden is.
Inzetten en registreren
Als het uw bedoeling is de extensie op de Wikimedia websites te gebruiken (inclusief mogelijk Wikipedia), dan is aanvullend onderzoek nodig op gebied van performance en veiligheid. raadpleeg Writing an extension for deployment .
Als uw extensie namespaces toevoegt, dan wilt u wellicht de standaard namespaces van de extensie registeren; soortgelijk, als er database-tabellen of -velden worden toegevoegd, dan kan dat bij database field prefixes geregistreerd worden.
Weet dat het beoordelen en gebruiken van nieuwe extensies op de Wikimedia websites lang kan duren, in enkele gevallen heeft het meer dan 2 jaar geduurd.[4]
Hulpdocumentatie
U moet publiek domein hulpdocumentatie voor functies van uw extensie beschikbaar maken.
De conventie is dat extensies hun gebruikersgerichte helppagina's hebben onder een pseudo-namespace van Help:Extension:<ExtensionName>
, met welke subpagina's dan ook die nodig zijn (de pagina op het hoogste niveau wordt automatisch gelinkt vanuit de infobox van de extensie als deze bestaat).
Help:CirrusSearch is een voorbeeld van goede documentatie.
U moet gebruikers een link naar de documentatie geven via de functie addHelpLink() .
Updates releasen
Er zijn een aantal gemeenschappelijke benaderingen voor het vrijgeven van updates van extensies.
These are generally defined according to the compatibility policy of the extension (master
, rel
, or ltsrel
):
master
– Releases kunnen worden getagged met versienummer op de master branch en documentatie op de homepage van de extensie waarin wordt beschreven welke versie van de extensie compatibel is met welke kernversie. De branches worden nog steeds automatisch gecreëerd en u kunt deze verwijderen als u ze niet wilt gaan gebruiken.rel
enltsrel
– Release door wijzigingen in deREL1_*
-branches terug te zetten (alle wijzigingen, of alleen kritieke). Versienummers zijn over het algemeen niet nodig, tenzij de extensie afhankelijk is van een andere extensie (het versienummer kan dan worden opgegeven in de configuratie van de andere extensie om ervoor te zorgen dat incompatibele combinaties niet worden geïnstalleerd). Veel extensies houden jarenlang hetzelfde versienummer.
Andere core versies ondersteunen
Er zijn twee veelgebruikte conventies voor het ondersteunen van oudere versies van de MediaWiki:
- Master: de master branch van de extensie is compatibel met zoveel mogelijk versies van de core. Dit zorgt voor een last bij het onderhouden (backward compatibiliteit moet lange tijd mogelijk zijn en aanpassingen aan de extensie moeten dus op meerdere versies van de MediaWiki getest worden), maar het zorgt wel dat ook websites met oudere MediaWiki versies voordelen hebben bij recent toegevoegde functionaliteit van de extensie.
- Release branches: de release branches van een extensie zijn compatibel met de overeenkomende branches van de core, dus websites die MediaWiki 1.43 gebruiken dienen de REL1_43 branch van de extensie te gebruiken. (Voor extensies gehost op gerrit, deze branches worden automatisch aangemaakt bij de release d van een nieuwe versie van MediaWiki.) Dit zorgt voor een schonere code en een snellere ontwikkeling, maar gebruikers op een oudere versie van MediaWiki profiteren niet van het oplossen van fouten en nieuwe functionaliteit tenzij deze wijzigingen handmatig worden toegevoegd aan de oudere versie.
De onderhouders van een extensie dienen met de compatibility policy
parameter van het sjabloon {{Extensie }} aan te geven welke conventie er voor die extensie gevolgd wordt.
Ondersteuning bieden / samenwerken
extensie-ontwikkelaars moeten een account maken op Wikimedia's Phabricator , en een nieuw project voor de extensie aanvragen. Dit biedt een publiek forum waar gebruikers problemen en suggesties kunnen bieden, en kunt u samenwerken met gebruikers en ontwikkelaars om bugs te vinden en toekomstige functionaliteiten toe te voegen aan de extensie.
Zie ook
- Manual:Extension registration – verstrekt verdere documentatie voor de ontwikkelaar over de registratie van extensies en skins.
- API:Extensions – legt uit hoe de extensie een API kan bieden aan cliënten.
- Manual:Extending wiki markup
- Manual:Coding conventions
- Beste gebruik bij extensies
- ResourceLoader
Leren door voorbeelden
- Extension:Examples – Implementeert sommige voorbeeldfunctionaliteiten met uitgebreide interne documentatie
- Extension:BoilerPlate – een functionele boilerplate extensie, handig als startpunt voor uw eigen extensie (git repo)
- Lees de voorbeeld extensie, baseer de eigen code op de extensie BoilerPlate.
- cookiecutter-mediawiki-extension – Een cookiecutter sjabloon om een BoilerPlate extensie te genereren (met variabelen enz.)
- Zorgen ervoor dat u snel met uw eigen extensie aan de slag kunt.
- Kan ook de BoilerPlate extensie genereren.
- List of simple extensions - Kopieer specifieke code daarvan.