Справка:Шаблоны
Примечание: Редактируя эту страницу, вы соглашаетесь на передачу своего вклада по лицензии CC0. Подробнее — в проекте Помощь с общественным достоянием. |
Если у вас есть одинаковый текст, который вы хотите разместить на нескольких страницах, то в действие вступают шаблоны MediaWiki. В отличие от расширений и медиафайлов , для шаблонов нет центрального хранилища (репозитория). Шаблоны могут быть написаны с нуля или, чтобы не делать двойную работу, взяты из другой вики, например, из Википедии, и затем сохранены в целевой вики.
Базовое использование
Шаблоны — это обычные вики-страницы, предназначенные для того, чтобы их содержание можно было включать (встраивать) в другие страницы. Имена шаблонов, следуя общему соглашению, начинаются с префикса «Template:
» («Template:
»), привязывая его к одноимённому пространству имён, поэтому их можно создавать так же, как обычные страницы.
Для включения шаблона нужно использовать двойные открывающие и закрывающие фигурные скобки {{имя шаблона}}
.
Пример простейшего шаблона: создайте страницу с названием «Template:Welcome
» и со следующим содержанием:
Привет! Добро пожаловать в вики!
Вы создадите свой первый шаблон! Теперь вставьте в новую страницу приведённый ниже код:
{{Welcome}}
При просмотре этой страницы, будут виден текст «Привет! Добро пожаловать в вики!» в том месте, где вы использовали код {{Welcome}}
. Таким образом, содержимое шаблона оказалось встроено (иначе говоря, было интегрировано) в другую страницу.
Вы можете вставить {{Welcome}}
в любом месте любой страницы, когда захотите приветствовать кого-либо. Допустим, вы применили этот код на 100 страницах. Если теперь поменять содержимое шаблона на:
Привет всем! Добро пожаловать в этот замечательный вики-проект.
и просмотреть все 100 страниц, на которых применили шаблон, то вы увидите этот новый текст вместо изначального. Таким образом, поскольку шаблон встроен в каждую из 100 страниц, то вы единовременно поменяли содержимое всех этих страниц, не редактируя каждую в отдельности.
Это основной способ. Есть несколько дополнительных особенностей использования, которые дополняют этот способ и делают шаблоны очень полезными.
Способы вызова шаблона
Шаблоны — это вики-страницы, используемые в других вики-страницах. Доступных способов использования три:
{{Name}}
— как описано выше, этот текст (обычно называемый "вызовом шаблона") будет "динамически" заменен содержимым страница с названием Шаблон:Name (процесс, называемый "трансклюзия") каждый раз, когда страница с вызовом шаблона "загружается" (т. е. просматривается читателем вики). Поскольку вызов шаблона остается в источнике страниц, любое последующее изменение в Шаблон:Name будет видно на странице, содержащей вызов шаблона. Также страница будет в списке тех, которые "ссылаются" на шаблон.{{subst:Name}}
— при использовании этого типа вызова шаблона он будет заменен статической копией содержимого Шаблон:Name на момент сохранения страницы, содержащей вызов шаблона. То есть копия содержимого Шаблон:Name будет подставлено для вызова шаблона. Между страницей и шаблоном не сохраняется связь, поэтому каждый из них можно редактировать, не затрагивая другой. По сути, нет большой разницы между такой заменой контента и простым вводом его в исходный код страницы "вручную". См. подробнее в Справка:Подстановка .{{safesubst:Name}}
— это было введено, чтобы обеспечить рекурсивную замену в тех случаях, когда шаблоны содержат вызовы других шаблонов или функций синтаксического анализатора. См. Справка:Подстановка для более детальной информации.{{msgnw:Name}}
— отображает содержимое шаблона в виде необработанного вики-синтаксиса (как это делает<nowiki>
) при просмотре страницы, содержащей его. Например,{{msgnw:Template:Thankyou}}
отобразит:
<noinclude> <languages/> </noinclude> '''Спасибо...''' за {{{reason|{{{1}}}}}}. жму руку, {{{signature|{{{2}}}}}} <noinclude> [[Category:Template examples{{#translation:}}|{{PAGENAME}}]] </noinclude>
На самом деле, обычная Вики-страница тоже может использоваться в качестве шаблона, просто укажите пространство имён, в котором она находится, вот так:
{{Шаблон:Pagename}}
включает страницу с названием Шаблон:Pagename (эквивалентно{{Pagename}}
){{Обсуждение:Pagename}}
включает страницу с названием Обсуждение:Pagename{{:Pagename}}
включает страницу с названием Pagename (т.е. в основное пространство имен).{{subst::Pagename}}
заменяет содержимое страницы с названием Pagename
Если указанное пространство имен не существует, предполагается, что полный заголовок является шаблоном:
{{Foo:Bar}}
включает Template:Foo:Bar
Regardless of what syntax is used, the name of the template can be relative to the current page
For example, if {{/bar}}
is called on page foo, it will transclude the page foo/bar.
It can also be generated dynamically.
For example, {{ {{foo}} }}
calls Template:foo and interprets the result as the name of another template to call.
Параметры
Чтобы расширить механизм включения, MediaWiki использует параметры, передаваемые в шаблон при его включении. Параметры шаблона позволяют генерировать различное содержание или менять модель поведения.
Предположим, вы хотите вставить маленькую благодарственную записку в странице обсуждения других пользователей, такую как:
Спасибо...
за все ваши усилия.
жму руку, Подпись
В благодарственном сообщении будет указана причина (в данном случае "все ваши усилия") и подпись ("Подпись"). Задача состоит в том, чтобы любой пользователь мог поблагодарить другого пользователя по любой причине.
Чтобы сообщение выглядело единообразно везде, где используется, можно создать шаблон под названием, например, Template:Thankyou . Хотя сообщение должно выглядеть похожим всякий раз, когда один пользователь благодарит другого, его конкретное содержание (то есть причина и подпись) могут быть разными. По этой причине вы должны передать эти особенности в качестве параметров. Если мы проигнорируем оставшиеся элементы форматирования блока и размещения изображения, основное содержимое шаблона будет таким:
'''Спасибо...'''
за {{{1}}}.
Обнимаю, {{{2}}}
Обратите внимание на выражения {{{1}}}
и {{{2}}}
. Это способ задать в тексте шаблона параметры, которые будут ему передаваться при его использовании. Как можно видеть, каждый параметр заключён в три пары фигурных скобок: {{{ }}}
. Это отличается от обычного использования имени шаблона.
Вставляя шаблон в страницу, вы задаете значения параметров, разделяя их символом «вертикальная черта» (|
). MediaWiki позволяет передавать параметры в шаблон в тремя способами: анонимно, по порядковому номеру и по названию параметра.
Нумерованные (анонимные) параметры
Чтобы передать в параметры анонимно, перечислите их значения по порядку:
{{Thankyou|все ваши усилия|Подпись}}
В этом случае шаблон {{Thankyou}}
принимает параметры {{{reason}}}=все ваши усилия
и {{{signature}}}=Подпись
и выдаёт:
Спасибо...
за все ваши усилия.
жму руку, Подпись
Порядок параметров при анонимной передаче важен. Например, передача их в обратном порядке:
{{Thankyou|Подпись|все ваши усилия}}
приведёт к следующему результату:
Спасибо...
за Подпись.
жму руку, все ваши усилия
{{{1}}}
, и т.д.) работает только с анонимными (неименованными) параметрами. Любые параметры, идентифицированные по имени, как показано ниже, не будут доступны для шаблона при использовании порядковых номеров.
Шаблон с нумерованными параметрами
Чтобы передать параметр по номеру, явно задайте ему таковой при передаче:
{{Thankyou|2=Подпись|1=ваше дружелюбие}}
В этом случае, шаблон {{Thankyou}}
принимает параметры {{{1}}}=ваше дружелюбие
и {{{2}}}=Подпись
, хотя они были поставлены в обратном порядке, и получается:
Спасибо...
за ваше дружелюбие.
жму руку, Подпись
- Примеры
{{Thankyou|1=добавление “=”|2=Я}}
делает:
Спасибо...
за добавление “=”.
жму руку, Подпись
Шаблон с именованными параметрами
Третий способ передачи параметров — по имени вместо цифр. В этом случае содержимое шаблона нужно изменить:
'''Большое спасибо...''' за {{{reason}}}. Обнимаю, {{{signature}}}
Теперь мы используем {{{reason}}}
и {{{signature}}}
для вставки параметров вместо чисел. Для передачи параметров задайте соответствующие имена при вставке:
{{Thankyou|signature=Подпись|reason=за то, что ты есть}}
В этом случае шаблон {{Thankyou}}
принимает параметры {{{reason}}}=все ваши усилия
и {{{signature}}}=Подпись
и выдаёт:
Спасибо...
за ваши усилия.
жму руку, Подпись
Именованные параметры являются регистрозависимыми:
{{Thankyou|signature=Я|Reason=за то, что ты есть|reason=чувствительность к регистру}}
делает:
Спасибо...
за чувствительность к регистру.
жму руку, Я
Преимущество использования именованных параметров в шаблоне, помимо гибкости в порядке их передачи — это делает код шаблона гораздо легче для понимания, особенно если параметров много.
Пробелы и символы новой строки автоматически удаляются из начала и конца названий и значений именованных параметров, но сохраняются в неименованных параметрах.
Смешивание именованных и неназванных параметров
Если шаблон поддерживает это, то оба вида параметров могут быть использованы в одном вызове.
For example, {{Thankyou|supporting both parameter types|signature=Me}}
results in:
Спасибо...
за supporting both parameter types.
жму руку, 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:
Спасибо...
за supporting both parameter types.
жму руку, {{{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.
Значения по умолчанию
Если вы включите в страницу шаблон, который ожидает параметры, но не передадите их аргументы (значения), например:
{{Thankyou}}
в нумерованных параметрах из примера выше вы получите следующее:
Спасибо...
за {{{1}}}.
жму руку, {{{2}}}
Так как никакие аргументы не были переданы, шаблон показывает сами параметры вместо их значений. Для таких случаев может быть полезно определить значения параметров по умолчанию, т.е. значения, которые будут использоваться, если соответствующие параметры не переданы. Например, если содержимое шаблона изменить на:
'''Большое спасибо...'''
за {{{reason|всё}}}.
обнимаю, {{{signature|Я}}}
то выражение {{{reason|всё}}}
определяет, что если никакой аргумент для параметра {{{reason}}}
не передан, используется значение всё
. Соответственно, {{{signature|Я}}}
задает для {{{signature}}}
значение по умолчанию Я
. Теперь вставка шаблона без аргументов приведёт к следующему результату:
Спасибо...
за за всё.
жму руку, Я
{{foo|bar=}}
или {{foo|bar=|baz=qux}}
шаблон foo считает, что параметр bar
равен ""
. Это отличается от полного отсутствия параметра, в результате которого он остается неопределенным и активируется механизм значения по умолчанию, описанный выше.{{#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.Часто для определения альтернативных имен параметров используются значения по умолчанию.
Например, если у вас есть {{{a|{{{b|}}} }}}
, шаблон сначала будет искать параметр под названием "a".
Если он не установлен, он будет использовать параметр "b".
Если ни "a" ни "b" не установлены, то он ничего не выдаст.
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}} -> Спасибо... за {{{1}}}. жму руку, {{{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}} -> Спасибо... за everything. жму руку, 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.
Пустые или неопределённые параметры
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.
Как сделать равнозначными пустые и неопределённые параметры
Хорошие методы кодирования шаблонов приводят к тому, что передача в параметр пустой строки работает так же, как и отсутствие присвоения какого-либо значения. Это упрощает использование шаблона и повышает согласованность.
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}}}
orq
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}}
.
Использование знаков равенства в неименованных параметрах
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.
Обработка несогласованных фигурных и квадратных скобок
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{
for{
- Use
<nowiki>}}</nowiki>
or}
for}
.
- Use
- Use
[
for[
and]
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 process
Вообще говоря, параметры шаблона подставляются в шаблон после «токенизации», но именно в том виде, в котором они предоставлены. Они не оцениваются до тех пор, пока не будут использованы.
Это имеет несколько последствий:
- Если у вас есть
Template:Start
, содержащий{{mytemplate
, иTemplate:End
, содержащий|foo=bar}}
, и вы разместили{{start}}{{end}}
на странице, mytemplate не будет преобразован, потому что токены типа «|» не могут быть добавлены шаблоном и сохраняют в шаблонах своё особое значение. You can still use templates to control the name of a parameter or template, but you cannot split a template call amongst multiple templates. - Dead-code elimination: If you make a template call like
{{foo|{{DISPLAYTITLE:Bar}} }}
, andTemplate:Foo
does not contain {{{1}}}, then theDISPLAYTITLE
is not used, since it is only evaluated when needed, and there is no parameter to substitute it into, so it is never evaluated. This usually comes into play when using Расширение:Функции парсера , and can be especially noticed when used in combination with theint:
magic word that varies by user language. 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 calls starting with the magic word subst:
or safesubst:
are evaluated in a separate first pass that only happens at save time, along with ~~~~ and links using the pipe trick.
If they cannot be evaluated during the first pass, subst:
calls are ignored, and safesubst:
are treated as if a normal template.
Many but not all parser functions, parser tags and trancluded special pages are not directly included like templates but instead are replaced by a "strip marker". This means you cannot manipulate the results with parser functions like padleft: or similar functions from extensions, as they see the strip marker instead of the result of the parser function.
Рекурсия в шаблонах
Рекурсия - это вызов какого-либо шаблона внутри самого себя. Вызов шаблона сам по себе не бросит MediaWiki в бесконечную рекурсию.
MediaWiki остановит рекурсию с именем шаблона, выделенным жирным шрифтом.
Например, если содержимое "Шаблона:Aaaa" - "a {{Aaaa}} z
", то при вызове его на какой либо странице, будет показано "a a Template loop detected: Template:Aaaa z z".
This safeguard precludes a potentially useful template idiom where a template self-normalizes its own calling arguments.
In this forbidden example template:d
can either be called {{d|20200311}}
or {{d|y=2020|m=3|d=11}}
.
If called in the first manner, it recurses into itself with the second argument structure (obtained using string parser functions), which then follows a unified processing path.
{{#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 -->}}
If template:d
is modified to recurse into template:d/2
and template:d/2
is an identical manual copy of template:d
this idiom works fine as the self-recursion safeguard operates dynamically and not statically.
A feasible way for the MediaWiki software to loosen the self-recursion rule would be to require that each recursive call have a distinct argument count from all previous active calls, at most once recursing with the argument count non-decreasing. That would provide a strong guarantee against infinite self-recursion while enabling useful idioms such as the one described here in a flexible manner.
If the processing path is of low complexity, a simple solution using only one template is to handle each calling convention on a separate if/else branch, duplicating the logic of the processing path within each case. If the processing path is more complex, each call-structure case can delegate to an implementation template with a unified call structure which provides the final template behaviour.
Таблицы в параметрах
Поскольку символ вертикальной черты (|
) и знак равенства (=
) имеют разные значения в вызовах шаблонов и вики-таблицах, чтобы использовать разметку таблицы в значении параметра шаблона, обычно необходимо "экранировать" эти символы (т. е. защитить их от интерпретация как разметки шаблона) с использованием специальных последовательностей:
- встроенное волшебное слово
{{!}}
предоставляет "экранированную" версию|
, начиная с MediaWiki 1.24. - встроенное волшебное слово
{{=}}
предоставляет "экранированную" версию=
, начиная с MediaWiki 1.39.
До появления этих волшебных слов многие вики использовали шаблоны для достижения одних и тех же целей. В такой вики волшебные слова имеют приоритет над одноименными шаблонами.
Пример таблицы
A | B | C |
---|---|---|
A1 | B1 | C1 |
A2 | B2 | C1 |
Код таблицы:
{| class=wikitable
!A!!B!!C
|-
|A1||B1||C1
|-
|A2||B2||C1
|}
Экранированный код таблицы:
{{{!}} class{{=}}wikitable
!A!!B!!C
{{!}}-
{{!}}A1{{!}}{{!}}B1{{!}}{{!}}C1
{{!}}-
{{!}}A2{{!}}{{!}}B2{{!}}{{!}}C2
{{!}}}
Обратите внимание, что первая левая фигурная скобка ({
) интерпретируется как буквальный символ левой скобки, поскольку сразу за ней следует волшебное слово {{!}}
.
Аналогично, последняя правая фигурная скобка (}
) интерпретируется как буквальный символ правой фигурной скобки, поскольку ей непосредственно предшествует то же волшебное слово.
Однако в некоторых случаях эти фигурные скобки вызывают проблемы, поэтому некоторые вики также предоставляют шаблоны для экранирования этих символов:
- вызов шаблона
{{(}}
может предоставить "экранированную" версию{
- вызов шаблона
{{)}}
может предоставить "экранированную" версию}
Некоторые вики идут еще дальше и предоставляют другие удобные шаблоны, например {{(!}} ({|
), {{!)}} (|}
), {{!!}} (||
).
В такой вики код можно немного упростить до такого вида:
{{(!}} class{{=}}wikitable
!A!!B!!C
{{!}}-
{{!}}A1{{!!}}B1{{!!}}C1
{{!}}-
{{!}}A2{{!!}}B2{{!!}}C2
{{!)}}
Управление включением шаблонов
По умолчанию содержимое шаблона отображается полностью, как при непосредственном просмотре, так и при добавлении на другую страницу. Страница шаблона при непосредственном просмотре выглядит точно так, как она отображалась бы во включённом шаблоне без каких-либо параметров. 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.
Однако, вы можете управлять тем, какая часть шаблона будет включаться в страницу, с помощью тэгов <noinclude>
, <includeonly>
и <onlyinclude>
.
Всё, что находится между тегами <noinclude>
и </noinclude>
, будет обрабатываться и отображаться только если страница шаблона просматривается сама по себе. Возможное применения данной возможности следующие:
- Отнесение самих шаблонов к каким-либо категориям
- Межъязыковые ссылки на похожие шаблоны на других языках
- Пояснительный текст по использованию шаблона It's a common pattern on some wikis to use a template like {{Документация }} to transclude the documentation from a subpage of the template. For example, Template:Void is documented at Template:Void/doc.
Противоположным образом работает тэг <includeonly>
. Текст, находящийся между тегами <includeonly>
и </includeonly>
будет обрабатываться и отображаться только когда страница шаблона включена в другую страницу. Это полезно в таких ситуациях как:
- Добавление всех страниц, содержащих данный шаблон, в категорию, без добавления самого шаблона в эту категорию. Замечание: Когда вы изменяете категории, добавляемые в страницу с использованием шаблонов, категоризация может не сработать сразу, так как она управляется Manual:Job_queue . Для принудительной повторной категоризации определенной страницы, откройте эту страницу в редакторе и сохраните её без изменений.
- Обеспечение того, чтобы код шаблона не выполнялся при просмотре самой страницы шаблона. Обычно это нужно, когда шаблон использует параметры, а его выполнение без параметров нежелательно.
Весь текст шаблона, кроме частей, заключённых в теги <noinclude>
и <includeonly>
, обрабатывается и отображается как обычно; то есть как при непосредственном просмотре страницы шаблона, так и при добавлении шаблона на другую страницу.
Основное внимание уделяется тому, что находится внутри этих двух тегов.
А вот всё, что находится за пределами тегов <onlyinclude>
, исключается из обработки и отображения при вызове шаблона.
Даже разделы, помеченные как includeonly, игнорируются при вызове такого шаблона, если только они не помечены как onlyinclude.
В центре внимания только то, что находится внутри этого тега.
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.
Вложение всех этих тегов также возможно.
Эти три тега частичного включения дают все возможные комбинации, того, что будет обрабатываться и отображаться.
Коментарии также играют роль.
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.
Систематизация шаблонов
Для эффективного использования шаблонов нужно, чтобы их было легко находить и применять.
Чтобы найти их, пользователи могут:
- Нажать Служебные страницы > Все страницы
- В списке Пространство имён:, выбрать Шаблон и нажать Выполнить.
Чтобы предоставить информацию об использовании, приведите пример, подобный этому, на странице шаблона:
<noinclude> == Использование == Добро пожаловать, пользователи: {{Thankyou|reason=ваша причина|signature=ваша подпись}} </noinclude>
Таким образом редактор сможет просто скопировать пример и модифицировать его для своих нужд.
При редактировании страницы список всех используемых шаблонов доступен в форме редактирования в сворачиваемом разделе под названием "Шаблоны, используемые на этой странице:" (также называемом "Шаблоны, используемые в режиме предпросмотра:" или "Шаблоны, используемые в этом разделе:" в зависимости от контекста). В этом списке содержится удобная ссылка на страницу шаблона, а также информация о статусе его защиты. Шаблоны перенаправления отображаются курсивом, а цель перенаправления добавляется как отдельный элемент списка.
Ссылки на шаблон
На страницу шаблона можно сослаться как на любую другую вики-страницу. Например, ссылка Template:Navbar создаётся викикодом [[Template:Navbar]]
.
На многих Вики может быть использован шаблон Template:Tl, чтобы предоставить ссылку на шаблон отформатированной с использованием Вики-разметки таким образом, что шаблон будет показываться в виде "двойных фигурных скобок" что в случае включения шаблона исключает необходимость фактического выполнения включения шаблона. Например, код {{tl|Navbar}}
может использоваться для создания связи {{Navbar }}.
Эта конструкция обычно используется в документации по шаблонам, на страницах справки и на страницах обсуждения при обращении к шаблонам.
Такого же эффекта можно добиться и при использовании {{[[Template:Navbar|Navbar]]}}
, но {{Tl }}
подход предполагает гораздо меньшую типизацию.
На любой данной вики-странице шаблон Tl, если он существует, может отображать или не отображать текст в элементе «код» или в виде моноширинного шрифта.
Если нет (как в этой вики), то это может сделать другой шаблон с аналогичным именем.
Например, посмотрите раздел «См. также» в документации к нашему шаблону:Tl.
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.
Копирование из одной вики в другую
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.
Шаблоны часто требуют CSS или других шаблонов, поэтому пользователи часто испытывают проблемы с копированием шаблонов из одной вики-страницы в другую. Приведенные ниже шаги должны работать для большинства шаблонов.
Код MediaWiki
Если у вас есть права на импорт (в частности, импорт загрузки) в новую вики-страницу:
- Перейти к Special:Export оригинальной Вики, и скачать .xml-файл с полной историей всех необходимых шаблонов, а именно:
- Введите имя шаблона в большой текстовый блок, например "Template:Welcome". Обратите особое внимание на заглавные буквы и специальные символы — если имя шаблона не совсем правильно, экспорт все равно может произойти, но.xml-файл не будет содержать ожидаемых данных.
- Выберите блок «Включить шаблоны».
- Выберите блок «Включать только текущую версию, без полной предыстории».
- Нажмите «Экспортировать».
- Перейдите к Special:Import на новой вики и выгрузите .xml файл.
Если у вас нет прав на импорт в новую вики-страницу:
- Перейдите к шаблону, который вы хотите скопировать из исходной вики-страницы. Перейдите на страницу редактирования и скопируйте весь викитекст.
- На новой вики-странице перейдите на страницу с тем же именем, что и скопированный шаблон. Нажмите на Создать/Отредактировать и вставьте скопированный вами викитекст. В сводке редактирования каждого шаблона укажите ссылку на исходную страницу для атрибуции.
- Вернувшись в исходную вики-страницу в окне редактирования, под полем редактирования, посмотрите на список "Шаблоны, используемые на этой странице". Для каждого из перечисленных шаблонов следуйте этим инструкциям. Также сделайте это для любого шаблона, используемого любым из этих шаблонов, и так далее.
Это позволит скопировать весь необходимый код, и будет достаточно для некоторых шаблонов. Обратите внимание, что экспортируются только элементы страницы, проанализированные при рендеринге страницы, поэтому подстраницы документации не экспортируются как часть этого процесса. Если это не работает, также проверьте наличие красных ссылок, перечисленных в разделе "Страницы, переведенные на текущую версию этой страницы:" под полем редактирования. Если таковые имеются, повторите описанные выше шаги и для них, а также скопируйте код в модули.
После успешного импорта шаблона и всех связанных с ним шаблонов из другой Вики отредактируйте его, чтобы изменить настройки в соответствии с вашей Вики. Например, измените логотип, удалите избыточные категории или красные ссылки.
Расширения
Расширение, часто используемое в шаблонах, это ParserFunctions. Посетите страницу Расширение:Функции парсера и проверьте, используются ли какие-либо из перечисленных там функций в скопированных вами шаблонах. Если это так, Вы должны установить расширение Функции парсера . Чтобы установить его, Вам понадобится доступ системного администратора к серверу вашей установки MediaWiki.
Еще одна зависимость, которая может быть использована в шаблонах, особенно в Википедии, это Lua. Хорошим признаком для этого является наличие {{#invoke: }}
в коде шаблона.
В случае, если он используется, вам нужно установить расширение Scribunto , а также потребуется доступ системного администратора.
На этой странице можно найти дополнительные инструкции по установке и использованию расширения.
CSS и JavaScript-код
Помимо кода MediaWiki, многие шаблоны используют CSS, а некоторым для полной работы потребуется JavaScript. Если скопированные шаблоны ведут себя не так, как ожидалось, причина может быть в этом. Чтобы скопировать необходимые CSS и JavaScript в вашу вики, Вам, обычно, нужно иметь права администратора, потому что вы будете редактировать системные сообщения в пространстве имен "MediaWiki:".
- Ищите использование CSS-классов (текст типа
class="foobar"
) в тексте шаблона. Если эти классы появятся в разделе "MediaWiki:Common.css"" или "MediaWiki:Monobook.css" на оригинальной вики-странице скопируйте эти классы в "MediaWiki:Common.css" на новой вики-странице и проверьте, все ли в порядке с шаблоном. - Если скопированный шаблон все еще не работает должным образом, проверьте, есть ли код в MediaWiki:Common.js" или "MediaWiki:Monobook.js" на оригинальной вики-странице. Если это так, вы можете попробовать скопировать его в "MediaWiki:Common.js" на новой вики-странице. Обычно рекомендуется копировать код только из надежных источников и сначала просмотреть код, чтобы определить и выбрать соответствующие части. Вы можете найти комментарии, которые могут служить подсказками для определения функциональности каждой части.
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.
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 }}
givesx=abc
См. также
Общее использование шаблона
- Manual:Expr parser function syntax
- Help:Substitution
- w:Help:Template
- Manual:Advanced templates – * m:Help:Advanced templates – описывает еще более продвинутые методы, такие как динамические вызовы шаблонов и имена переменных параметров
- Help:Multiple-instance templates - on the use of multiple instances of the same template on a page.
- Manual:Newlines and spaces#Automatic newline
Специальные конструкции, используемые в шаблонах
- Справка:Волшебные слова – функциональные вещи («волшебные слова»), которые вы можете найти в некоторых шаблонах
- Справка:Расширение:Функции парсера – дополнительно причудливые функции управления такие как #if и #switch
- Справка:Функции парсера в шаблонах – руководство по использованию функций парсера в шаблонах
- Справка:TemplateData
- Справка:Расширение:Функции парсера
- Расширение:Scribunto
Другая важная информация
- Help:ExpandTemplates
- Справка:Внешний поиск – пример необычного использования шаблонов.
- Manual:Importing Wikipedia infoboxes tutorial
- Extension:PageTemplates
- Manual:Создание страниц с предзагрузкой текста – Использование шаблонов в качестве исходного текста страницы
- Справка:Включение – встраиваемые страницы из пространств имен отличающихся от
Template:
- Manual:Template limits
- Справка:Ссылки сюда
- Special:Mostlinkedtemplates - shows the templates with the most uses
- Special:Unusedtemplates - shows templates with no uses (although they may be substituted)
- Manual:$wgEnableScaryTranscluding - using templates from other wikis
- w:WP:Anatomy of a template
- w:Wikipedia:Transclusion costs and benefits
- Manual:Parser.php
- Help:Extension:TemplateSandbox - for previewing your changes to a template as it renders elsewhere
Внешние ссылки
- Хранилище шаблонов Miraheze - Шаблоны MediaWiki предназначены для общего использования.