帮助:模板
搬运说明:本页内容源自维基百科,并根据心百科自身需要进行了适当修改。 |
本页简而言之:
|
模板(英语:Template)是Wiki系统中的一项功能,类似于计算机语言中的子程序。本文提供在MediaWiki创建模板的技术指南;心百科使用MediaWiki并对模板有一定的规范。另外也可参考:
- 模板扩展语法:Help:解析器函数
- 模板分类:分类:心百科模板和心百科:模板信息
- 模板命名空间(NameSpace)的帮助信息:心百科:命名空间
- 模板索引:所有模板
模板是什么,为什么要用模板
您在条目的上方看到各种各样的条条框框,比如“本条目需要清理”、“本条目应避免有陈列杂项、琐碎资料的部分。”等。有时候条目右侧也能看到一个灰色的框,里面写着有关这个条目的基本信息,比如某人的“生日”、“出生地”、“国籍”等。条目最下方有时候也会见到一个大方框,里面陈列着和这个条目相关的内容(称为“导航模板”,比如这个)。这些都是“模板”。模板的形式还有很多很多,有的是直接镶嵌在条目正文里面的,有的虽然看不到但是却依然影响到条目显示的内容(比如字词转换模板)。但是如果您翻翻这些条目的源代码,就会发现这些模板都长成类似“{{模板名字|模板参数}}”这样子,用一对双大括号将模板的内容扩起来。
为什么有这些麻烦的东西?有时候,一段内容会在多个条目中反复出现,如果一遍又一遍地复制这些内容,然后又一遍又一遍地粘贴到各个条目里面,效率太低;而且,一旦日后这些内容有所变动,就得找到上述条目全部修改,这会产生大量的重复劳动。模板就是为了这样的目的:只需要给重复的部分放到一个模板里、起个名字,以后需要用到这些内容的时候直接调用模板就行了。需要更改内容的时候,也只需要在模板里改动,那些调用了模板的条目也会随着模板自动变更,十分方便。
所有的模板都会放在一个叫“Template”的命名空间,即“模板命名空间”,标题名称是“Template:模板名字
”或者“模板:模板名字
”。在写作条目时,只需要在合适的位置放上“{{模板名字}}
”,模板就会在合适的地方显示出来了。有时候对于同一个模板,虽然显示的内容稍有差异,但大体的框架是一致的,这个时候就会用到“模板参数”,即“{{模板名字|模板参数}}
”的形式,具体的用法请见下文。
需要注意的一点是,心百科的系统——MediaWiki本身并不会自动为条目挂上模板。因此,当看到条目里面显示了“本条目需要补充更多来源”等文字时,是其他维基人人工将模板挂上去的。在模板所述问题修正之后,可以自行将模板从源代码中删除,这段提示文字将自动消失。
总之,当我们在编辑条目时发现有很多重复的工作,比如说插入一些提示信息、导航栏,或者是需要统一某些特定信息的格式等,而且这些工作通常都有一定的规律性,那么我们就可以使用模板来替代这些工作。
调用模板
调用模板就是把模板内容嵌入到相关页面中。在上述例子中,通过在花括号“{{}}
”内键入模板的名称,即可调用到对应的模板。
在Template命名空间里的页面才是模板,所以模板都由Template:开头,在中文维基,以模板:开头同样有效。调用时必须使用模板标签,即{{Template:模板名}}的形式,“Template:”可以在无歧义的情况下省略。则{{template:ref}}={{ref}}。
如果“Template:模板名”不存在,{{模板名}}
的作用就与[[Template:模板名]]
相同,提供一个连接到不存在页面的链接:模板:模板名。
模板可以被重定向。Template:请求来源被重定向到Template:Citation needed,所以{{请求来源}}效果等同于{{Citation needed}}。有时移动模板并建立重定向后,原调用重定向的页面可能会出错,只要过一段时间(几小时)等服务器刷新缓存即可。
模板的嵌套
模板之中可以嵌套模板,类似程序中嵌套子程序,但是需要注意的是不同层次之间的参数传递,请参考下一节设定参数。
模板的循环
即一个模板嵌套的模板是自己,新版本的mediawiki中,已经禁用了模板循环,出现自我调用的情况会自动红字报警。
设定参数
在模板名后可用管道符(即竖线)追加参数(这种做法称为传参)。参数有编号参数和命名参数两种。在模板的说明文档里一般会列出该模板的所有参数。模板之中读取模板参数是三个大括号,形如{{{1|}}}、{{{date}}},具体可以参考模板参数。
编号参数
在模板后的竖线后依次添加若干个参数,会自动作为第1、2、3、4……N个参数被传入模板,例如,{{catnav|页面分类|地理|大洲|亚洲|亚洲国家}}这种写法实际上是{{catnav|1=页面分类|2=地理|3=大洲|4=亚洲|5=亚洲国家}}的省略形式。注意,以省略形式赋值的第一个编号参数的参数名是1,而不是很多编程语言习惯的0。
调用 | 效果 |
---|---|
{{catnav|页面分类|地理|大洲|亚洲|亚洲国家}} | 页面分类 > 地理 > 大洲 > 亚洲 > 亚洲国家 > 模板
|
{{catnav|0=页面分类|1=地理|2=大洲|3=亚洲|4=亚洲国家}} | 地理 > 大洲 > 亚洲 > 亚洲国家 > 模板
|
{{catnav|1=页面分类|2=地理|3=大洲|4=亚洲|5=亚洲国家}} | 页面分类 > 地理 > 大洲 > 亚洲 > 亚洲国家 > 模板
|
{{catnav|5=亚洲国家|4=亚洲|3=大洲|2=地理|1=页面分类}} | 页面分类 > 地理 > 大洲 > 亚洲 > 亚洲国家 > 模板
|
{{catnav|1=页面分类|2=地理|大洲|4=亚洲|亚洲国家}} |
大洲 > 亚洲国家 > 亚洲 > 模板
|
要么省略所有编号参数的参数名,要么都不省略,否则极易出错。
命名参数
使用字符串作为参数名称的传参方法,如我们可以创建一个名为Template:姓名的模板,内容为:
我是{{{姓}}}{{{名}}}。
如果用{{姓名}}
调用这个模板,我们会得到:
- 我是{{{姓}}}{{{名}}}
如果用{{姓名|姓=张|名=飞}}
,我们则得到:
- 我是张飞
如何选择编号参数还是命名参数
编号参数的优点
- 调用模板时参数名和等号可以省略,从而节约打字时间和存储空间。参见#设定参数。
- 阿拉伯数字是世界性的,在翻译的时候省事,也可以被不懂中文的人理解。
命名参数的优点
- 参数的顺序可以变化,模板的参数可以任意添加和修改,而不会对调用模板的页面产生致命影响。
- 参数的意义容易理解。
- 当模板具有大量缺省参数时,命名参数使语法更为清晰
- 一些特殊的技巧利用这样一个特性:在一次模板调用中允许对同一个参数多次赋值,这导致最后一次赋值的内容生效;这种做法隐式保证了在本次模板调用中该参数至少被赋值一次
需要转义的参数
- 如果参数值中含有等号(
=
),传参时则必须使用参数名,即使是编号参数也要使用。 - 如果参数值中含有两个连续的右大括号(
}}
),调用参数时必须将其放入nowiki标记中,例如<nowiki>}}</nowiki>
。 - 如果参数值中含有竖线(
|
),调用参数时必须将其放入nowiki标记中,例如<nowiki>|</nowiki>
,或用{{!}}
代替。
- 参数值中可以包含一对双方括号(即两个左方括号,两个右方括号),用于链接一个条目,或是其他名字空间的页面,但不能先写右双方括号,然后再接左双方括号。例如Template:数数1中的内容是:
[[一二{{{1}}}六七]]
{{数数1}}
会造成模板调用失败,显示为:- {{数数1|三]]四[[五}}
而不是您所期望的
- 一二三]]四[[五六七
默认参数
参考模板的默认参数
用模板嵌入页面
模板标签不仅可以调用模板,也可以调用(嵌入)其他页面,就是像模板一样把被调页面的内容加入到调用方页面。
{{帮助:编辑手册nav}}
会将帮助:编辑手册nav中的内容加入到该页来。- 如果调用主命名空间的条目,为了避免和调用同名模板产生歧义,需要在条目名前加冒号。如
{{:站长指南}}
会将站长指南中的内容加入到该页来。
这样一来,所有页面都可以当作是模板。但是,使用在模板名字空间的页面(即真正的模板)有以下独特的好处:
- 所有被页面使用的模板都在页面编辑页显示出来。
- 当模板改变时,所有使用模板页面的服务器缓存(相对于浏览器缓存)自动被清空;而位于其他名字空间的页面,服务器缓存往往要手工清空。
查看引用到的模板
一个页面所调用的所有模板(template)和模块(module)都将在该页编辑页面的最下方被列出,并提供相应的链接,需要注意的是:
- 在段落编辑页面时并不会列出任何引用模板;
- 当年编辑旧版本的页面时,引用的模板列表仍是以当前最新版本为准的(表中的模板可能并未出现,旧版本引用的模板可能不在列表之中);
- 如果不真正提交编辑,仅仅在预览中使用的模板并不会被列出。
- 模板中嵌套的模板也会被列出
- 如果模板的名字没有直接完整的书写,那么他可能不会正确的出现在此列表之中,例如本页书写了{{columns|}}中的参数如果过于复杂,包括大段的文字内容和html标签,mediawiki可能不会识别出这个模板(但仍可以正确解析)
模板的其他问题
跨语言链接
模板可以含有跨语言链接,但结果是所有调用模板的条目页面都含有了该跨语言链接,这通常是非常糟糕的事情。为了仅仅让模板本身拥有跨语言链接,而不包括使用模板的条目,我们必须使用<noinclude>标识。例如:
<noinclude> [[en:Template:Europe]] [[zh:Template:欧洲]] </noinclude>
注意:在模板中使用<noinclude>
标识时要小心!不要在<noinclude>
之前或者</noinclude>
之后加空行,否则空行将被当作模板的一部分反映在调用模板的条目中。系统会自动忽略</noinclude>
之后的单个空行。
模板分类
模板也要进行分类,目的是为了更好的整理模板,以便更好的使用和管理模板。模板的分类同条目的分类相似,可以参阅有关条目分类的帮助文件,如Help:分类等,不同之处在于对于模板的分类需要使用<noinclude>
标识,如果不加<noinclude>
标识,则不仅模板被分类,所有使用该模板的条目也被分入同一类。
所有模板的根目录(即分类)是Category:心百科模板,所有模板分类名最后一定要含有“模板”二字,以区别于普通条目的分类。
noinclude与includeonly标识
注意:以下内容只限于模板中使用的情况,在其他名字空间使用的情况请参考相关帮助文挡。
<noinclude>和<includeonly>
前面已经提到,<noinclude>
标识的作用是将<noinclude>
和</noinclude>
之间的文本加入所在的模板页中,而不加入调用模板的条目或模板中,针对模板的说明、分类和跨语言链接都可以置于该标识之间。
例8:针对模板:网球男单世界第一的分类:体育模板就可以置于<noinclude>
和</noinclude>
之间,而对于调用该模板条目的分类:网球运动员可以置于标识之外:
[[Category:网球运动员]]<noinclude>[[Category:体育模板]]</noinclude>
另外,<noinclude>和<includeonly>的关系如下:
<noinclude>A</noinclude>B<noinclude>C</noinclude>
等价于
A<includeonly>B</includeonly>C
<includeonly>
<includeonly>
标识的作用跟<noinclude>
标识的作用正好相反,是将<includeonly>
和</includeonly>
之间的文本不加入所在的模板页中,而加入调用模板的页面中。
上面的例8中针对调用该模板的条目的分类Category:网球运动员实际上应该置于<includeonly>
和</includeonly>
之间:
<includeonly>[[Category:网球运动员]]</includeonly>
这样,在Category:网球运动员分类中就不会出现Template:网球男单世界第一模板了。
<onlyinclude>
<onlyinclude>
标识不常用,其作用是只有被<onlyinclude>
和</onlyinclude>
包含的文本才出现在调用模板的页面中,模板的其他内容不出现在调用模板的页面中。
变量名的生效
模板中变量在调用模板的地方被赋值。因此,如果一个模板中含有{{PAGENAME}}
,该模板被某页面调用,相应的位置显示的将是调用方的名称,而不是被调模板的名称。
其他
关于模板还可以参考的内容有: