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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Параметры, присутствующие в вызове шаблона, но отсутствующие в теле шаблона, игнорируются. Именованные параметры чувствительны к регистру символов.

При вызове шаблона выполняются два типа подстановок:

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

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

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

и он называется «Шаблон». Тогда при вызове шаблона в тексте страницы записью

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

шаблон будет развёрнут в

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

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

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

  1. вставка в месте вызова шаблона текста, заготовленного в шаблоне; вставка ссылки на другую статью или подстраницу, имя которой заготовлено в шаблоне; а также вставка других объектов — файлов изображений и т. д.;
  2. вставка в месте вызова шаблона значений параметров; вставка ссылки на (под)страницу, имя которой указано в качестве значения параметра; вставка других объектов, имена которых указаны в качестве значений параметров — файлов изображений и т. д.

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

Если в строке вызова шаблона с именованными или нумерованными параметрами параметр не получил значение, то он остается нераскрытым текстом: с именованными параметрами {{{parameter1}}}, с нумерованными параметрами {{{1}}}. Параметр будет раскрыт в дальнейшем, если вызвавшая шаблон статья включается в другую, где этот параметр задан.

Заметим, что вызов шаблона с именованными параметрами {{Шаблон1|parameter1=|parameter2=a}} делает параметр parameter1 определённым, равным пустой строке. Вызов {{Шаблон1|parameter2=a}} задает параметр parameter2, parameter1 не определен.

Аналогично для шаблона с нумерованными параметрами: вызов {{Шаблон2||a}}) делает первый параметр определённым, равным пустой строке, вызов {{Шаблон2|2=a}}) задает второй параметр, первый параметр не определен.

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

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

Чтобы не появлялся нераскрытый текст параметра с не заданным значением, используют условное значение параметра в тексте шаблона. Именованный или нумерованный параметр parameter внутри шаблона записывается в форме {{{parameter|альтернативный текст}}}. Если значение параметра не задано (или пусто) в вызове шаблона, то будет использован альтернативный текст; если задано непустое значение параметра, то используется заданное значение. Например, альтернативный текст пустой: {{{parameter|}}}. Тогда если значение параметра задано при вызове шаблона — используется заданное значение; если значение параметра не задано — используется пустое значение, то есть в месте параметра никакой текст выводиться не будет.

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

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

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

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

Если проверяемый параметр шаблона записан в форме {{{parameter}}}, то непустое значение параметра означает: либо его значение задано непустым при вызове шаблона, либо оно не задано и остается неопределенным, то есть неизвестно, задано значение параметра или нет. Чтобы иметь возможность вызывать шаблон с меньшим количеством параметров, чем в тексте шаблона, и чтобы не заданные параметры игнорировались, параметры в теле шаблона записываются в форме {{{parameter| }}}. Если при вызове шаблона задано непустое значение параметра, то оно будет использоваться. В противном случае используется условное значение параметра пусто.

Пример использования условного значения пусто для параметра sample:

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

Реальный пример использования функции парсера {{#if}}, которая является частным случаем условного оператора, можно найти в коде шаблона {{Fidonet}}.

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

Пусть нужно вывести имена параметров с заданными значениями в виде текста, а имена параметров, значения которых не заданы или пустые, не выводить. Для этого будем использовать условный оператор в сокращенной форме:

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

Если все значения параметров заданы и не пустые, то результаты условных операторов выстраиваются в одну строку. Если значение второго параметра не задано или задано пустым, то между первым и третьим результатом появляется пустая строка. Такой же же эффект дает вариант со вторым оператором в полной форме: {{#if: {{{sample2|}}} | '''sample2'''!| |}}. Такое действие условного оператора позволяет увидеть по пустым строкам, что не все значения параметров заданы. Однако, если шаблон используется для последовательной вставки фрагментов текста, текст будет выглядеть разорванным.

Тот же пример, но второй условный оператор в полной форме и выводит неразрывный пробел. Результаты выводятся в строку:

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

Тот же пример, но второй условный оператор в сокращенной форме и после него стоит неразрывный пробел. Результаты также выводятся в строку:

{{#if: {{{sample1|}}} | '''sample1'''! }}
{{#if: {{{sample2|}}} | '''sample2'''! }}{{nobr|}}
{{#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!

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

sample1! sample3!

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

sample1! sample3!

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

sample1! sample3!

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

sample1!

<пустая строка>

sample3!

Если один перевод строки подавлен, например, малым неразрывным пробелом {{nobr|}}, то условный оператор во второй строки не выводит ни одного перевода строки и весь результат обработки выводится в строку:

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)

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

4 июля 2015, 02:18 (UTC)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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