Jump to content

Hilfe:Templates (Vorlagen)

From mediawiki.org
This page is a translated version of the page Help:Templates and the translation is 77% complete.
Outdated translations are marked like this.
PD Hinweis: Wenn Du diese Seite bearbeitest, stimmst Du zu, dass Dein Beitrag unter der [CC0] veröffentlicht wird. Mehr Informationen findest du auf der Public Domain Hilfeseite. PD

Wenn du Standardtexte verwendest, die auf mehreren Seiten erscheinen sollen, kommt die MediaWiki-Funktion Template ins Spiel. Anders als Erweiterungen und Mediendateien gibt es keine zentrale Quelle für Templates. Templates können neu geschrieben oder, um doppelte Arbeit zu sparen, von einem anderen Wiki wie z.B. Wikipedia exportiert und dann ins Zielwiki importiert werden.

Grundlagen

Templates sind Standard-Wiki-Seiten, deren Inhalt so konzipiert ist, dass er in andere Seiten transkludiert (eingebunden) werden kann. Templates folgen einer Konvention, laut welcher dem Namen das Präfix „Template:“ vorangestellt wird, um sie diesem Namensraum zuzuweisen; abgesehen davon können sie wie jede andere Wiki-Seite erstellt werden.

Um ein Template einzufügen, verwende doppelte geschweifte Klammern, um den {{Template-Namen}} herum.

Die einfachste Verwendung von Templates ist die folgende: Erstelle eine Seite mit dem Namen Template:Welcome und folgendem Inhalt:

Hallo! Willkommen im Wiki.

Du hast dein erstes Template erstellt! Füge nun den unten stehenden Code in eine neue Seite ein:

{{Welcome}}

Wenn die neue Seite aufgerufen wird, erscheint der Text „Hallo! Willkommen im Wiki“ anstelle von {{Welcome}}. Der Inhalt des Templates wird in die andere Seite transkludiert, d.h. er wird in die Seite integriert.

Du kannst dann {{Welcome}} an jeder beliebigen Stelle einer Seite einfügen, auf der du jemanden begrüßen möchtest. Nehmen wir an, es wird auf 100 Seiten verwendet. Wenn dann der Inhalt des Templates in geändert wird:

Hallo zusammen! Willkommen in diesem wundervollen Wiki.

und man eine der 100 Seiten, in der die Vorlage verwendet wurde, erneut besucht, wirst du den neuen Text anstelle des ursprünglichen sehen. Auf diese Weise kann man die Inhalte von 100 Seiten ändern, ohne diese bearbeitet zu haben – und das nur, weil die Vorlage in diese Seiten eingebunden ist.

Dies ist die grundsätzliche Funktionsweise. Es gibt viele zusätzliche Funktionen, die diese Funktionsweise erweitern und die Verwendung von Vorlagen sehr nützlich machen.

Wie man eine Vorlage aufruft

Templates können in anderen Seiten auf diese Weise verwendet werden:

  • {{Name}} – Wie oben beschrieben, wird dieser Text (allgemein als „Template-Call“ bezeichnet) dynamisch durch den Inhalt der Seite mit dem Titel Template:Name ersetzt (ein Prozess, der "Transklusion" genannt wird), jedes Mal, wenn die Seite mit dem Template-Call geladen wird (d.h. aus Sicht eines Lesers des Wikis). Da der Template-Call im Quelltext der Seiten verbleibt, wird jede spätere Änderung an Template:Name auf der Seite sichtbar, die den Template-Call enthält. Außerdem wird die Seite unter den Seiten aufgelistet, die auf das Template „verweisen“.
  • {{subst:Name}} — wenn diese Art des Aufrufs einer Vorlage verwendet wird, wird sie durch eine statische Kopie des Inhalts von Vorlage:Name ab dem Zeitpunkt ersetzt, an dem die Seite, die den Vorlagenaufruf enthält, gespeichert wird. Das heißt, eine Kopie des Inhalts von Vorlage:Name wird für den Aufruf der Vorlage ersetzt. Es gibt keine Verknüpfung zwischen der Seite und dem Template, sodass beide unabhänig voneinander bearbeitet werden können. Tatsächlich besteht deshalb kaum ein Unterschied zwischen dieser Vorgehensweise und dem üblichen Weg, also den Text "manuell" in den Quelltext einzugeben. Für weitere Informationen siehe Hilfe:Substitution .
  • {{safesubst:Name}} — dies wurde eingeführt, um das Ersetzen zu ermöglichen, ohne die Transklusion zu unterbrechen. Für weitere Informationen siehe Hilfe:Substitution .
  • {{msgnw:Name}} — wenn die Seite, die diese Anweisung enthält, aufgerufen wird, wird die Vorlage so eingefügt, dass ihr Inhalt als rohe Wikisyntax angezeigt wird — in gleicher Weise wie ‎<nowiki>. Zum Beispiel zeigt {{msgnw:Template:Thankyou}}:

<noinclude> <languages/> </noinclude> '''Ein kleines Dankeschön...''' für {{{reason|{{{1}}}}}}. Grüße, {{{signature|{{{2}}}}}} <noinclude> [[Category:Template examples{{#translation:}}|{{PAGENAME}}]] </noinclude>

Jede Wikiseite kann als Vorlage verwendet werden. Einfach, indem man den Namensbereich angibt, dem sie angehört.

  • {{Template:Pagename}} bindet [[Template:Pagename]] ein (identisch zu {{Pagename}})
  • {{Talk:Pagename}} bindet Talk:Pagename ein
  • {{:Pagename}} bindet die Seite Pagename ein (im Hauptnamensraum)
    • {{subst::Pagename}} ersetzt den Inhalt der Seite mit dem Titel Pagename

Wenn kein solcher Namensraum vorhanden ist, wird angenommen, dass der vollständige Titel der Vorlagenname ist.

  • {{Foo:Bar}} transkludiert Template:Foo:Bar

Unabhängig davon, welche Syntax verwendet wird, kann der Name der Vorlage relativ zur aktuellen Seite sein Wenn z.B. {{/bar}} auf Seite foo aufgerufen wird, wird die Seite foo/bar transkludiert.

Sie kann auch dynamisch erzeugt werden. Zum Beispiel ruft {{ {{foo}} }} Template:foo auf und interpretiert das Ergebnis als den Namen einer anderen aufzurufenden Vorlage.

Parameter

Um die Funktionalität von Templates zu erweitern erlaubt es MediaWiki, Parameter an die Vorlage zu übergeben, wenn sie eingebunden wird. Parameter ermöglichen es dem Template, unterschiedliche Inhalte zu erzeugen oder sich unterschiedlich zu verhalten.

Angenommen, du möchtest auf der Talk-Seite anderer Benutzer ein kleines Dankeschön einfügen, wie z. B.:


Ein kleines Dankeschön... für für all deine Bemühungen. Grüße, Ich


Die Dankesnote wird einen Grund (in diesem Fall, für all deine Bemühungen) und eine Unterschrift (Ich) enthalten. Dein Ziel ist es, dass jeder Benutzer jedem anderen Benutzer danken kann, aus einem beliebigen Grund.

Damit die Notiz überall, wo sie verwendet wird, ähnlich aussieht, kann beispielsweise eine Vorlage namens Template:Thankyou definiert werden. Obwohl die Notiz überall, wo sie verwendet wird, ähnlich aussehen soll, wenn ein User einem anderen dankt, wird der genaue Inhalt (d.h. der Grund un die Signatur) unterschiedlich sein. Aus diesem Grund sollten diese als Parameter übergeben werden. Wenn wir die verbleibenden Elemente zur Formatierung der Box und zum Platzieren des Bildes ignorieren, lautet der Kerninhalt der Vorlage wie folgt:

'''Ein kleines Dankeschön...'''
für {{{1}}}.
Grüße, {{{2}}}

Die Verwendung von {{{1}}} und {{{2}}} muss beachtet werden. Auf diese Weise können innerhalb von Vorlagen die Parameter identifiziert werden, die bei der Verwendung der Vorlage angegeben werden. Beachte, dass jeder Parameter der Vorlage von drei Klammern umgeben ist: {{{ }}}. Dies unterscheidet sich von der normalen Verwendung des Namens der Vorlage.

Bei der Verwendung einer Vorlage auf einer Seite werden die Parameterwerte durch ein "Pipe"-Zeichen getrennt (|). MediaWiki erlaubt Parameter auf drei Arten an Vorlagen zu übergeben: Anonym, nummeriert und benannt.

Anonyme Parameter

Um anonyme Parameter zu übergeben, müssen die Werte der Parameter der Reihe nach aufgelistet werden:

{{Thankyou/de|deine Bemühungen|Ich}}

In diesem Fall erhält die Vorlage {{Thankyou/de}} die Parameter {{{1}}}=deine Bemühungen und {{{2}}}=Ich, was folgendes erzeugt:


Ein kleines Dankeschön... für deine Bemühungen. Grüße, Ich


Die Reihenfolge, in der anonyme Parameter übergeben werden, ist entscheidend für ihr Verhalten. Das Tauschen der Parameter wie folgendend:

{{Thankyou/de|Ich|deine Bemühungen}}

würde dieses Ergebnis erzeugen:


Ein kleines Dankeschön... für Ich. Grüße, deine Bemühungen


Das Identifizieren von Parametern nach Reihenfolge (mit {{{1}}} usw.) funktioniert nur mit anonymen Parametern. Alle namentlich identifizierten Parameter, wie unten gezeigt, sind für die Vorlage nicht über Ordnungszahlen zugänglich.
Wenn ein Gleichheitszeichen innerhalb des Arguments eines anonymen Parameters einer Vorlage vorkommt, wird dieser Parameter möglicherweise als ein Benannter Parameter (was weiter unten in diesem Dokument erläutert wird) falsch interpretiert, wodurch der Text vor dem Gleichheitszeichen als Parametername und der Text danach als der Wert des Arguments. Dies ist ein häufiges Problem, wenn du einen externen Link oder ein HTML-Element mit Attributen erfasst (siehe task T16235). Um das Problem zu umgehen, können benannte oder nummerierte Parameter verwendet werden, wie im folgenden Abschnitt erläutert wird.

Nummerierte Parameter

Um Parameter nummeriert zu übergeben, werden alle Parameter beim Übergeben identifiziert:

{{Thankyou/de|2=Ich|1=deine Freundschaft}}

Dieses Mal erhält die Vorlage {{Thankyou/de}} die Parameter {{{1}}}=deine Freundschaft und {{{2}}}=Ich, was folgendes erzeugt, obwohl die Parameter in umgekehrter Reihenfolge übergeben wurden:


Ein kleines Dankeschön... für deine Freundschaft. Grüße, Ich


Dies kann auch nützlich sein, wenn einer der nummerierten Parameter ein "="-Zeichen erhält.
Beispiele
{{Thankyou|1=Hinzufügen von „=“|2=Ich}}

erzeugt:


Ein kleines Dankeschön... für hinzufügen von "=". Grüße, Ich

Warnung Warnung: Dies setzt voraus, dass jeder zusätzliche Parameter nummeriert wird.

Benannte Parameter

Der dritte Weg, um Parameter zu übergeben, ist mit Namen statt mit Nummern. In diesem Fall würde der Inhalt der Vorlage zu folgendem geändert werden:

'''Ein kleines Dankeschön...'''
für {{{reason}}}.
Grüße, {{{signature}}}

Innerhalb der Vorlage werden {{{reason}}} und {{{signature}}} statt Nummern verwendet, um jeden Parameter zu identifizieren. Um Parameter benannt zu übergeben, werden alle Parameter beim Übergeben identifiziert:

{{Thankyou/de|signature=Ich|reason=sein, wer du bist}}

In diesem Fall erhält die Vorlage {{Thankyou/de}} die Parameter {{{reason}}}=sein, wer du bist und {{{signature}}}=Ich und erzeugt:


Ein kleines Dankeschön... für sein, wer du bist. Grüße, Ich


Benannte Parameter beachten Groß- und Kleinschreibung, weswegen:

{{Thankyou/de|signature=Ich|Reason=sein, wer du bist|reason=Beachtung der Groß- und Kleinschreibung}}

folgendes erzeugt:


Ein kleines Dankeschön... für Beachtung der Groß- und Kleinschreibung. Grüße, Ich


Der Vorteil der Verwendung von benannten Namensräumen in einer Vorlage ist, neben der Flexibilität der Reihenfolge der Parameter bei der Übergabe, dass der Code der Vorlage leichter zu verstehen ist, wenn viele Parameter vorkommen.

Leerzeichen und Zeilenumbrüche werden automatisch am Anfang und Ende von benannten Parameternamen und -werten entfernt, bleiben aber bei unbenannten Parametern erhalten.

Benannte und unbenannte Parameter mischen

Falls die Vorlage dies unterstützt, können beide Arten von Parametern in einem Aufruf verwendet werden.

For example, {{Thankyou|supporting both parameter types|signature=Me}} results in:


Ein kleines Dankeschön... für supporting both parameter types. Grüße, Me


Be careful when doing this, because it can result in conterintuitive results as unnamed parameter counts are based only on the unnamed parameters, not the named parameters. For example, {{Thankyou|Me|reason=supporting both parameter types}} results in:


Ein kleines Dankeschön... für supporting both parameter types. Grüße, {{{2}}}


The template is coded to prefer the named parameter for the reason over the unnamed parameter, resulting in the "Me" being lost and no signature being given. This results in a default value of {{{2}}} being shown, as explained below.

Standardwerte

Beim Einsetzen einer Vorlage, die Parameter erwartet, ohne Argumente bereitzustellen, wie folgend:

{{Thankyou/de}}

würde bei nummerierten Parametern, wie im oberen Beispiel, folgendes Ergebnis erzeugt werden:


Ein kleines Dankeschön... für {{{1}}}. Grüße, {{{2}}}


Da keine Argumente übergeben wurden präsentiert die Vorlage die bloßen Parameter statt der repräsentierten Werte. In diesem Fall wäre es hilfreich, Standardwerte für Parameter zu erzeugen, d.h. Werte, die benutzt werden, wenn keine Werte übergeben werden. Zum Beispiel, wenn die Werte der Vorlage zu folgendem geändert werden:

'''Ein kleines Dankeschön...'''
für {{{reason|alles}}}.
Grüße, {{{signature|Ich}}}

dann definiert {{{reason|alles}}}, dass, wenn keine Argumente übergeben werden, für den Parameter {{{reason}}}, der Wert alles verwendet. Genauso definiert {{{signature|Ich}}} den Standardwert des Parameters {{{signature}}} als den Wert Ich. Wenn jetzt die Vorlage eingesetzt wird, ohne Argumente zu übergeben, wird folgendes Ergebnis erzeugt:


Ein kleines Dankeschön... für alles. Grüße, Ich


Der Wert eines Parameters kann eine leere Zeichenkette sein. Zum Beispiel, in {{foo|bar=}} oder {{foo|bar=|baz=qux}}, betrachtet das foo-Template den Parameter bar als "". Dies ist etwas anderes als das Weglassen des Parameters, wodurch er undefiniert bleibt und der oben beschriebene Mechanismus des Standardwerts ausgelöst wird.
If you need to treat an empty string the same way as a missing parameter, you can use a conditional operator through an extension like ParserFunctions. For instance, {{#if:{{{1|}}}|{{{1|}}}|undefined}} returns undefined if the parameter is either undefined or empty, while {{{1|undefined}}} does so only if the parameter is undefined.

Häufig werden Standardwerte verwendet, um alternative Namen von Parametern anzugeben. Wenn du beispielsweise {{{a|{{{b|}}} }}} hast, sucht die Vorlage zuerst nach einem Parameter namens "a". Wenn es nicht gesetzt ist, wird es den Parameter namens "b" verwenden. Wenn weder "a" noch "b" gesetzt ist, wird nichts ausgegeben.

Passing parameters to other templates

If raw parameter syntax is generated by the above template call, and then passed through to another template, it is not interpreted as a parameter. This means that {{Thankyou2 }}, which just calls {{Thankyou }} with no parameters, does not work: {{thankyou2|everything|me}} -> Ein kleines Dankeschön... für {{{1}}}. Grüße, {{{2}}} .

You instead need to explicitly pass the parameter to the other template, i.e if {{Thankyou3 }} contains

{{thankyou|{{{1}}}|{{{2}}}}}}

then {{thankyou3|everything|me}} -> Ein kleines Dankeschön... für everything. Grüße, me } works properly.

This example does not preserve emptiness vs. undefinedness in parameter values - you would need more complicated syntax if you wanted to do that.

Leere vs. undefinierte Parameter

The {{t2demo|| a }} (refer to {{T2demo }} ), with a double pipe, sets the first parameter to an empty string instead of leaving it undefined. It produces the output start--middle- a -end, similar to how {{t2demo|1=|2= a }} results in start--middle- a -end. On the other hand, explicitly setting the parameter "2" to "a," results in the first unnamed parameter being left undefined:

{{t2demo|2= a }} results in start-{{{1}}}-middle- a -end

If the second parameter should not be trimmed, it must be unnamed.

Therefore, you can assign an empty string to the first parameter, but you cannot leave it undefined.

Making emptiness and undefinedness equivalent

Good template coding practices result in passing an empty string to a parameter working the same as not assigning any value. This makes things easier and more consistent.

For example, using p= can show that a template has a parameter "p" that doesn't have a value yet.

To make an empty string and an undefined value equivalent, use the following approaches:

  • Use {{{p|}}} exclusively instead of {{{p}}} or q where "q" is a non-empty value.
  • Use conditional checks like {{#if:{{{p|}}}|..{{{p}}}..|..}}, to ensure {{{p}}} is only used when it has a value.

If for some reason you want to treat undefined parameters differently from empty parameters or any other possible value you can compare the same parameter twice with different defaults, i.e {{#ifeq:{{{foo|bar}}}|{{{foo|baz}}}|parameter is defined|parameter is undefined}}.

Using equals signs in unnamed parameters

Unnamed parameters can include equals signs, but this must be done indirectly. Here are some methods using template:T1demo:

Default Value for Undefined Parameter

Assign a default value to an undefined parameter:

{{T1demo|{{{1| a=b }}}}}

This renders as: start a=b end.

Using the {{=}} parser function

Use a parser function that safely includes an equals sign:

{{T1demo| a{{=}}b }}

This renders as: start a=b end.

HTML Entities

Replace the equals sign with an HTML entity for display:

{{T1demo| a=b }}

This renders as: start a=b end.

This renders correctly without affecting the other parameters.

Handling unmatched curly and square brackets

Unmatched curly brackets ({{, }}) or square brackets ([[, ]]) must be inside nowiki tags or use HTML entities:

  • Rendering curly brackets have two options:
    • Use <nowiki>{{</nowiki> or &#123; for {
    • Use <nowiki>}}</nowiki> or &#125; for }.
  • Use &#91; for [ and &#93; for ].

Below are some examples:

Unmatched curly brackets
{{T1demo| <nowiki>{{</nowiki>content<nowiki>}}</nowiki> }}

This correctly renders the braces without breaking the template.

Unmatched square brackets
{{T1demo| text [link] more text }}

This correctly renders the braces without breaking the template.

This renders as: start text [link] more text end

Unmatched pairs not placed in nowiki tags either prevent template expansion or are taken as closing braces for the template call.

Below are some examples:

{{T1demo|abc]]def[[ghi}}

This will not expand correctly because of unmatched brackets.

The correct use:

{{T1demo|abc<nowiki>]]</nowiki>def<nowiki>[[</nowiki>ghi}}

This renders as: startabc]]def[[ghiend

Template-generated brackets

An alternate technique for passing arguments with unmatched brackets is to wrap them in another template. In that situation, (which exists with {{(( }} and {{)) }}) on this wiki), the unmatched brackets will be rendered literally, and not decoded as another template call. For example:

{{t1demo|{{((}}t1demo{{))}}}}

results in: start{{t1demo}}end

When substituting a template, template inclusions are parsed once when the subst happens (with the same caveats explained above) and then a second time when rendering the resulting wikitext. For example:

{{subst:((}}t1demo|foo}}

will expand on save to:

{{((}}t1demo|foo}}

which will then render as:

startfooend

If the wikitext generated via the first subst itself includes "subst:" syntax it will not be processed on the same save, but may be on the next save. This technique may be used to implement recursive substitutions that take multiple saves to evaluate.

Using pipes in parameter values

A parameter value cannot contain a pipe character (|), because it would be interpreted as the end of that parameter and the start of the next parameter. This can be worked around by using the parser function {{!}}, or the HTML entity &124;. The two methods of doing this have slightly different behavior, which can be relevant in some corner cases like when a template is producing wikitable syntax.

Example: {{T1demo|abc|def}} produces: startabcend

The "def" doesn't display because it is treated as part of another unnamed parameter, which the template does not use.

{{T1demo|abc{{!}}def}} produces: startabc|defend

The "def" displays properly.

{{T1demo|abc|def}} produces: startabc|defend

The "def" displays properly again.

Formatting template calls using extra parameters

Since templates ignore parameters they are passed but do not handle specifically, they can be used as a way of a adding extra whitespace or unused content to the template call.

For example:

{{template name|foo|bar|baz|mumble|quux}}

is equivalent to, assuming the template doesn't recognize SPACEN as a parameter name:

{{template name|SPACE1=
|foo|SPACE2=
|bar|SPACE3=Random stuff
|baz|SPACE4=
   |mumble|SPACE5=
  quux
}}

It is also possible to use the same name for each spacer (often the empty string), but this will populate Category:Pages using duplicate arguments in template calls, which many wikis prefer to keep empty to catch instances of user error.

This can be used to make the template render in a way similar to its output, like showing each row of w:Template:Chess position on its own like to make the wikitext also look like a chessboard.

Tracking parameter usage


It may be wise for a template to add a link or category to a page if a certain parameter or combination of parameters is used, to make if possible to easily determine what pages are using a given parameter, and thus what the impacts of changing that parameter in the template would be.

Evaluation

Dies ist ein Thema für Fortgeschrittene, das du überspringen kannst, sofern du es nicht benötigst.

Im Allgemeinen werden Vorlagenparameter nach der Tokenisierung in die Vorlage eingesetzt, aber so wie sie sind. Sie werden erst ausgewertet, wenn sie verwendet werden.

Dies hat einige Konsequenzen.

  1. Wenn Sie ein Template:Start haben, das {{mytemplate enthält, und ein Template:End, das |foo=bar}} enthält, und {{start}}{{end}} auf eine Seite setzen, wird mytemplate nicht transkludiert, weil Token wie "|" nicht durch ein Template hinzugefügt werden können und ihre spezielle Bedeutung in Templates behalten. Du kannst weiterhin Vorlagen verwenden, um den Namen eines Parameters oder einer Vorlage zu steuern, aber du kannst einen Vorlagenaufruf nicht auf mehrere Vorlagen aufteilen.
  2. Die zweite Folge davon ist die Dead-Code-Eliminierung. Wenn Sie eine Vorlage wie {{foo|{{DISPLAYTITLE:Bar}} }} aufrufen, und Template:Foo enthält nicht {{{1}}}, dann wird der displaytitle nicht verwendet, da er nur ausgewertet wird, wenn er benötigt wird, und es gibt keinen Parameter, in den er ersetzt werden kann, also wird er nie ausgewertet. Dies kommt in der Regel bei der Verwendung von Erweiterung:ParserFunktionen zum Tragen und kann besonders in Verbindung mit dem Magischen Wort int: auffallen, das je nach Benutzersprache variiert. This isn't perfect, and in some cases even if the result of expanding a template is not used (because it is part of an if statement condition, for example), the process of evaluating it can still have side effects. For example, any links produced or other templates used will still be added to Special:WhatLinksHere even if they are not displayed.


Template parameters are pass by value, which means a template cannot modify its arguments. Parameters are treated as associative array, and parameter names are evaluated before parameter values. If the same parameter name is given more than once (either as named or unnamed), only the last instace is used, and the page is added to Category:Pages using duplicate arguments in template calls.

Template-Aufrufe, die mit dem magischen Wort subst: oder safesubst: beginnen, werden in einem separaten ersten Durchgang ausgewertet, der zur Zeitersparnis erfolgt, zusammen mit ~~~~ und Links, die den Pipe-Trick verwenden. Wenn diese beim ersten Durchlauf nicht ausgewertet werden können, werden subst:-Aufrufe ignoriert und safesubst: wie ein normales Template behandelt.

Viele, aber nicht alle Parser-Funktionen, Parser-Tags und transklusierte Sonderseiten werden nicht wie Templates direkt eingebunden, sondern durch einen "Strip-Marker" ersetzt. Das bedeutet, dass Sie die Ergebnisse nicht mit Parser-Funktionen wie padleft: oder ähnlichen Funktionen von Erweiterungen manipulieren können, da diese die Streifenmarkierung anstelle des Ergebnisses der Parser-Funktion sehen.

Rekursion in Vorlagen

Wenn eine Vorlage in sich selbst eingebunden wird, wirft das MediaWiki nicht in eine endlose Rekursion. MediaWiki stoppt die Einbindung, indem der Name der Vorlage in fetter Schrift erscheint. Wenn der Inhalt von Template:Aaaa zum Beispiel a {{Aaaa}} z ist, wird „a a Template loop detected: Template:Aaaa z z“ angezeigt.

Diese Schutzmaßnahme verhindert einen potenziell nützlichen Template-Ausdruck, bei dem ein Template seine eigenen Aufrufargumente selbst normalisiert. In diesem unzulässigen Beispiel kann template:d entweder als {{d|20200311}} oder {{d|y=2020|m=3|d=11}} bezeichnet werden. Bei der ersten Methode erfolgt ein Rückgriff auf die zweite Argumentstruktur (die mit Hilfe der String-Parser-Funktionen ermittelt wird), die dann einem einheitlichen Verarbeitungspfad folgt.

{{#if:{{{1|}}}|{{d|y={{#sub:{{{1}}}|0|4}}|m={{#sub:{{{1}}}|4|2}}|d={{#sub:{{{1}}}|6|2}}}}|<!-- processing path with arguments y,m,d regardless of original call pattern -->}}

Falls template:d modifiziert wird, um nach template:d/2 zu springen und template:d/2 eine „identische manuelle Kopie“ von template:d ist, so funktioniert dieses Verfahren gut, da die Absicherung der automatischen Rekursion dynamisch und nicht statisch funktioniert.

Ein gangbarer Weg für die MediaWiki-Software, die Regel der Selbstrekursion zu lockern, wäre es, zu verlangen, dass jeder rekursive Aufruf eine unterschiedliche Anzahl von Argumenten haben muss, die sich von allen vorherigen aktiven Aufrufen unterscheiden und höchstens einmal rekursiv sein darf, wobei die Anzahl der Argumente nicht abnehmen darf. Das würde eine solide Sicherheit gegen endlose automatische Rekursion bieten und gleichzeitig nützliche Ausdrücke, wie den hier beschriebenen, auf flexible Weise ermöglichen.

Ist der Verarbeitungspfad von geringer Komplexität, kann eine einfache Lösung mit nur einem Template darin bestehen, jeden Aufruf in einer separaten if/else Verzweigung zu verarbeiten und die Logik des Prozesses in jedem Fall zu duplizieren. Wenn der Verarbeitungspfad komplexer ist, kann jeder Fall einer Aufrufstruktur an eine Vorlage zur Implementierung mit einer einheitlichen Aufrufstruktur delegiert werden, die das endgültige Template-Verhalten bereitstellt.

Tabellen in Parametern

Da das Pipe-Zeichen (|) und das Gleichheitszeichen (=) in Template-Aufrufen und Wikitables unterschiedliche Bedeutungen haben, muss man, um Tabellenauszeichnungen im Wert eines Template-Parameters zu verwenden, diese Zeichen in der Regel mit Hilfe spezieller Sequenzen „umgehen“ (d.h. sie vor der Interpretation als Template-Auszeichnungen schützen):

  • das eingebaute magische Wort {{!}} bietet seit MediaWiki 1.24 eine „umgangene“ Version von |
  • das eingebaute magische Wort {{=}} bietet eine „umgangene“ Version von = seit MediaWiki 1.39

Vor der Einführung dieser magischen Worte verwendeten viele Wikis Vorlagen, um das Gleiche zu erreichen. In einem solchen Wiki haben die magischen Wörter Vorrang vor den gleichnamigen Vorlagen.

Beispiel-Tabelle

A B C
A1 B1 C1
A2 B2 C1

Tabellencode:

{| class=wikitable
!A!!B!!C
|-
|A1||B1||C1
|-
|A2||B2||C1
|}

Umgangenen (escaped) Tabellencode:

{{{!}} class{{=}}wikitable
!A!!B!!C
{{!}}-
{{!}}A1{{!}}{{!}}B1{{!}}{{!}}C1
{{!}}-
{{!}}A2{{!}}{{!}}B2{{!}}{{!}}C2
{{!}}}

Beachten, dass die erste linke Klammer ({) als wörtliches Zeichen für die linke Klammer interpretiert wird, da sie unmittelbar vor dem magischen Wort {{!}} steht. Ebenso wird die letzte rechte Klammer (}) als wörtliches Zeichen für eine rechte Klammer interpretiert, da ihr das gleiche magische Wort unmittelbar vorangestellt ist. In einigen Fällen können diese Klammerzeichen jedoch Probleme verursachen, weshalb einige Wikis auch Vorlagen für die Umgehung dieser Zeichen anbieten:

  • der Vorlagenaufruf {{(}} könnte eine "umgangene" Version von { darstellen
  • der Vorlagenaufruf {{)}} könnte eine "umgangene" Version von } darstellen

Einige Wikis gehen sogar noch weiter und bieten andere praktische Vorlagen wie {{(!}} ({|), {{!)}} (|}), {{!!}} (||). In einem solchen Wiki kann der Code in dieser Form etwas vereinfacht werden:

{{(!}} class{{=}}wikitable
!A!!B!!C
{{!}}-
{{!}}A1{{!!}}B1{{!!}}C1
{{!}}-
{{!}}A2{{!!}}B2{{!!}}C2
{{!)}}

Steuern der Vorlageneinbindung

Standardmäßig wird der Inhalt einer Vorlage vollständig angezeigt, sowohl bei direkter Betrachtung, als auch wenn sie in einer anderen Seite inkludiert wird. Du kannst das Einbinden der Vorlagen jedoch durch die Verwendung von $noinclude-, $includeonly- und $onlyinclude-Tags steuern.

The template's page when viewed directly appears exactly as the template would render without any parameters. If the template requires parameters to function properly, this will result in raw wikitext syntax or errors as a result of them being missing.

For example:

  • If a parameter has no default value, it shows as the literal text {{{1}}}, indicating the template needs a parameter.
  • If a parameter has an empty default value (it is written as {{{1|}}}), it displays nothing, which achieves the intended effect but lacks clarity for self-documentation. Using a non-empty default value like {{{1|$1}}} could clarify a parameter's role, especially for templates involving images.
  • If a parameter without a default is passed to the #expr parser function, it results in an error message: "Expression error: unrecognized punctuation character '{'."
  • If a template creates a table, it's helpful for the template page to show the table's structure rather than the wikitext used to make it. To do this, the table syntax isn't enclosed in tags, and each table element includes both ‎<noinclude>...‎</noinclude> and ‎<includeonly>...‎</includeonly> parts where needed.

However, you can control which parts of a template will be seen and included by the use of the ‎<noinclude>, ‎<includeonly> and ‎<onlyinclude> tags.

Alles zwischen ‎<noinclude> und ‎</noinclude> wird nur verarbeitet und angezeigt, wenn die Seite direkt angesehen wird und nicht, wenn sie in einer anderen Seite eingefügt ist. Das ist nützlich, wenn man Text oder Code in einer Vorlage einbinden will, diesen jedoch nicht für alle Seiten übernehmen will, die die Vorlage verwenden, zum Beispiel:

Das Gegenteil ist ‎<includeonly>. Text zwischen ‎<includeonly> und ‎</includeonly> wird nur verarbeitet und angezeigt, wenn die Seite eingefügt wird. Der offensichtliche Anwendungsfall ist das Hinzufügen aller Seiten, die eine vorgegebene Vorlage beinhalten, zu einer Kategorie.

  • Kategorisierung-Seiten, die die Vorlage enthalten. Hinweis: Wenn die Kategorien, die von einer Vorlage angewendet werden, auf diese Weise geändert werden, wird die Kategorisierung der Seiten, die diese Vorlage enthalten, möglicherweise erst einige Zeit später aktualisiert: Dies wird von der Jobwarteschlange erledigt. Um die Neukategorisierung einer bestimmten Seite zu erzwingen, öffne diese Seite zur Bearbeitung und speicher sie ohne Änderungen.
  • Stelle sicher, dass der Code der Vorlage beim Anzeigen der Vorlagenseite selbst nicht ausgeführt wird. Typischerweise liegt dies daran, dass er Parameter erwartet, und seine Ausführung ohne Parameter hat ein unerwünschtes Ergebnis.

Alles außerhalb von ‎<noinclude> und ‎<includeonly> wird normal verarbeitet und angezeigt, d.h. sowohl, wenn die Vorlagenseite direkt angezeigt wird, als auch, wenn die Vorlage in eine andere Seite eingebunden wird. Der Schwerpunkt liegt auf dem, was sich innerhalb dieser beiden Tags befindet.

Alles außerhalb der ‎<onlyinclude>-Tags wird bei der Einbindung verworfen. Sogar Abschnitte, die nur als includeonly gekennzeichnet sind, werden bei der Einbeziehung verworfen, es sei denn, sie sind ebenfalls als onlyinclude gekennzeichnet. Der Schwerpunkt liegt auf dem, was außerhalb dieses Tags steht.

For example, if a page like Help:Templates/onlyinclude demo has the wikitext:

abc<onlyinclude>def</onlyinclude>ghi<includeonly>jkl</includeonly>

The result of transcluding it is def.

Eine Verschachtelung dieser Tags ist ebenfalls möglich.

Die drei Tags für partielle Transklusion ermöglichen alle möglichen Kombinationen dessen, was verarbeitet und gerendert wird. Auch Kommentare spielen eine Rolle. Inclusion tags are respected when using {{subst:templatename}}, but they are not respected when using {{msgnw:templatename}} as that displays the raw wikitext without any processing.

Section transclusion

To transclude different sections of a template on different pages, you can wrap the content in onlyinclude tags and use an if statement on parameters to select which section.

Consider "Template:Example" with this wikitext:

== Section 1 ==
{{#ifeq:{{{1|1}}}|1|
Content of section one.
}}
{{#ifeq:{{{1|2}}}|2|
== Section 2 ==
Content of section two.
}}

This will render both sections on the example page itself, and allow other pages to transclude the first section with {{example|1}} and the second section with {{example|2}}.

Another approach is to use literal parameter syntax instead:

{{{section1|
== Section 1 ==
Content of section one.
}}}
{{{section2|
== Section 2 ==
Content of section two.
}}}

Transclude the first section with {{example|section2=}} and the second section with {{example|section1=}}. If neither parameter is used, then both sections will display.

A third approach is to use Labeled Section Transclusion.

Organisation von Vorlagen

Damit Vorlagen effektiv sein können, müssen Nutzer sie schnell finden können und dazu in der Lage sein, sie zu nutzen.

Um Vorlagen zu finden können Benutzer:

  1. auf Spezialseiten > Alle Seiten klicken.
  2. in der Namensraum:-Liste Vorlage auswählen und auf Anwenden klicken.

Eine einfache Technik ist die Integration eines Beispiels auf der Vorlagenseite. Zum Beispiel:

<noinclude>
== Verwendung ==
Benutzer begrüßen:
{{Thankyou|reason=deine Begründung|signature=deine Signatur}}
</noinclude>

Ein Redakteur kann einfach das Beispiel kopieren und einfügen, um eine ähnliche Seite zu erzeugen. Das Beispiel ist trivial, doch ein funktionstüchtiges Beispiel, das demonstriert, wie Vorlagen verwendet werden können, spart in aufwändigen Umgebungen zu speziellen Themen leichter Zeit.

Während der Bearbeitung einer Seite ist eine Liste aller verwendeten Vorlagen unter dem Bearbeitungsformular in einem ausklappbaren Abschnitt mit dem Titel „Folgende Vorlagen werden auf dieser Seite verwendet:“ (je nach Kontext auch „Folgende Vorlagen werden von dieser Seitenvorschau verwendet:“ oder „Folgende Vorlagen werden in diesem Abschnitt verwendet:“ genannt) verfügbar. Diese Liste enthält einen praktischen Link zur Seite der Vorlage sowie Informationen über ihren Schutzstatus. Umgeleitete Vorlagen werden kursiv dargestellt, wobei das Umleitungsziel als separates Listenelement hinzugefügt wird.

Verlinkung zu einer Vorlage

Eine Vorlagenseite kann wie jede andere Wiki-Seite verlinkt werden. Zum Beispiel wird der Link Template:Navbar mit dem Wikicode [[Template:Navbar]] erzeugt.

In vielen Wikis kann Template:Tl verwendet werden, um einen Link zu einer Vorlage bereitzustellen, die so formatiert ist, dass der Wikicode „double curly-braces” angezeigt wird, der erforderlich ist, um die Vorlage zu transkludieren, ohne den Tranklusionsvorgang tatsächlich durchzuführen. Zum Beispiel kann der Code {{tl|Navbar}} verwendet werden, um den Link {{Navbar }} zu erstellen.

Dieses Konstrukt wird häufig verwendet, wenn auf Vorlagen in der Vorlagendokumentation, auf Hilfeseiten und auf Diskussionsseiten verwiesen wird. Der gleiche Effekt kann mit {{[[Template:Navbar|Navbar]]}} erzielt werden, aber der {{Tl }}-Ansatz erfordert viel weniger Eingaben. In jedem gegebenen Wiki kann die Tl-Vorlage, falls vorhanden, den Text in einem "Code"-Element oder als Monospace-Schrift wiedergeben oder nicht. Wenn nicht (wie in diesem Wiki), kann eine andere ähnlich benannte Vorlage dies tun. Siehe zum Beispiel den Abschnitt "Siehe auch" unserer Template:Tl-Dokumentation.

Template naming

The name of a template is case-sensitive excluding the first character.

You make redirects for alternate capitalizations. For example, if a template is named "AdminAbbr", you can create a redirect named "Adminabbr". This way, the template can be called with either {{AdminAbbr}} or {{adminabbr}}. If an editor prefers a mix of upper and lower case for clarity, they can use functions like lc or uc. For instance, instead of {{CURRENTINTERNETTIME}}, they could use {{ {{uc:CurrentInternetTime}} }}

Because template names are interpreted in the same way to the names of other pages, underscores are replaced with spaces, and any text after a number sign (what would be a anchor in a standard link) is ignored.

An underscore _ can be alternative to a blank space.

Possible uses of templates

Templates can be used for any situation in which one wants two or more pages to contain identical or similar content that is edited together rather than independently. They can be used to:

  • Provide structured elements on many pages, like infoboxes, maintenance templates, navigational boxes, etc.
  • Perform calculations used as a programming tool on various pages, like w:Template:Sum.
  • Build composite pages that display the content of multiple existing pages together, like w:WP:Village pump (all) which includes content from each section of the village pump. The content of these pages can either be shown individually, or together, but the revision history, watchlist, etc. will only pick up changes to the transcluded pages and the raw wikitext of the composite page itself, not implicit changes to the composite page.
  • Share some content between a few related pages. For example, the list at Help:Preferences#Beta features is duplicated at Beta Features#Current Beta Features. While on MediaWiki.org that is built using Extension:LabeledSectionTransclusion instead, it could have been done using a template.
  • Store content referenced multiple times on the same page, so it only has to be written and calculated once. For example w:Template:Cite Monumentenregister/URL is called twice by w:Template:Cite Monumentenregister in two different places, and using another template means the URL pattern only has to be written once in the base template.
  • Use templates as a programming element to generate a loop: if Template:A calls Template:B 10 times with different parameters, then that crudely simulates a for loop. If Template:B calls Template:C 10 times, then you have a nested loop of 100 calls of Template:C. But keep in mind that it is easy to run into the template limits when using templates as advanced programming constructs, and using Scribunto is generally clearer and easier to follow.

Kopie von einem Wiki zu einem anderen

It is possible, if allowed by the wiki configuration to transclude templates from other wikis. This configuration setting is disabled on Wikimedia wikis. Otherwise, you need to manually copy the template and its dependencies from the source wiki to the destination wiki to use it.

Vorlagen erfordern oft CSS oder andere Vorlagen, sodass Benutzer häufig Probleme haben, Vorlagen von einem Wiki in ein anderes zu kopieren. Die folgenden Schritte sollten für die meisten Vorlagen funktionieren.

MediaWiki Code

Falls man Importrechte im neuen Wiki hat:

  1. Gehe im Urspungs-Wiki/im originalen Wiki auf Special:Export und downloade .xml-Datein mit den gesamten Versionsgeschichten aller notwendigen Vorlagen. Verfahre dazu wie folgt:
    • Gebe den Namen der Vorlage in das große Textfeld ein, z. "Vorlage:Willkommen". Achte besonders auf Großschreibung und Sonderzeichen – wenn der Vorlagenname nicht genau richtig ist, wird der Export möglicherweise trotzdem ausgeführt, aber die .xml-Datei enthält nicht die erwarteten Daten.
    • Wähle das Kästchen "Inklusive Vorlagen".
    • Wähle in dem Kästchen "Nur die aktuelle Version der Seite exportieren".
    • Klicke auf Seiten exportieren.
  2. Gehe im neuen Wiki auf Special:Import und lade dort die .xml-Datei hoch.

Falls man keine Importrechte auf dem neuen Wiki hat:

  1. Gehe zu der Vorlage, die du aus dem ursprünglichen Wiki kopieren möchtest. Gehe zur Bearbeitungsseite und kopiere den gesamten Wikitext.
  2. Gehe im neuen Wiki zu der Seite mit dem gleichen Namen wie die kopierte Vorlage. Klicke auf Erstellen/Bearbeiten und füge den kopierten Wikitext ein. Verlinke in der Bearbeitungszusammenfassung jeder Vorlage zur Zuordnung auf die Originalseite.
  3. Zurück im Original-Wiki im Bearbeitungsfenster, unterhalb des Bearbeitungsfeldes, sehe dir die Liste der "Auf dieser Seite verwendeten Vorlagen" an. Befolge für jede aufgeführte Vorlage diese Anweisungen. Tu dies auch für jede Vorlage, die von einer dieser Vorlagen verwendet wird, und so weiter.

Dadurch wird der gesamte erforderliche Code kopiert, was für einige Vorlagen ausreicht. Beachte, dass nur Seitenelemente, die beim Rendern der Seite ausgewertet werden, exportiert werden, d.h. Unterseiten der Dokumentation werden dabei nicht exportiert. Wenn es nicht funktioniert, suche auch nach roten Links, die unter "In die aktuelle Version dieser Seite übernommene Seiten:" unterhalb des Bearbeitungsfeldes aufgeführt sind. Wenn es welche gibt, wiederhole die obigen Schritte auch für diese und kopiere auch den Code in die Module.

Nachdem du die Vorlage und alle verknüpften Vorlagen erfolgreich aus dem anderen Wiki importiert hast, bearbeite sie, um die Anpassungen an dein Wiki anzupassen. Zum Beispiel, um ein Logo zu ändern, überflüssige Kategorien oder rote Links zu entfernen.

Erweiterungen

Eine häufig in Vorlagen verwendete Erweiterung ist ParserFunctions. Besuche die Seite Erweiterung:ParserFunktionen und prüfe, ob eine der dort aufgeführten Funktionen in den von Ihnen kopierten Vorlagen verwendet wird. Wenn ja, musst du die ParserFunctions -Erweiterung installieren. Um es zu installieren, benötigst du Systemadministrator-Zugriff auf den Server deiner MediaWiki-Installation.

Eine weitere Abhängigkeit, die in Vorlagen verwendet werden kann, insbesondere in Wikipedia, ist Lua. {{#invoke: }} im Vorlagencode zu haben, ist ein gutes Zeichen dafür. Falls es verwendet wird, musst du die Scribunto -Erweiterung installieren, und der Systemadministratorzugriff ist ebenfalls erforderlich. Auf dieser Seite findest du weitere Anweisungen zur Installation und Verwendung der Erweiterung.

CSS und JavaScript-Code

Neben dem MediaWiki-Code verwenden viele Vorlagen CSS und einige verlassen sich auf JavaScript, um vollständig zu funktionieren. Wenn sich die kopierten Vorlagen nicht wie erwartet verhalten, kann dies die Ursache sein. Um das erforderliche CSS und JavaScript in dein Wiki zu kopieren, benötigst du normalerweise Administratorrechte, da du Systemmeldungen im Namensraum "MediaWiki:" bearbeitest.

  1. Achte auf die Verwendung von CSS-Klassen (Text wie class="foobar") im Vorlagentext. Wenn diese Klassen in „MediaWiki:Common.css“ oder „MediaWiki:Monobook.css“ im ursprünglichen Wiki erscheinen, kopiere diese Klassen in „MediaWiki:Common.css“ im neuen Wiki und prüfe, ob die Vorlage jetzt in Ordnung ist.
  2. Wenn die kopierte Vorlage immer noch nicht wie erwartet funktioniert, prüfe, ob sich Code in "MediaWiki:Common.js" oder "MediaWiki:Monobook.js" im Original-Wiki befindet. Wenn dies der Fall ist, kannst du versuchen, es im neuen Wiki nach "MediaWiki:Common.js" zu kopieren. Normalerweise ist es eine gute Idee, nur Code aus vertrauenswürdigen Quellen zu kopieren und zuerst den Code zu durchsuchen, um die relevanten Teile zu identifizieren und auszuwählen. Möglicherweise findest du Kommentare, die als Anhaltspunkte dienen können, um die Funktionalität der einzelnen Teile zu identifizieren.

Redirection

If a page uses a redirect as a template, the redirect is resolved before processing the template and the target is used instead. This won't work if the target doesn't exist (a broken redirect), or is itself a redirect (a double redirect).

A page that just includes another page as a template might look like a redirect, but there are several differences between them:

  • The header of the result displays the title of the page it came from.
  • No "Redirected from" message is shown.
  • Buttons like edit, watch, talk, history, "what links here," and "last modified" point to the referring page. To access the target page, use a section edit link and navigate from there.
  • Unless includeonly and/or noinclude tags are used, the referring page shares the same categories as the target page.
  • "Double redirects" work when one or both are this type of pseudo-redirect.
Embedding works on pages that support redirects and doesn't work on pages without it.

Parser functions

MediaWiki also supports parser functions, which function similarly to templates but follow slightly different syntax:

  • Parser functions utilize a ":" instead of the initial "|".
  • An edit page does not display parser functions used on that page.
  • There is no "What links here" feature for parser functions to identify the pages where they are utilized.
  • Parser functions templates do not generally accept named parameters, so equal signs generally have no special significance. For example:
{{ #if: not blank | x=abc }} gives x=abc

Siehe auch

Allgemeine Template-Verwendung

Spezielle Konstrukte, die in Vorlagen verwendet werden

Andere einschlägige Informationen