Manual: Entwickeln von Erweiterungen

This page is a translated version of the page Manual:Developing extensions and the translation is 77% complete.
Outdated translations are marked like this.
MediaWiki-Erweiterungen

Jede Erweiterung besteht aus drei Teilen:

  1. Einrichtung
  2. Ausführung
  3. Lokalisierung

Eine minimale Erweiterung besteht aus der folgenden Struktur:

MyExtension/extension.json
Speichert die setup-Anleitung. Der Dateiname muss "extension.json" lauten. (Vor MediaWiki 1.25 befanden sich die Setup-Anweisungen in einer MyExtension/MyExtension.php-Datei, die nach der Erweiterung benannt wurde. Viele Erweiterungen halten in dieser PHP-Datei noch Abwärtskompatibilitäten bereit.)
MyExtension/includes/ (or MyExtension/src/)
Enthält den auszuführenden PHP-Code für die Erweiterung.
MyExtension/resources/ (or MyExtension/modules/)
Stores the client-side resources such as JavaScript, CSS and LESS for the extension.
MyExtension/i18n/*.json
Enthält Lokalisierungsinformation für die Erweiterung.

Wenn du eine Erweiterung entwickelst, ersetze MyExtension durch den tatsächlichen Namen deiner Erweiterung. Benutze UpperCamelCase-Namen für das Verzeichnis und die PHP-Datei(en); das entspricht der allgemeinen Dateinamenskonvention.[1] (Ein guter Ausgangspunkt für eine eigene Erweiterung ist die BoilerPlate extension.)

Während der Entwicklungsphase kann es sinnvoll sein, das Caching mit $wgMainCacheType = CACHE_NONE und $wgCacheDirectory = false abzuschalten, sonst werden Systemmeldungen und andere Änderungen möglicherweise nicht angezeigt.

Einrichtung

Ihr Ziel beim Schreiben des Setup-Teils ist es, die Installation der Erweiterung so einfach wie möglich zu gestalten, sodass Benutzer diese Zeile nur zu LocalSettings.php hinzufügen müssen:

wfLoadExtension( 'MyExtension' );

Wenn Sie Ihren Erweiterungsbenutzer konfigurierbar machen möchten, müssen Sie einige Konfigurationsparameter definieren und dokumentieren. Das Setup Ihrer Benutzer sollte ungefähr so aussehen:

wfLoadExtension( 'MyExtension' );
$wgMyExtensionConfigThis = 1;
$wgMyExtensionConfigThat = false;

Um diese Einfachheit zu erreichen, muss Ihre Setup-Datei eine Reihe von Aufgaben ausführen (die in den folgenden Abschnitten ausführlich beschrieben werden):

  • Definieren und / oder validieren Sie alle Konfigurationsvariablen, die Sie für Ihre Erweiterung definiert haben.
  • Bereiten Sie die von Ihrer Erweiterung verwendeten Klassen für das automatische Laden vor
  • Legen Sie fest, welche Teile Ihres Setups sofort ausgeführt werden sollen und welche zurückgestellt werden müssen, bis der MediaWiki-Kern initialisiert und konfiguriert wurde
  • Definieren Sie alle zusätzlichen hooks, die von Ihrer Erweiterung benötigt werden
  • Erstellen oder überprüfen Sie alle neuen Datenbanktabellen, die für Ihre Erweiterung erforderlich sind.
  • Richten Sie die Lokalisierung für Ihre Erweiterung ein
Good practice is to add a README file with basic info about how to install and configure the extension. You can use either plain text or Phabricator markup syntax. For example, see the Phabricator Diffusion page for the Erweiterung:Seitenformulare . If markdown is used, add the file extension .md. For example, see the README.md file for Parsoid on Phabricator Diffusion.

Registrieren von Funktionen bei MediaWiki

MediaWiki listet alle Erweiterungen auf, die auf der Seite Special:Version installiert wurden. Beispielsweise können Sie alle in diesem Wiki installierten Erweiterungen unter Special:Version anzeigen.

MediaWiki Version:
1.25

Um diese zu erreichen, sind die Erweiterungsdetails zu extension.json hinzuzufügen. Der Eintrag sieht ungefähr so aus:

{
	"name": "Example",
	"author": "John Doe",
	"url": "https://www.mediawiki.org/wiki/Extension:Example",
	"description": "This extension is an example and performs no discernible function",
	"version": "1.5",
	"license-name": "GPL-2.0-or-later",
	"type": "validextensionclass",
	"manifest_version": 1
}


Viele der Felder sind optional, aber es wird immer noch empfohlen, sie auszufüllen. The manifest_version refers to the version of the schema the extension.json file is written against. Die verfügbaren Versionen sind 1 und 2. Eine Dokumentation zu dieser Funktion findet sich hier. Unless you need to support an older version of MediaWiki, pick the latest version.

Zusätzlich zu der oben genannten Registrierung müssen Sie Ihre Funktion auch in MediaWiki "einbinden". Das Obige richtet nur die Seite Special: Version ein. The way you do this depends on the type of your extension. Einzelheiten finden Sie in der Dokumentation zu den einzelnen Erweiterungstypen:

Machen Sie Ihre Erweiterung konfigurierbar

Wenn Ihr Benutzer Ihre Erweiterung konfigurieren kann, müssen Sie eine oder mehrere Konfigurationsvariablen angeben. Es ist eine gute Idee, diesen Variablen einen eindeutigen Namen zu geben. Sie sollten auch MediaWiki Namenskonventionen folgen (z. B. sollten globale Variablen mit $wg beginnen).

Wenn die Erweiterung beispielsweise "MeineErweiterung" heißt, liegt es nahe, die Benennung aller Konfigurationsvariablen mit $wgMeineErweiterung beginnen zu lassen. Dabei ist wichtig, dass keine des MediaWiki-Kerns seine Variablen auf diese Weise beginnt und in ausreichender Weise überprüft wurde, dass keine der veröffentlichten Erweiterungen ihre Variablen auf diese Weise beginnt. Benutzer müssen sich nicht zwischen Ihrer Erweiterung und einigen anderen Erweiterungen entscheiden, da Sie überlappende Variablennamen ausgewählt haben.

Es ist auch eine gute Idee, eine ausführliche Dokumentation aller Konfigurationsvariablen in Ihre Installationshinweise aufzunehmen.

Hier ist eine Beispielvorlage, mit der Sie loslegen können:

{
	"name": "BoilerPlate",
	"version": "0.0.0",
	"author": [
		"Your Name"
	],
	"url": "https://www.mediawiki.org/wiki/Extension:BoilerPlate",
	"descriptionmsg": "boilerplate-desc",
	"license-name": "GPL-2.0-or-later",
	"type": "other",
	"AutoloadClasses": {
		"BoilerPlateHooks": "includes/BoilerPlateHooks.php",
		"SpecialHelloWorld": "includes/SpecialHelloWorld.php"
	},
	"config": {
		"BoilerPlateEnableFoo": {
			"value": true,
			"description": "Enables the foo functionality"
		}
	},
	"callback": "BoilerPlateHooks::onExtensionLoad",
	"ExtensionMessagesFiles": {
		"BoilerPlateAlias": "BoilerPlate.i18n.alias.php"
	},
	"Hooks": {
		"NameOfHook": "BoilerPlateHooks::onNameOfHook"
	},
	"MessagesDirs": {
		"BoilerPlate": [
			"i18n"
		]
	},
	"ResourceModules": {
		"ext.boilerPlate.foo": {
			"scripts": [
				"resources/ext.boilerPlate.js",
				"resources/ext.boilerPlate.foo.js"
			],
			"styles": [
				"resources/ext.boilerPlate.foo.css"
			]
		}
	},
	"ResourceFileModulePaths": {
		"localBasePath": "",
		"remoteExtPath": "BoilerPlate"
	},
	"SpecialPages": {
		"HelloWorld": "SpecialHelloWorld"
	},
	"manifest_version": 2
}

Note that after calling wfLoadExtension( 'BoilerPlate' ); the global variable $wgBoilerPlateEnableFoo does not exist. If you set the variable, e.g. in LocalSettings.php then the default value given in extension.json will not be used.

For more details on how to use global variable inside custom extensions, please refer to Manual:Configuration for developers .

Klassen für das automatische Laden vorbereiten

Wenn Sie Klassen zum Implementieren Ihrer Erweiterung verwenden, bietet MediaWiki einen vereinfachten Mechanismus, mit dem PHP die Quelldatei finden kann, in der sich Ihre Klasse befindet. In most cases this should eliminate the need to write your own __autoload($classname) method.

To use MediaWiki's autoloading mechanism, you add entries to the AutoloadClasses field. Der Schlüssel jedes Eintrags ist der Klassenname. Der Wert ist die Datei, in der die Definition der Klasse gespeichert ist. Bei einer einfachen Erweiterung mit einer Klasse erhält die Klasse normalerweise denselben Namen wie die Erweiterung, sodass Ihr Abschnitt zum automatischen Laden möglicherweise folgendermaßen aussieht (die Erweiterung heißt "MyExtension"):

{
	"AutoloadClasses": {
		"MyExtension": "includes/MyExtension.php"
	}
}

Der Dateiname bezieht sich auf das Verzeichnis, in dem sich die Datei extension.json befindet.

For more complex extensions, namespaces should be considered. See Manual:Extension.json/Schema#AutoloadNamespaces for details.

Zusätzliche Hooks definieren

Siehe Handbuch:Hooks .

Datenbank Tabellen hinzufügen

Make sure the extension doesn't modify the core database tables. Instead, extension should create new tables with foreign keys to the relevant MW tables.

  Warnung: If your extension is used on any production WMF-hosted wiki please follow the Schema change guide.

If your extension needs to add its own database tables, use the LoadExtensionSchemaUpdates hook. Weitere Informationen zur Verwendung finden Sie auf der Handbuchseite.

Lokalisierung einrichten

Siehe:

Logs hinzufügen

In MediaWiki werden alle Aktionen von Benutzern im Wiki auf Transparenz und Zusammenarbeit hin verfolgt. Siehe Manual:Logging to Special:Log für die Durchführung.

Handling dependencies

Assume that an extension requires the presence of another extension, for example because functionalities or database tables are to be used and error messages are to be avoided in case of non-existence.

For example the extension CountingMarker requires the presence of the extension HitCounters for certain functions.

One way to specify this would be by using the requires key in extension.json.

Another option is using ExtensionRegistry (available since MW 1.25):

	if ( ExtensionRegistry::getInstance()->isLoaded( 'HitCounters', '>=1.1' ) {
		/* do some extra stuff, if extension HitCounters is present in version 1.1 and above */
	}

