Википедия:Механизм шаблонов

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
↱ ВП:МШ

Шаблоны — класс особых страниц в MediaWiki (программном обеспечении Википедии), содержимое которых можно вставить в другие страницы. Причём это содержимое считывается при каждой загрузке страницы: изменения в шаблоне проявятся на страницах, их применяющих. Ниже описывается их работа.

Общая информация[править | править вики-текст]

Страницы шаблонов — полноценные вики-документы, для которых отведено своё пространство имён Шаблон:. В Википедии их позволено править любому участнику.

Вызывается шаблон пометкой {{Имя шаблона}}. При отображении страницы на место этого будет помещено содержимое страницы Шаблон:Имя шаблона. Если её ещё нет, то пометка будет отображена как ссылка на несуществующую статью шаблона. Поэтому, чтобы не озадачивать читателя красной ссылкой, подобной Шаблон:Несуществующий шаблон, удостоверьтесь в существовании вызываемых шаблонов — это делается предпросмотром страницы до сохранения правки.

Если в главном пространстве имён существует статья Имя шаблона, то можно вызвать её, поставив перед именем шаблона двоеточие: {{:Имя шаблона}}. Таким образом, любую страницу можно использовать как шаблон. Если вызывать картинку загруженную в Википедию, но не на Викисклад — ({{Файл:Имя шаблона}}) или категорию — ({{Категория:Имя шаблона}}), то будет подставлена описательная часть картинки или категории соответственно. Таким способом удобно

  • экспериментировать с шаблонами (не залезая в пространство шаблонов),
  • «вытаскивать» подписи и описания картинок,
  • изготавливать специальные составные статьи (например, для печати).

Если Вы наберёте {{/Имя подстраницы}}, то на той странице, где Вы проставили шаблон, будет отображаться содержимое её подстраницы. По такой конструкции построены шаблоны {{/Шапка}}, часто используемые в пространстве имён Википедия:. К примеру, попытавшись править страницу Википедия:Заявки на статус патрулирующего, в её начале Вы увидите шаблон {{/Шапка}}. Это означает, что показывается текст подстраницы Википедия:Заявки на статус патрулирующего/Шапка.

Как обычно в MediaWiki, имя статьи или шаблона чувствительно к регистру, а пробел эквивалентен подчёркиванию.

Возможно также включение шаблона в шаблон, то есть вызов одного шаблона из другого и (или) из него же самого́.

Переменные шаблона (см. ниже) вычисляются после вставки шаблона в вызывающую его статью, то есть если в шаблоне содержится подстановка {{PAGENAME}}, то она будет развёрнута в имя вызывающей статьи, а не в имя этого шаблона.

Список ссылок на используемые в тексте страницы шаблоны показывается в окне редактирования статьи, причём показываются все шаблоны, даже если редактируется только раздел документа, который не содержит шаблонов (при предварительном просмотре).

Параметры[править | править вики-текст]

Параметры шаблона могут быть поименованными или пронумерованными. Синтаксис использования может быть:

  • {{templatename|parname1=parvalue1|parname2=parvalue2}}, тогда в теле шаблона надо ссылаться на {{{parname1}}}, {{{parname2}}};
  • {{templatename|parvalue1|parvalue2}}, тогда в теле шаблона нужно использовать {{{1}}}, {{{2}}}.

Лишние (не используемые в теле шаблона) параметры игнорируются.

Имена параметров чувствительны к регистру символов.

Обратите внимание на тройные фигурные скобки при использовании параметров!

Таким образом, механизм шаблонов выполняет два типа подстановок:

  • имя шаблона в двойных фигурных скобках заменяется содержимым шаблона;
  • имя или номер параметра шаблона в тройных фигурных скобках заменяется значением параметра шаблона.

Параметром шаблона может быть ссылка на другую статью. Пусть, например, у нас есть такой шаблон:

Начало {{{1}}} Конец.

и он называется «Шаблон». Тогда его вызов

{{Шаблон|[[Заглавная страница|Главная страница]]}}

будет развёрнут в

Начало [[Заглавная страница|Главная страница]] Конец.

Неопределённые и пустые параметры[править | править вики-текст]

Если какой-либо параметр someparameter не задан, то он остается нераскрытым текстом {{{someparameter}}}, что позволит раскрыть его в дальнейшем, если вызвавшая шаблон статья также включается куда-либо ещё, где этот параметр задан.

Заметим, между прочим, что вызов {{Шаблон||a}} делает первый параметр определённым, но равным пустой строке. Если, напротив, нужно задать второй параметр, никак не определяя первый, то для этого следует использовать вызов {{Шаблон|2=a}}. Этот синтаксис следует использовать также и в том случае, когда значение параметра содержит знак равенства (например, «a=b»), поскольку вызов {{Шаблон|a=b|c}} не присвоит значение «a=b» параметру «1», а создаст параметр «a» со значением «b»; а вот {{Шаблон|1=a=b|2=c}} сделает всё как надо. Единственный минус состоит в том, что приходится нумеровать все параметры шаблона. Кроме этого, для вставки символа равенства можно использовать цифровую ссылку на этот символ (en:Numeric character reference), записав =, или же использовать в параметре специальный шаблон {{=}}, возвращающий «=».

Условное включение параметров[править | править вики-текст]

Если, наоборот, появление нераскрытого текста не желательно, то можно использовать условное включение параметра в текст шаблона. Параметр parameter, записанный в форме {{{parameter|альтернативный текст}}} будет включён в текст шаблона только в том случае, если значение параметра задано; в противном случае вместо значения параметра появится альтернативный текст. Этот способ уместен в тех обстоятельствах, когда для некоторого параметра шаблона подразумевается определённое значение по умолчанию. Самый простой пример: если некоторый параметр parameter записан внутри шаблона в форме {{{parameter|}}} (то есть если в качестве альтернативного текста используется пустая строка), тогда на его месте вообще ничего не будет выводиться (даже {{{parameter}}}) в том случае, если этот параметр окажется незаданным.

