帮助:模板命名空间

帮助页面
命名空间
基本命名空间
讨论命名空间
  • 1 条目讨论
  • 3 用户讨论
  • 5 项目讨论
  • 7 文件讨论
  • 9 MediaWiki讨论
  • 11 模板讨论
  • 13 帮助讨论
  • 15 分类讨论
  • 275 微件讨论
  • 301 同人作品讨论
  • 303 草稿讨论
  • 305 SMW数据讨论
  • 829 模块讨论
虚拟命名空间
未启用命名空间
  • 2300 Gadget
  • 2302 Gadget definition

模板是MediaWiki软件自带的一项功能,用于在多个页面显示相同的内容。所有的模板页面都位于“模板”命名空间下。在条目页面,你往往会看到一些消息框,以及页面右上角关于条目基本信息(如对于人物,有出生地、国籍等)的信息框,底部还会有导航框,这些都是利用了模板的功能。

模板的优点在于易于维护。当模板的内容改变之后,嵌入了该模板的页面中的相应内容也将改变,不需要编辑这些页面。

在wikitext中,嵌入一个模板的基本语法是{{模板名称|参数}}。参数可以有多个,也可以没有。模板名称就是模板页面的名称,通常不含命名空间。

你可以在此页面查看本站的所有模板。

概述

假设有个页面叫做“Template:欢迎”,其页面内容如下:

欢迎来到有兽档案馆!

那么,在其他页面,使用{{欢迎}}就可以得到“欢迎来到有兽档案馆!”的文字。如果“Template:欢迎”的内容被改变,那么其他使用了该模板的页面的内容也将会相应改变。

您所输入的
{{欢迎}}
您所看到的

欢迎来到有兽档案馆!

一般地,在任何页面,使用{{名称}}即可嵌入包含该名称的模板页面,该模板对应页面“Template:名称”。如果该模板页面内容被改变,那么嵌入包含了该模板的页面中相应的内容也将改变。

非模板命名空间的页面也可以被嵌入包含。在嵌入包含页面时,可以指定命名空间,主命名空间页面可以在名称前加上一个“:”。例如,{{:有兽杂谈}}将会嵌入包含名为“有兽杂谈”而非“Template:有兽杂谈”的页面。

参数

参数是指每次调用模板时都需要指定的变量。参数一般是在模板中定义的,并在每次调用模板时赋值。

例如,假如页面“Template:欢迎”的内容改成如下内容,设定一个参数:

{{{1}}},您好,欢迎来到{{{2}}}!

那么,在其他页面,嵌入此模板时就需要提供参数。比如:

您所输入的
{{欢迎|Steve|Minecraft}}
您所看到的

Steve,您好,欢迎来到Minecraft!

您所输入的
{{欢迎|Administrator|Windows XP}}
您所看到的

Administrator,您好,欢迎来到Windows XP!

从上面的模板代码中不难看出,三层花括号中的数字表示第几个参数,例如{{{1}}}就是第一个参数,{{{2}}}则是代表第二个参数。

参数的名称除了可以是数字之外,也可以是固定的文本。此外,参数还可以指定默认值,这样当参数未被指定时,则取默认值。

编号参数

编号参数是指名称为正整数的参数,在嵌入模板时,这些参数通常都是依次提供,不需要指定参数名称,系统知道这是第几个参数,因此也称为匿名参数

调用模板时,如果传入多个参数,则这多个参数用管道符|分隔。例如,在{{模板名称|a|b|c}}中,a对应参数{{{1}}}b对应参数{{{2}}}c对应参数{{{3}}}

通常来说,编号参数是不指定名称的,因为系统很清楚每个参数是第几个参数。但是,你也可以为每个参数指定名称,即“名称=值”的形式。例如,{{模板名称|a|b|c}}实际上也就相当于{{模板名称|1=a|2=b|3=c}}。当参数名称被明确指定时,参数的赋值顺序就不再重要。例如,{{模板名称|1=a|2=b|3=c}}{{模板名称|1=a|3=c|2=b}}是同一个意思,尽管c排在了b的后面,但调用时很明确地指定了c是第3个参数,而b是第二个参数。以Template:参见为例:

您所输入的
{{参见|辟邪|荔枝|天禄}}
您所看到的
参见:辟邪、​荔枝天禄
您所输入的
{{参见|1=辟邪|2=荔枝|3=天禄}}
您所看到的
参见:辟邪、​荔枝天禄
您所输入的
{{参见|1=辟邪|3=天禄|2=荔枝}}
您所看到的
参见:辟邪、​荔枝天禄

并不建议在同一个模板调用中混合隐式命名和显式命名的形式,否则容易出错。比如,在{{模板名称|1=a|2=b|c|d}}中,a和c实质上都是第一个参数,b和d都是第二个参数。当同一个参数被赋值多次的时候,软件会报出警告。

编号的参数隐式赋值时有一个限制,就是内容不能包含等号,否则会被识别为命名参数。例如,设想被欢迎的人的名字叫做“x+y=z”,嵌入{{欢迎|x+y=z|有兽档案馆}}并不会得到“x+y=z,您好,欢迎来到有兽档案馆!”,因为这样的模板调用中,会将x+y=z理解为:名称为“x+y”的参数值为“z”,而非第一个参数的值为“x+y=z”。这种情况下,可以通过指定参数名称或绕开等号的方式来解决:

您所输入的
{{欢迎|x+y=z|有兽档案馆}}
您所看到的

{{{1}}},您好,欢迎来到有兽档案馆!

您所输入的
{{欢迎|1=x+y=z|2=有兽档案馆}}
您所看到的

x+y=z,您好,欢迎来到有兽档案馆!

您所输入的
{{欢迎|x+y<nowiki>=</nowiki>z|有兽档案馆}}
您所看到的

x+y=z,您好,欢迎来到有兽档案馆!

您所输入的
{{欢迎|x+y{{=}}z|有兽档案馆}}
您所看到的

x+y=z,您好,欢迎来到有兽档案馆!

上面的第二种方法也适用于参数的值中含有管道符|的情形,假如你需要将|用作参数值的内容,而不是将其用来分隔参数,则可以用nowiki标签或魔术字{{!}}。假如被欢迎的用户名字叫做“A|B”:

您所输入的
{{欢迎|A|B|有兽档案馆}}
您所看到的

A,您好,欢迎来到B!

您所输入的
{{欢迎|A<nowiki>|</nowiki>B|有兽档案馆}}
您所看到的

A|B,您好,欢迎来到有兽档案馆!

您所输入的
{{欢迎|A{{!}}B|有兽档案馆}}
您所看到的

A|B,您好,欢迎来到有兽档案馆!

此外,与明确指定参数名称相比,隐式的参数名称赋值还有一个特点就是,隐式的赋值保留首尾空格。当指定参数名称赋值时,如果参数值的两端有空格,这些空格就会被移除:

您所输入的
{{欢迎|   User   |   求 闻 百 科   }}
您所看到的

User ,您好,欢迎来到 有 兽 档 案 馆 !

您所输入的
{{欢迎|1=   User   |2=   有 兽 档 案 馆   }}
您所看到的

User,您好,欢迎来到有 兽 档 案 馆!

命名参数

如果模板有很多参数,大量使用编号参数则很容易让人弄晕,这时候可以为参数指定具体的名称。命名参数是指名称为其他任意字符的参数。在调用模板时,赋值参数时就必须明确指定参数名称。

例如,将上述提到的“欢迎”模板的代码改为:

{{{username}}},您好,欢迎来到{{{sitename}}}!

这样,嵌入模板时,就需要提供参数名称以及其值,例如:

您所输入的
{{欢迎|username=Example1|sitename=萌娘百科}}
您所看到的

Example1,您好,欢迎来到萌娘百科!

您所输入的
{{欢迎|username=ExampleX=Y|sitename=Media Wiki}}
您所看到的

ExampleX=Y,您好,欢迎来到Media Wiki!

由于命名参数在赋值时必须指定名称,因此不会存在参数值被等号打断的问题,参数值的首尾空格也将自动被截去。如果确实需要保留空格,可以使用nowiki标签进行转换,例如:

您所输入的
{{欢迎|username=Example1<nowiki>    </nowiki>|sitename=<nowiki>    </nowiki>萌娘百科}}
您所看到的

Example1 ,您好,欢迎来到 萌娘百科!

参数的默认值

在模板代码中,每次定义参数都可以为参数提供一个默认值缺省值