Currently (as of February 2024, MediaWiki 1.41.0) the name of the extension-to-be-checked needs to exactly match the name in their extension.json.[2][3]

Example: if you want to check the load status of extension "OpenIDConnect", you have to use it with a space

	if ( ExtensionRegistry::getInstance()->isLoaded( 'OpenID Connect' ) {
    ...
	}

Lokalisierung

While developing, you may want to disable both cache by setting $wgMainCacheType = CACHE_NONE and $wgCacheDirectory = false, otherwise your system message changes may not show up.

Wenn Sie möchten, dass Ihre Erweiterung in Wikis mit mehrsprachiger Leserschaft verwendet wird, müssen Sie Ihrer Erweiterung Lokalisierungsunterstützung hinzufügen.

Speichern Sie Nachrichten in <Sprachschlüssel>.json

Speichern Sie Nachrichtendefinitionen in einer Lokalisierungs-JSON-Datei, eine für jeden Sprachschlüssel, in den Ihre Erweiterung übersetzt wird. Die Nachrichten werden mit einem Nachrichtenschlüssel und die Nachricht selbst im Standard-JSON-Format gespeichert. Jede Nachrichten-ID sollte in Kleinbuchstaben geschrieben sein und darf keine Leerzeichen enthalten. Each key should begin with the lowercased extension name. Ein Beispiel findet sich in der MobileFrontend-Erweiterung. Hier ist ein Beispiel für eine minimale JSON-Datei (in diesem Fall en.json:

en.json

{
	"myextension-desc": "Adds the MyExtension great functionality.",
	"myextension-action-message": "This is a test message"
}

Speichern Sie die Nachrichtendokumentation in qqq.json

Die Dokumentation für Nachrichtenschlüssel kann in der JSON-Datei für die Pseudosprache mit dem Code qqq gespeichert werden. Eine Dokumentation des obigen Beispiels kann sein:

qqq.json:

{
	"myextension-desc": "The description of MyExtension used in Extension credits.",
	"myextension-action-message": "Adds 'message' after 'action' triggered by user."
}

Laden Sie die Lokalisierungsdatei

In der extension.json ist der Speicherort der Nachrichtendateien (z. B. im Verzeichnis i18n/) festzulegen:

{
	"MessagesDirs": {
		"MyExtension": [
			"i18n"
		]
	}
}

Verwenden Sie wfMessage in PHP

Ersetzen Sie in Ihrem Setup- und Implementierungscode jede wörtliche Verwendung der Nachricht durch einen Aufruf von wfMessage( $msgID, $param1, $param2, ... ). In Klassen, die IContextSource implementieren (sowie in einigen anderen, z. B. Unterklassen von SpecialPage), können Sie stattdessen $this->msg( $msgID, $param1, $param2, ... ) verwenden. Beispiel:

wfMessage( 'myextension-addition', '1', '2', '3' )->parse()

Verwenden Sie mw.message in JavaScript

Es ist auch möglich, i18n-Funktionen in JavaScript zu verwenden. Look at Handbuch:Messages-API for details.

Erweiterungstypen

Erweiterungen können basierend auf den Programmiertechniken kategorisiert werden, mit denen ihre Wirkung erzielt wird. Die meisten komplexen Erweiterungen verwenden mehr als eine dieser Techniken:

  • Unterklasse: MediaWiki erwartet, dass bestimmte Arten von Erweiterungen als Unterklassen einer von MediaWiki bereitgestellten Basisklasse implementiert werden:
    • Spezialseiten – Unterklassen der SpecialPage -Klasse werden zum Erstellen von Seiten verwendet, deren Inhalt mithilfe einer Kombination aus dem aktuellen Systemstatus, Benutzereingabeparametern und Datenbankabfragen dynamisch generiert wird. Es können sowohl Berichte als auch Dateneingabeformulare generiert werden. Sie werden sowohl für Berichts- als auch für Verwaltungszwecke verwendet.
    • Handbuch:Oberflächen – Skins ändern das Erscheinungsbild von MediaWiki, indem sie den Code ändern, der Seiten ausgibt, indem sie die MediaWiki-Klasse SkinTemplate unterordnen.
  • Handbuch:Hooks – Eine Technik zum Einfügen von benutzerdefiniertem PHP-Code an wichtigen Punkten der MediaWiki-Verarbeitung. Sie werden häufig vom Parser von MediaWiki, seiner Lokalisierungs-Engine, seinem Erweiterungsverwaltungssystem und seinem Seitenpflegesystem verwendet.
    • Tag-Funktions-Assoziationen XML Stil-Tags, die einer PHP-Funktion zugeordnet sind, die HTML-Code ausgibt. Sie müssen sich nicht darauf beschränken, den Text in den Tags zu formatieren. Sie müssen es nicht einmal anzeigen. Viele Tag-Erweiterungen verwenden den Text als Parameter für die Generierung von HTML, in das Google-Objekte, Dateneingabeformulare, RSS-Feeds und Auszüge aus ausgewählten Wiki-Artikeln eingebettet sind.
  • Handbuch:Magische Wörter – Eine Technik zum Zuordnen einer Vielzahl von Wiki-Textzeichenfolgen zu einer einzelnen ID, die einer Funktion zugeordnet ist. Sowohl Variablen als auch Parser-Funktionen verwenden diese Technik. Der gesamte dieser ID zugeordnete Text wird durch den Rückgabewert der Funktion ersetzt. Die Zuordnung zwischen den Textzeichenfolgen und der ID wird im Array $magicWords gespeichert. Die Interpretation der ID ist ein etwas komplexer Prozess - siehe Handbuch:Magische Wörter für weitere Informationen.
    • Handbuch:Variable – Variablen sind eine Art Fehlbezeichnung. Es handelt sich um Wikitext-Bits, die wie Vorlagen aussehen, jedoch keine Parameter haben und fest codierte Werte erhalten haben. Standard-Wiki-Markups wie {{PAGENAME}} oder {{SITENAME}} sind Beispiele für Variablen. Sie erhalten ihren Namen von der Quelle ihres Wertes: eine PHP-Variable oder etwas, das einer Variablen zugewiesen werden könnte, z. eine Zeichenfolge, eine Zahl, ein Ausdruck oder ein Funktionsrückgabewert.
    • Parser-Funktionen {{functionname: argument 1 | argument 2 | argument 3...}}. Ähnlich wie bei Tag-Erweiterungen verarbeiten Parser-Funktionen Argumente und geben einen Wert zurück. Im Gegensatz zu Tag-Erweiterungen ist das Ergebnis von Parser-Funktionen wikitext.
  • API Module you can add custom modules to MediaWiki's action API, that can be invoked by JavaScript, bots or third-party clients.
  • Page content models If you need to store data in formats other than wikitext, JSON, etc. then you can create a new ContentHandler .

Unterstützt andere Kernversionen

Es gibt zwei weit verbreitete Konventionen zur Unterstützung älterer Versionen von MediaWiki Core:

  • Master: Der Master-Zweig der Erweiterung ist mit so vielen alten Core-Versionen wie möglich kompatibel. Dies führt zu einem Wartungsaufwand (Abwärtskompatibilitäts-Hacks müssen lange Zeit beibehalten werden, und Änderungen an der Erweiterung müssen mit mehreren MediaWiki-Versionen getestet werden). Websites, auf denen alte MediaWiki-Versionen ausgeführt werden, profitieren jedoch von den kürzlich hinzugefügten Funktionen Erweiterung.
  • Freigabezweige: Freigabezweige der Erweiterung sind mit übereinstimmenden Zweigen des Kerns kompatibel, z. Sites, die MediaWiki Template:MW Stable Branch Number verwenden, müssen den Zweig Template:MW Stable Branch Git der Erweiterung verwenden. (Bei Erweiterungen, die auf gerrit gehostet werden, werden diese Zweige automatisch erstellt, wenn neue Versionen von MediaWiki veröffentlicht werden.) Dies führt zu sauberem Code und einer schnelleren Entwicklung, aber Benutzer alter Kernversionen profitieren nur dann von Bugfixes und neuen Funktionen, wenn dies der Fall ist Backported manuell.

(For extensions hosted on gerrit, these branches are automatically created when new versions of MediaWiki are released.) This results in cleaner code and faster development but users on old core versions do not benefit from bugfixes and new features unless they are backported manually.

Extension maintainers should declare with the compatibility policy parameter of the {{Vorlage:Erweiterung }} template which convention they follow.

Lizenz

MediaWiki is an open-source project and users are encouraged to make any MediaWiki extensions under an Open Source Initiative (OSI) approved license compatible with GPL-2.0-or-later (Wikimedia's standard software license).

We recommend adopting one of the following compatible licenses for your projects in Gerrit:

For extensions that have a compatible license, you can request developer access to the MediaWiki source repositories for extensions. To specify the licence in code and with "license-name" a key should be used to provide it's short name, e.g. "GPL-2.0-or-later" or "MIT" adhering to the list of identifiers at spdx.org.


Veröffentlichung

To autocategorize and standardize the documentation of your existing extension, please see Vorlage:Erweiterung . So fügen Sie Ihrem Wiki Ihre neue Erweiterung hinzu:


Ein Entwickler, der sein Code im MediaWiki-Coderepositorium teilt, sollte folgendes erwarten:

Rückmeldung / Kritik / Code-Überprüfungen
Review and comments by other developers on things like framework use, security, efficiency and usability.
Developer tweaking
Other developers modifying your submission to improve or clean-up your code to meet new framework classes and methods, coding conventions and translations.
Improved access for wiki sysadmins
If you do decide to put your code on the wiki, another developer may decide to move it to the MediaWiki code repository for easier maintenance. You may then create a Entwicklerkonto to continue maintaining it.
Zukünftige Versionen von anderen Entwicklern
New branches of your code being created automatically as new versions of MediaWiki are released. You should backport to these branches if you want to support older versions.
Incorporation of your code into other extensions with duplicate or similar purposes — incorporating the best features from each extension.
Credit
Credit for your work being preserved in future versions — including any merged extensions.
Similarly, you should credit the developers of any extensions whose code you borrow from — especially when performing a merger.

Any developer who is uncomfortable with any of these actions occurring should not host in the code repository. You are still encouraged to create a summary page for your extension on the wiki to let people know about the extension, and where to download it.

Bereitstellen und Registrieren

Wenn Sie beabsichtigen, Ihre Erweiterung auf Wikimedia-Websites (einschließlich möglicherweise Wikipedia) bereitzustellen, ist eine zusätzliche Prüfung in Bezug auf Leistung und Sicherheit erforderlich. Consult Writing an extension for deployment .

If your extension adds namespaces, you may wish to register its default namespaces; likewise, if it adds database tables or fields, you may want to register those at Datenbankfeld-Präfixe .

Bitte beachten Sie, dass die Überprüfung und Bereitstellung neuer Erweiterungen auf Wikimedia-Websites sehr langsam sein kann und in einigen Fällen mehr als zwei Jahre gedauert hat. [4]

Hilfedokumentation

Sie sollten Public-Domain-Hilfedokumentation für Funktionen bereitstellen, die von Ihrer Erweiterung bereitgestellt werden. Help:CirrusSearch/de ist ein gutes Beispiel. Sie sollten Benutzern über die Funktion addHelpLink() einen Link zur Dokumentation geben.

Bereitstellung von Unterstützung/Zusammenarbeit

Erweiterungsentwickler sollten ein Konto bei Wikimedia Phabricator eröffnen und ein neues Projekt für die Erweiterung anfordern. Dies bietet einen öffentlichen Ort, an dem Benutzer Probleme und Vorschläge einreichen können, und Sie können mit Benutzern und anderen Entwicklern zusammenarbeiten, um Fehler zu ermitteln und Funktionen Ihrer Erweiterung zu planen.

Siehe auch

Learn by example


Einzelnachweise