Как изменить теги в шаблонах, чтобы установить категории только на исходной странице

#mediawiki #mediawiki-templates

#mediawiki #mediawiki-шаблоны

Вопрос:

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

Итак, если у меня есть определение шаблона для шаблона:Person

 <includeonly>Name: {{{1|}}}
[[Category:People]]
</includeonly>
 

Затем на странице персоны «Джон Смит», которая добавляет Джона Смита в категорию людей, как требуется

 {{Person|John Smith}}
 

Но тогда у меня есть страница, которая перекрывает страницу Джона Смита, но я не хочу, чтобы она была в категории Люди. Скажем, страница «Сотрудник недели» имеет

 == Best employee ever ==
{{:John Smith}}
 

Теперь у меня такое чувство, что это можно сделать с {{subst:}} помощью или {{safesubst:}} как описано здесь: https://www.mediawiki.org/wiki/Help:Substitution но я не могу этого понять

Теперь я вижу, что в Википедии есть шаблон, который выглядит так, как будто он делает то, что я хочу, https://en.wikipedia.org/wiki/Template:Noinclude но я не могу этого понять, и у меня это не работает. Одной из вещей, которые я пробовал, было добавление шаблонов noinclude и dtag в мою вики, а затем попытка сделать это для Template:Person, но это не сработало

 <includeonly>Name: {{{1|}}}
{{subst:noinclude|[[Category:People]]}}
</includeonly>
 

Комментарии:

1. Я не думаю, что то, что вы пытаетесь сделать, возможно без {{subst:Person|John Smith}} , что затем расширяет шаблон на странице пользователя, где шаблон может добавлять <noinclude> теги вокруг категории.

Ответ №1:

Попробуйте это:

 <includeonly>Name: {{{1|{{PAGENAME}}}}}
{{#ifeq:{{PAGENAME}}|{{{1|{{PAGENAME}}}}}|[[Category:People]]}}</includeonly>
 

Функция синтаксического {{#ifeq:}} анализа предоставляется расширением ParserFunctions, поставляемым с MediaWiki. Он сравнивает первые два аргумента и возвращает третий, если они равны, четвертый в противном случае.

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

Комментарии:

1. Хорошая идея, я бы не стал использовать значение по умолчанию. Это означает, что написание {{Person}} «John Doe» будет работать, но если вы затем включите {{:John Doe}} его в другом месте, он отобразит » Имя: сотрудник недели » (и включит его в категорию).

2. Мне нравится эта идея, я попробую ее завтра

3. @Берги, достаточно справедливо. Использование значений по умолчанию — моя привычка, в то время как преобразование страниц без шаблонов — нет.

Ответ №2:

Я пошел на более сложное решение, которое работает для меня. Сначала я установил расширение переменных, https://www.mediawiki.org/wiki/Extension:Variables

Затем создал шаблон Template:SetCategories

 <includeonly>{{#varexists:hidecats||{{#arraymap:{{{names|}}}|,|x|[[Category:x]]|}}}}</includeonly>
 

Затем у меня (уже был) шаблон трансклюзии, Template:IncludePageWithHeader поэтому я добавил переменную при трансклюзии страницы {{#vardefine:hidecats|yes}}

 <includeonly>{{#switch: {{{heading_level|}}}
| 2 = == [[{{{name|}}}{{#if: {{{extra|}}}|,amp;#32;{{{extra|}}}|}}|{{{name|}}}]] ==
| 3 = === [[{{{name|}}}{{#if: {{{extra|}}}|,amp;#32;{{{extra|}}}|}}|{{{name|}}}]] ===
| 4 = ==== [[{{{name|}}}{{#if: {{{extra|}}}|,amp;#32;{{{extra|}}}|}}|{{{name|}}}]] ====
| === [[{{{name|}}}{{#if: {{{extra|}}}|,amp;#32;{{{extra|}}}|}}|{{{name|}}}]] ==
}}
{{#vardefine:hidecats|yes}}
{{:{{{name|}}}{{#if: {{{extra|}}}|,amp;#32;{{{extra|}}}|}}}}</includeonly>
 

Итак, теперь Template:Person становится

 <includeonly>Name: {{{1|}}}
{{SetCategories|names=People}}
</includeonly>
 

И тогда сотрудником недели становится

 {{IncludePageWithHeader|name=John Smith}}