嵌入模板时,如果某个参数(无论是编号参数还是命名参数)被定义了但没有提供值,则解析模板时使用该参数的默认值,如果没有指定默认值,则不处理参数。

在上面的这个例子中,可以给sitename参数添加默认值“有兽档案馆”,即:

{{{username}}},您好,欢迎来到{{{sitename|有兽档案馆}}}!

这样,{{欢迎|username=User114514}}将等价于{{欢迎|sitename=有兽档案馆|username=User114514}}

需要注意的是,不提供值与提供空值是不同的。例如,{{欢迎|sitename=|username=User114514}}将直接产生“User114514,您好,欢迎来到!”。

另外,参数的默认值也可以设为空字符串,然后使用解析器函数进行处理。这里,将“欢迎”模板再进行一些增强:如果username没有指定,或者为空,则不显示username,“您好”一词之前也没有显示逗号;如果sitename没有指定,或者为空,则显示为“有兽档案馆”。代码如下:

{{#if:{{{username|}}}|{{{username}}},}}您好,欢迎来到{{#if:{{{sitename|}}}|{{{sitename}}}|有兽档案馆}}!

上面的模板调用效果如下:

您所输入的
{{欢迎|username=User114514}}
您所看到的

User114514,您好,欢迎来到有兽档案馆!

您所输入的

{{欢迎|sitename=|username=User114514}}

您所看到的

User114514,您好,欢迎来到有兽档案馆!

您所输入的

{{欢迎|sitename=萌娘百科!}}

您所看到的

您好,欢迎来到萌娘百科!

您所输入的

{{欢迎|sitename=萌娘百科|username=}}

您所看到的

您好,欢迎来到萌娘百科!

模板默认值可以用来达到参数别称的效果。例如,{{{username|{{{用户名|{{{用戶名|{{{使用者名稱|}}}}}}}}}}}}。但是,一般不建议使用参数别称。

替换引用

替换引用是指使用该模板的页面被保存时,相关代码就会被替换为模板的内容。替换引用有三种形式:

  • subst:页面被保存时,调用模板的代码将被一次性替换为保存时的模板内容,这些内容将成为页面的一部分,可以像一般内容一样被编辑,与原来的内容分开。如果此后原模板页面被更改,被替换后的内容将不受影响。
  • safesubst:允许替换而不打破嵌入包含。当模板遇到非替换的展开(嵌入包含)时,subst的替换会保持不被解析,而safesubst则会视为像没有safesubst修饰符存在一样,因此子模板会被嵌入包含,变量和解析器函数会被求值。
  • msgnw:以作为原始wiki语法的形式显示包含模板。

嵌入包含

嵌入包含,简称嵌入,是指在页面中显示另一个页面(通常是模板)的内容。假如,A页面中有代码{{B}},则页面“A”嵌入包含了“Template:B”,页面A称为目标页,页面B称为来源页。

控制被嵌入包含的部分

被嵌入包含的页面中,<noinclude><includeonly><onlyinclude>可以用来控制哪些内容需要被嵌入包含。

  • <noinclude>...</noinclude>内的部分,在源页面自身会显示,但是在目标页面嵌入时不会显示。
  • <includeonly>...</includeonly>内的部分,在源页面自身不会显示,但是在目标页面嵌入时会显示。
  • <onlyinclude>...</onlyinclude>若存在,则该标签以外的部分在目标页面嵌入时都不会显示。

这里举个例子(假设模板名称为hw):

源页面 目标页面的模板调用 源页面效果 目标页面效果
Hello<noinclude> world</noinclude>!
{{hw}}
Hello world! Hello!
Hello<includeonly> world</includeonly>!
{{hw}}
Hello! Hello world!
Hello <onlyinclude>world</onlyinclude>!
{{hw}}
Hello world! world

控制嵌入包含内容的最典型的例子就是模板文档。模板代码中,往往会出现<noinclude>{{doc}}</noinclude>,这样在模板页面自身会出现模板文档,但是其他页面嵌入该模板时,不会将整个文档嵌入包含进去。类似的,文档中的模板分类链接也会被<includeonly>...</includeonly>包含,这样文档自身不会加入分类,但当模板嵌入包含该文档时,则会将模板加入这些分类。