Wiki模板编辑教学

来自MCG大图书馆

如果需要在多个页面上放置类似的内容(如表格),使用模板将会很有帮助,尤其当这些内容较复杂时。

模板实际上就是 Wiki 页面,用来嵌入包含[1]在其他页面中的。

模板用法[编辑 | 编辑源代码]

因为模板实际上是 Wiki 页面,所以使用「链入页面」语法即可。

具体的,如果源页面在模板命名空间[2]下,如「Template:示例模板」,则仅填写模板名称本身即可{{示例模板}}

如果源页面在主命名空间下,如「铃兰花田」,必须在前面加上一个英文引号: {{:铃兰花田}};如果源页面在其它任何命名空间下,如「User:- 」,必须使用全名,包括命名空间的名称: {{User:-}}[3]

既然模板就是 Wiki 页面,使用模板的实质就是链入页面,所以不放到 Template 命名空间里并不妨碍模板的使用。

模板的参数(后文会提到)需要使用管道符(竖线,「|」)进行连接:{{ 示例模板 | 参数1 | 参数2 }}

当然,在可视化编辑模式下有一个对用户极为友善的插入模板界面,输入两个左大括号「{{」弹出。

模板创建[编辑 | 编辑源代码]

由于模板实际上就是 Wiki 页面,如果你有权限创建普通页面就可以创建模板。按照惯例,为了方便分类和搜素,模板一般被放置在 Template 命名空间中,而实际上并不需要放进去模板也能生效,上面讲了

由于在教程编写的时候 Wiki 貌似没有模板沙盒,故建议在个人沙盒页面进行模板测试。

现在你可以在你的用户沙盒添加以下内容来写你的第一个(存疑)模板:

<includeonly>问天地好在。
</includeonly><noinclude>
{{:{{FULLPAGENAME}}}}
</noinclude>

此处讲解各处的功能:

  1. <includeonly>......</includeonly>
    此内容直译为「仅包含」,意思是在直接访问时并不会显示,但是会在被其他页面链入包含时显示的部分。
  2. <noinclude>......</noinclude>
    此内容直译为「不包含」,意思是在直接访问时正常会显示,但是被其他页面链入包含时不显示的部分。
  3. 问天地好在。
    此内容是你模板的核心内容。
  4. {{:{{FULLPAGENAME}}}}
    此内容是在页面内预览该模板的效果,其中魔术字 {{FULLPAGENAME}} 是你页面的全名,参考上方的万能链入方法。

结合这四个部分,该内容的意义为:

  • 以「问天地好在。」文本作为模板,在此页面内不显示,而被其他页面链入时显示;
  • 在此页面内展示模板预览效果,并不在其他页面中展示预览效果。

这样你的第一个模板就写好了(即使因为没有模板沙盒,这个模板是在你的用户沙盒里的)。


若无特殊说明,用代码框框起来的内容默认为模板本体,用大括号双层嵌套的内容默认为模板使用,模板名(:{{FULLPAGENAME}})会替代为「模板名」。若无特殊情况,<includeonly><noinclude> 标签在下文不会再写出来。


模板参数[编辑 | 编辑源代码]

现在,我们假定有一个模板:

子曰:「道不同,不相为谋。」

当孔子说出来其他的话的时候,这个模板就不合适了,因为这里说的话是固定的「道不同,不相为谋」。

这就是为什么我们有模板参数来丰富嵌入包含的机制——通过填入参数,我们可以更改模板在页面中展示的效果。

对于这个例子,虽然各种人说话的语句格式看起来都差不多,但其特定内容(「说话的人」和「人说的话」)有所不同。基于这个理由,这些内容应该设置为参数。

在模板内,每一个参数都是被三组花括号包围,如 {{{1}}}。所以现在我们有:

{{{1}}}曰:「{{{2}}}。」

请注意参数的使用。这就是使用模板时在模板内识别传入的参数的方法。

通过 {{模板名|子|道听而涂说,德之弃也}},可以生成:

子曰:「道听而涂说,德之弃也。」

通过 {{模板名|曾子|吾日三省吾身}},可以渲染成:

曾子曰:「吾日三省吾身。」

在使用模板时,需要为参数赋值,不同参数间用一个管道符(竖线,|)分隔。MediaWiki 允许三种为参数赋值的方式:匿名(Anonymously)、编号(Numbered)、命名(Named)。

匿名参数[编辑 | 编辑源代码]

要传递匿名参数,需要按照顺序列举出所需参数:{{模板名|子|道不同,不相为谋}}

在这个例子中,该模板接受参数「{{{1}}}」和「{{{2}}}」,值分别为「子」和「道不同,不相为谋」,于是输出:

子曰:「道不同,不相为谋。」

传递匿名参数时,参数的顺序极为重要。如果调用模板时颠倒了参数的顺序,如 {{模板名|道不同,不相为谋|子}},输出会变成:

道不同,不相为谋曰:「子。」


按顺序识别参数仅对匿名参数有效,使用名称标识的参数无法以此方式访问。



若匿名参数内存在一个等号,该参数会被错误的解读成一个命名参数。例如说 {{模板名|子|1+1=2}},第二个参数位置会被错误解读为:参数「{{{1+1}}}」的值为「2」。为避免该问题,建议使用命名参数或编号参数来代替。具体见下文。


编号参数[编辑 | 编辑源代码]

对于上面的模板,我们还有一种方式来传递参数:{{模板名|1=子|2=道不同,不相为谋}},或者 {{模板名|2=道不同,不相为谋|1=子}}

这两者虽然说传参顺序颠倒了,参数「{{{1}}}」和「{{{2}}}」的值仍会分别解读为「子」和「道不同,不相为谋」,所以依旧会输出为:

子曰:「道不同,不相为谋。」


若参数内存在一个等号,这个办法会很有用。


举个例子,{{模板名|1=子|2=1+1=2}} 会生成:

子曰:「1+1=2。」


若这么做,将其他的以纯数字为名称的参数以匿名方式传入可能会出现问题:
警告:(页面名称)中调用的(末班名称)对“1”参数提供了多个值。将只使用最后提供的值。


命名参数[编辑 | 编辑源代码]

与编号参数类似,第三种赋值方法只是把编号换成了名称。我们更改一下模板内容:

{{{说话的人}}}曰:「{{{人说的话}}}。」

在这个模板中,识别参数使用了 {{{说话的人}}}{{{人说的话}}}。若要按照名称传递参数,需要标注好每个名字:{{模板名|说话的人=子|人说的话=我没说过}}

使用命名参数不仅可以使参数顺序灵活,还可以使模板和引用更可读、助于理解。

默认值[编辑 | 编辑源代码]

对于「命名参数」里的模板,若尝试这样使用:{{模板名}},则会直接输出:

{{{说话的人}}}曰:「{{{人说的话}}}。」

请注意三个大括号会直接输出出来。因为在使用模板时并未给参数赋值,则会直接输出变量本身。

这个时候可以通过 {{{参数名|默认值}}}来设置默认值。如果参数 {{{参数名}}} 并未被赋值,则输出「默认值」。

如果更改模板,设置默认值:

{{{说话的人|子}}}曰:「{{{人说的话|我没说过}}}。」

在如此调用之后会输出:

子曰:「我没说过。」


默认值可以为空字符串,如 {{{参数名|}}}。这样会在未给 {{{参数名}}} 赋值时返回一个空字符串。



参数的值可以为空字符串,若参数 {{{参数名}}} 被声明为 {{{参数名|这里没有填写参数哦}}},在使用 {{{模板名|参数名=}}} 时,模板会认为参数是一个空字符串,并且会直接输出空字符串,而不是「未定义(没有填写)」状态然后输出「这里没有填写参数哦」一句话。
如果要把空字符串也作为未填处理,请使用解析器函数(详见进阶教程)。



默认值可以给参数添加替代名称。如模板中使用了 {{{ 参数名 | {{{ 替代名 | {{{ 最终替代 | 你还真就啥也没填 }}} }}} }}},模板会先查找名为 {{{参数名}}} 的参数,若不存在则查找 {{{替代名}}},若还不存在则查找 {{{最终替代}}},若都不存在就输出「你还真就啥也没填」。


模板说明[编辑 | 编辑源代码]

套用模板或微件[编辑 | 编辑源代码]

进阶教程[编辑 | 编辑源代码]

变量[编辑 | 编辑源代码]

声明 / 赋值(#vardefine)[编辑 | 编辑源代码]

使用(#var)[编辑 | 编辑源代码]

检查是否存在(#varexists)[编辑 | 编辑源代码]

表达式[编辑 | 编辑源代码]

字符串处理[编辑 | 编辑源代码]

顺序结构[编辑 | 编辑源代码]

选择结构[编辑 | 编辑源代码]

如果…那么…否则…(if-else)[编辑 | 编辑源代码]

如果为空(#if)[编辑 | 编辑源代码]
如果相同(#ifeq)[编辑 | 编辑源代码]
如果出错(#iferror)[编辑 | 编辑源代码]
如果数值满足(#ifexpr)[编辑 | 编辑源代码]
如果页面存在(#ifexist)[编辑 | 编辑源代码]
如果是…则…不然…(switch)[编辑 | 编辑源代码]

循环结构[编辑 | 编辑源代码]

当…时重复执行…(#while)[编辑 | 编辑源代码]
重复执行…直到…(#dowhile)[编辑 | 编辑源代码]
从某处开始执行数次(#loop)[编辑 | 编辑源代码]

模板嵌套表格:魔术字[编辑 | 编辑源代码]

可能不常用的东西[编辑 | 编辑源代码]

替代[编辑 | 编辑源代码]

用法:{{ subst: 模板名称 | 参数 ...... }}

功能:把模板的内容静态加入到页面中,并断开与模板的连接,使得页面可以被单独修改。

具体的,我们假定存在一个模板「Template:问天地」,内容为 <includeonly>问天地好在。</includeonly><noinclude>{{问天地}}</noinclude>

在页面中使用「{{ subst: 问天地 }}」会把该文本完全替换成「问天地好在。」。

若页面内容为「吾有一言,曰「{{ subst: 问天地 }}」。呜呼!嫦娥,汝可有所目睹乎?」,在保存页面之后会被替换成「吾有一言,曰「问天地好在。」。呜呼!嫦娥,汝可有所目睹乎?

由于替代功能不适用于循环,且模板大量使用循环,结构较为复杂,可读性差,此功能并不适用于目前存在的一部分模板。

递归替代[编辑 | 编辑源代码]

用法:{{ safesubst: 模板名称 | 参数 ...... }}

功能:用于模板在包含有对其他模板或解析器函数的调用时,允许其递归替换。

由于递归替代功能不适用于循环,且模板大量使用循环,结构较为复杂,可读性差,此功能并不适用于目前存在的一部分模板。

显示模板源码[编辑 | 编辑源代码]

用法:{{ msgnw: 模板名称 }}

具体的,我们假定存在一个模板「Template:问天地」,内容为 <includeonly>问天地好在。</includeonly><noinclude>{{问天地}}</noinclude>

在页面中使用「{{ msgnw: 问天地 }}」会把该文本完全替换成「<includeonly>问天地好在。</includeonly><noinclude>{{问天地}}</noinclude>」。

注释[编辑 | 编辑源代码]

  1. 指使用 {{页面名称}} 语法将该页面的内容嵌入到另一个页面中,使得另一个页面能够包含此页面的内容。该过程类似于引用或嵌套,便于在不同页面间共享或重复使用内容。
  2. 是一种按照页面内容或用途进行分组和分类的方式。简单来讲,每个命名空间代表一类页面,如 "User" 命名空间用于用户,"File" 用于文件。
  3. 所以,一个万能的链入方法是 {{: + 页面全名(包含命名空间)+ }}

参考[编辑 | 编辑源代码]

  1. 说明:模板 - MediaWiki
  2. 说明:魔术字 - MediaWiki
  3. 扩展功能:变量 - MediaWiki
  4. 说明:扩展功能:解析器函数 - MediaWiki
  5. 扩展功能:循环 - MediaWiki