Иногда возникает необходимость переменить в тексте шаблона нечто большее, чем сам параметр, если этот параметр не задан. Для этой цели употребляются функции парсера: {{#if}} и другие. {{#if}} вызывается следующим образом:

   {{#if: проверяемая-переменная-или-параметр
    | текст-для-случая,-когда-значение-test-не-пустое
    | текст-для-случая,-когда-значение-test-пустое
    }}

Параметр else не является обязательным, поэтому можно использовать сокращённую форму:

   {{#if: проверяемая-переменная-или-параметр
    | текст-для-случая,-когда-значение-test-не-пустое
    }}

Пример употребления:

   {{#if: {{{sample|}}}
     | параметр '''sample''' определён!
     | параметр '''sample''' пуст!
     }}

Реальный пример применения {{#if}} вы можете найти в коде шаблона {{Fidonet}}.

Эффект пустых строк[править | править вики-текст]

Рассмотрим пример работы комбинации из трёх условных операторов:

{{#if: {{{sample1|}}} | '''sample1'''! }}
{{#if: {{{sample2|}}} | '''sample2'''! }}
{{#if: {{{sample3|}}} | '''sample3'''! }}

Если все операторы определены, то значения выстраиваются в одну строку. Однако, когда второй оператор не определён, между первым и третьим оператором появляется лишняя строка:

Ситуация Код при вызове шаблона Код Результат
Все операторы определены
|sample1=sample1
|sample2=sample2
|sample3=sample3
{{#if: {{{sample1|sample1}}} | '''sample1'''! }}
{{#if: {{{sample2|sample2}}} | '''sample2'''! }}
{{#if: {{{sample3|sample3}}} | '''sample3'''! }}

sample1! sample2! sample3!

Второй оператор не определён
|sample1=sample1
|sample2=
|sample3=sample3
{{#if: {{{sample1|sample1}}} | '''sample1'''! }}
{{#if: {{{sample2|}}}        | '''sample2'''! }}
{{#if: {{{sample3|sample3}}} | '''sample3'''! }}

sample1!

sample3!

Пустая строка между первой и третьей строкой возникает из-за того, что условный оператор второй строки вернул ничто и итоговая конструкция после обработки парсером принимает следующий вид:

'''sample1'''!
<пустая строка>
'''sample3'''!

Такой эффект может проявляться в шаблонах-карточках, когда на месте неопределённых параметров появляются пустые пространства. Чтобы не допустить подобного эффекта, необходимо не допускать переноса строки между условными операторами. Этого можно добиться несколькими способами:

Способ Код Результат
Писать все условные параметры в одну строку
{{#if: {{{sample1|sample1}}} | '''sample1'''! }}{{#if: {{{sample2|}}} | '''sample2'''! }}{{#if: {{{sample3|sample3}}} | '''sample3'''! }}

sample1!sample3!

Включать комментарии для исключения знака переноса
{{   #if: {{{sample1|sample1}}} |'''sample1'''! }}<!-- разделитель
-->{{#if: {{{sample2|}}}        |'''sample2'''! }}<!-- разделитель
-->{{#if: {{{sample3|sample3}}} |'''sample3'''! }}

sample1!sample3!

Делать переносы внутри условных операторов, а не между ними
{{
#if: {{{sample1|sample1}}} | '''sample1'''!
}}{{
#if: {{{sample2|}}}        | '''sample2'''!
}}{{
#if: {{{sample3|sample3}}} | '''sample3'''!
}}

sample1!sample3!

Просмотр содержимого шаблона[править | править вики-текст]

Чтобы увидеть «сырое» содержимое шаблона (подстановки параметров и т. д.), нужно смотреть на шаблон в режиме редактирования, поскольку в противном случае некоторые подстановки вроде {{PAGENAME}} могут раскрыться.

msgnw[править | править вики-текст]

Для показа содержимого шаблона (без вики-интерпретации) можно использовать кодовый «волшебный» префикс msgnw:. То есть {{Заготовка}} будет показана как

а {{msgnw:Заготовка}} как

{{Stub-meta|specification=Википедия:Шаблоны/Незавершённые статьи}}<noinclude>

[[Категория:Шаблоны:Незавершённые статьи| ]]

</noinclude>

Ссылка на редактирование шаблона[править | править вики-текст]

«Редактирующая» ссылка на каждой странице-статье не позволяет редактировать текст используемого шаблона, а иногда желательно иметь такую ссылку (приглашающую поправить шаблон, например, если шаблон ещё не устоялся, или если его содержимое может часто изменяться). Такую ссылку можно «зашить» внутрь самого шаблона, даже более того — сделать шаблоном, который можно использовать внутри других шаблонов. См. шаблон {{править}}.

Ограничения и возможности[править | править вики-текст]

Использование вложенных двойных или тройных фигурных скобок внутри двойных вложенных скобок[править | править вики-текст]

Не получится вызывать шаблоны в зависимости от содержимого других шаблонов.

Предположим, у нас есть шаблон {{tctc}} с содержимым «tc», и шаблон {{tc}} с содержимым «Ура». Тогда вызов {{{{tctc}}}} даст текст

{{{{tctc}}}}

а не «Ура».

При использовании такой формы вызова не получится использовать значение раскрытого шаблона при вызове другого шаблона.

Правильное использование значения раскрытого шаблона при вызове другого шаблона[править | править вики-текст]

Тем не менее, вызов {{{{tctc}} }} даст желаемый текст «Ура».

То есть использовать следует с пробелом между парами закрывающих фигурных скобок.

Также можно использовать значения переданных переменных при указании значений переменных для вызываемого шаблона.

Тег категории в шаблоне. Проблема с кэшированием[править | править вики-текст]

Если шаблон содержит код категории, то в указанную категорию помещается не только шаблон, но и все страницы, включающие его, поэтому удобно использовать шаблоны для рубрикации статей.

Но может возникнуть проблема с кэшированием — если поменять категорию у шаблона, то категория у включающих этот шаблон страниц поменяется не сразу, а только через некоторое время, после того как серверы Википедии выполнят необходимые действия. При необходимости быстро обновить большое количество статей с изменённым шаблоном можно обратиться к ботоводам с запросом на проведение нулевых правок. Кроме того, категория немедленно меняется у только что отредактированных статей, включая статьи, в которых сделана нулевая правка.

Желательно использовать категории, включённые в шаблон, только для шаблонов, предназначенных для пометки статей (типа {{stub}}), и не включать категории в навигационные шаблоны.

Теги noinclude, includeonly, onlyinclude[править | править вики-текст]

Всё, что находится между тегами <noinclude> и </noinclude> будет обрабатываться и показываться только в случае, когда шаблон показывается непосредственно, не включённым в другую страницу. Возможные применения:

  • Категоризация шаблонов самих по себе, а не тех страниц, в которые шаблон включён. Для шаблонов, имеющих страницы документации, рекомендуется проставлять категории в них, при этом там, напротив, используется <includeonly>.
  • Интервики на аналогичные шаблоны на других языках. Аналогичным образом рекомендуется проставлять на странице документации.
  • Страницы в пространстве имён MediaWiki.
  • Текст с объяснением того, как использовать шаблон. Как правило, для этого создаётся документация шаблона.

Тег <includeonly> обладает противоположным действием. Текст между <includeonly> и </includeonly> будет обрабатываться и показываться только тогда, когда шаблон включён в статью. Очевидное применение:

  • включение всех статей, содержащих шаблон, в категорию (при этом сам шаблон в категорию не попадёт).

Если текст обёрнут в теги <onlyinclude></onlyinclude>, только фрагмент внутри этих тегов (фрагменты, если тегов несколько) будет выводиться при включении этой страницы в другую. Обёртывание в этот тег определённого фрагмента текста аналогично обёртыванию всего остального текста страницы, кроме обёрнутого в onlyinclude, в тег noinclude.

Не допускайте пустых строк вокруг конструкций <noinclude> и <includeonly>, так как пустая строка будет интерпретироваться как перенос строки, который будет внесён шаблоном в статью.

Следует отметить, что при этом сохраняется описанная в предыдущем разделе проблема: если включить статью в категорию посредством шаблона, а затем изменить категорию в шаблоне, то статьи будут содержаться в старой категории, хотя при их просмотре будет создаваться впечатление, что они содержатся в новой; и статьи будут на деле включены в новую категорию либо немедленно после их редактирования и сохранения, или через некоторое время (по мере отложенной обработки заданий сервером Википедии).

Кэширование[править | править вики-текст]

Правка шаблона автоматически сбрасывает кэширование всех статей, напрямую использующих этот шаблон. Однако, в случае с косвенными зависимостями (шаблоны, зависящие от параметров и т. п.), внутренний кэш системы не сбрасывается и стандартный refresh браузера может не помочь.

В таких случаях используйте action=purge, то есть вызывайте URL типа:

[{{fullurl:{{FULLPAGENAME}}|action=purge}} Очистить кэш страницы]

что отобразится как Очистить кэш страницы.

Подстановка[править | править вики-текст]

Конструкция подст: (или subst:) после двойных фигурных скобок заставляет выполнять подстановку текста шаблона или даже переменной в момент сохранения ссылающейся страницы.

Например, текущие дата и время:

{{подст:CURRENTDAY}} {{подст:CURRENTMONTHNAMEGEN}} {{подст:CURRENTYEAR}}, {{подст:CURRENTTIME}} (UTC)

подставится при сохранении страницы:

23 августа 2012, 14:53 (UTC)

в то время как

{{CURRENTDAY}} {{CURRENTMONTHNAMEGEN}} {{CURRENTYEAR}}, {{CURRENTTIME}} (UTC)

каждый раз будет показывать текущее время:

28 ноября 2014, 14:53 (UTC)

{{subst:приветствие}} ~~~~ используется для приветствия новых участников.

Если нужно использовать подстановку для статьи из основного пространства имён, используйте конструкцию с двумя двоеточиями подряд. Так, следующий пример:

 {{подст::Страница}}

подставит в текст содержимое страницы Страница.

Альтернатива подстановке[править | править вики-текст]

  • Используйте {{..}}, затем воспользуйтесь страницей Служебная:Expandtemplates, скопируйте оттуда результат и замените исходные {{..}}.
  • Аналогично можно использовать msgnw.

Подстановка и функции парсера в примечаниях[править | править вики-текст]

Избегайте использования подстановки шаблонов в примечаниях (теги <ref></ref>) или проверяйте их правильную работу. Ошибка в MediaWiki препятствует разворачиванию некоторых (если не всех) подстановок в примечаниях. Для обхода проблемы сделана псевдофункция парсера {{#tag:}}; см. mw: Extension:Cite/Cite.php #Substitution and embedded parser functions (англ.).

Та же проблема и решение относятся к функциям парсера, хотя их редко требуется вызывать из <ref> напрямую.

Перенаправления[править | править вики-текст]

Когда страница, вызванная для включения, является страницей-перенаправлением, то включается содержимое страницы, на которую указывает перенаправление.

Страница, которая ничего не содержит, кроме включения другой страницы, в общем схожа со страницей-перенаправлением, но имеет и множество различий, например:

  • Заголовок страницы-результата есть имя исходной страницы, а не включаемой страницы.
  • Вся функциональность, (редактирование, обсуждение, список наблюдения, …) относится к включающей странице, и ничего (если не смотреть код) не связывает её с включаемой страницей.
  • Включающая страница лежит в тех же категориях, что и включаемая.
  • Работают «двойные перенаправления», основанные на включении.

Ссылки на шаблон[править | править вики-текст]

Отметим, что если ссылаться (в смысле гиперссылок) на шаблоны, как на обычные статьи, то нельзя передать им параметры (что, в общем, очевидно). Однако, иногда это может быть полезно, например, ссылка на увеличенное изображение.

История изменений для страниц, содержащих шаблоны[править | править вики-текст]

При просмотре исторических версий статей, содержащих шаблоны и/или картинки, всегда используется текущая версия шаблонов (и картинок), то есть невозможна автоматическая «абсолютная» реконструкция исторических версий композитных текстов, чтобы также содержались ссылки на соответствующие картинки и шаблоны.

См. также[править | править вики-текст]

Логотип «Мета-вики»
На «Мета-вики» имеется страница «Механизм шаблонов»