2023年4月28日更新

新版的PageForms扩展默认生成信息框的方式跟下文的不太一样,所以如果需要修改模板内容的话,记得打开其中的請使用完整的 wikitext 而不是 #template_display选项。
利用PageForms创建模板.png

缘起

我喜欢维基百科的其中一个原因就是它的各类信息框,简约且信息量大,分类汇总,一目了然。
玩MediaWiki快两年了,始终还在入门阶段,大多数时候都是拿着维基百科的模板在那里改来改去,但因为很多历史遗留问题,一个简单的模板常常会大量调用其他模板或者是模块,要修改的话还要理解其调用的用意,否则很有可能会出现大量的错误和警告,正所谓“牵一发而动全身”。
比如我最近打算弄一个大学信息框的模板,然后我习惯性地先上维基百科上“借鉴”一下。
template-infobox-university.png
正如上图显示的,它所涉及到的模板和模块将近有一百个(中文版的稍好一点,显示为55个),但事实上呢,有很多的模板是跟语言有关或者跟排版有关,当然也跟模板文档有关,总之你原样复制这样一个模板就需要将另外几十个模板一起带过来,否则就会有很多错误和红链等着你。要么你就得将代码中的很多模板调用给删掉,前提是你知道你在做什么。
好吧,先让我们看看它的实际效果:
wikipedia-peking-university.png
右侧的信息框包括了北京大学的一些基本信息,看起来效果还不错,但就这么寥寥数条信息竟然背后需要如此庞大的模板支持(要不是为了写这篇文章我还真不会去数它的模板数量)。即便如此,这个按照英文版的模板修改而来的模板似乎仍有很多不足,比如没有可以表明是否为985和211的参数,如果看看百度百科的基本信息内容就能体会出来:
baidubaike-peking-university.png
是不是更符合我们国人的信息需求?那么我们如果需要创建一个类似百度百科这样的(不是指样式,而是内容)又该怎么办呢?

模板基本介绍

模板这东西就是解决重复劳动的,在创建条目的过程中我们总会遇到一些类似的工作,比方说特定的样式、特定的信息框或者是信息栏,又或者是某些特定消息的显示,凡此种种。本质上模板就是一种标准wiki页面(命名空间为Template),但它却可以随意地嵌入到其他页面中,达到我们所期望的目的。如上面的大学信息框,就是为了能够便捷地显示某些特定信息并固定在特定位置。
最重要的是,当你哪一天需要修改模板的内容时,所有调用模板的页面都会随之改变,而无需逐个地调整。
引用官方说明中的一段示例来简单说明一下模板是怎么回事。
假设你创建了一个名叫Template:Welcome的模板,其内容如下:

您好!欢迎来到维基!

这样,你就创建了你的第一个模板!如果你接下来插入{{Welcome}}到其他任一页面,那么,访问这个插入了模板的页面时,将会看到您好!欢迎来到维基!的字样,而不是看到{{Welcome}}

参数

为丰富嵌入包含机制,当一个模板被嵌入时,MediaWiki允许对这个模板传递参数。由于参数的作用,模板可以提供不同的内容,拥有不同的行为。

事实上,大部分的维基模板都要复杂的多,就是因为会涉及到参数问题。注意:在模板内,每一个变量都是被三组花括号包围:{{{ }}},而模板的使用是被两组花括号包围的{{ }}

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

相应的,在参数命名时,我们也可以通过编号或者是按名称的方式进行(隐式赋值按照一定顺序赋值,与参数命名无关)。所以我们打开维基百科的模板仔细观察,会发现{{{1}}}或者是{{{Name}}}两种不同方式的变量。
注意:如果没有特别指出,以下内容中字段即为参数名称或参数编号。

模板相关的插件

在创建模板开始前,让我们来看一下跟今天主题相关的几个插件。

可视化编辑器VisualEditor

应该说,MediaWiki发展至今,尤其是随着可视化编辑器的诞生,使得维基词条的编辑变得越来越简单,也越来越人性化,这一点在模板的使用上也可见一斑。
让我们还是以上述的大学信息框为例,看看代码编辑下它长什么样?

{{Infobox University
|Name = 北京大学
|EnglishName = Peking University{{NoteTag|name=EnName}}
|SealImage = [[file:Peking University seal.svg|200px]]
|SealInfo = 北京大学校徽
|image_name   = PekingUniversityPic6.jpg
|image_size   = 250px
|Motto = 无<!--北京大学并无校训,请先阅读本条目正文“校训”一节。-->
|Established = 1898年7月3日<br />({{QING-1889}}[[光绪]]二十四年五月十五日)
|Type = [[中央部属高校]],[[研究型大學]]
|Former_names = '''京师大学堂'''<br />'''国立北京大学'''
|chairman_label = 校务委员会主任
|chairman = [[邱水平]] 
|president  = [[郝平 (官员)|郝平]]
|secretary  = [[邱水平]]
|provost = [[龚旗煌]]
|Affiliations = [[中华人民共和国教育部]]
|Location = {{CHN}}[[北京市]][[海淀区]][[颐和园]]路5号<br />{{coord|39|59|23|N|116|18|19|E|region:CN-11_type:edu|display=inline,title}}
……
|Website = {{official URL}}
|logo = File:PKU logo.gif
}}

首先,调用模板Infobox University,然后根据各个参数(字段)填写相应的内容。那么问题就出现了,如果你第一次使用这个模板,如何才能清楚它到底有哪些参数(字段)呢?所以你不得不打开模板,然后通过浏览模板文档进行了解,最终选择你想要填写的内容(如果英语不好,又碰上没有翻译过的模板文档,一头雾水也是很正常的)。当然对于英语国家的人来说,这种操作要简单的多,毕竟大部分的参数(字段)都是按照英文单词来的,并且考虑到单复数和同义词的可能,模板在设计的时候就已经将这些都考虑进去了,比如在中文版的大学信息框中就有这样的参数设置:

|class17     = category
|data17      = {{{type|}}}{{{類型|}}}{{{类型|}}}{{{類|}}}{{{Type|}}}

它既将英语单词作为参数(全小写形式和首字母大写形式都考虑到了)还体贴地使用了简体中文和繁体中文作为参数。从某种程度上缓解了使用的难度。我不知道前辈们是怎么使用模板的,但至少对我来说,这是一件很麻烦的事情,毕竟不是每个模板都这么贴心,既有英文又有中文的。
那么采用可视化编辑器之后又会怎样呢?
visualeditor-edit-template.png
看上去直观很多,最起码你能知道这个模板有哪些字段可供选择,运用一点基础的英语知识应该是可以比较快得上手。当然两百多个字段(因为大量都是重复的)要筛选一遍的工作量还是不小的。
为了解决这个问题,让我们来看一下第二个插件。

模板数据TemplateData

TemplateData是一个用于存储wikitext模板及其参数信息的扩展,可以方便可视化编辑器在其模板编辑界面中获取显示,使得用户可以在页面上添加及删除模板。

mediawiki-templatedata.png
mediawiki-templatedata-show.png
mediawiki-templatedata-in-visualeditor.png
有了这个是不是就看来清楚多了,说明和示例都有,再也不用担心记字段名和用法了,而模板的简介你也可以在模板的说明中添加,至于维基百科中的文档模板也就可以变得可有可无了。
可是,光有这些使用模板的插件并没有解决任何如何创建模板的问题,所以我们还需要另外一个插件的配合。

页面表单PageForms

页面表单(Page Forms),在2016年以前曾称语义表单(Semantic Forms),是MediaWiki的一個扩展,可供用户利用表单的方式,来新增、编辑和查询数据。 在最初创建时,该扩展仅仅是Semantic MediaWiki扩展的分支之一,旨在能够利用SMW来编辑模板,并存储模板参数。这也正是为何它曾经称作“语义表单”的原因。不过,如今,该扩展也可以与另外的扩展:Cargo扩展配合使用,或在两者皆未安装的情况下工作。

我们可以先不管语义化这么高大上的东西,我们希望用到的只是它为我们提供的创建模板的功能而已(关于MediaWiki管理结构化数据的相关内容,可以参考《手册:在MediaWiki管理数据》,然后逐项了解其他内容)。
安装该插件之后,在特殊页面中,我们会发现多了一项内容。
mediawiki-specialpage-formspage.png
点击创建模板,进入新的页面。
mediawiki-formspage-create-template.png
模板名称中填入你希望的名字,支持中文名。
可选的分类这里要特别注意,此处的分类名称会出现在每一个嵌入模板的页面中,而不会出现在模板的分类中,后面示例会再次讲到。
接下去的字段其实就是模板的参数,名称的话可以考虑用命名或者是数字。如果勾选处理值列表的字段,选择分隔符号后,当你输入多个值,模板会自动将其分割并处理成不同的条目。注意:分隔符是用来识别输入的,跟输出格式无关。
最后,就是输出格式,可以是表格、信息框、纯文本或小节,插件会根据不同格式预设样式。
点击预览可以转到编辑页面,得到的模板代码如下(使用说明部分未复制):

<includeonly>{| style="width: 30em; font-size: 90%; border: 1px solid #aaaaaa; background-color: #f9f9f9; color: black; margin-bottom: 0.5em; margin-left: 1em; padding: 0.2em; float: right; clear: right; text-align:left;"
! style="text-align: center; background-color:#ccccff;" colspan="2" |<span style="font-size: larger;">{{PAGENAME}}</span>
|-
! 校名
| {{{Name|}}}
|-
! 校徽
| {{{Seal|}}}
|}

[[分类:信息框模板]]
</includeonly>

注意到没有,我们自定义的分类被放进了标签内,从下面的说明中我们可以了解,这个分类只会出现在目标页面——也就是调用模板的页面中。

  • noinclude:标签中的内容不会由于嵌入包含而出现在目标页面。但这些内容还会在源页面出现。
  • includeonly:标签中的内容会出现在目标页面,但不会出现在源页面。
  • onlyinclude:标签中的内容会由于嵌入包含而出现在目标页面,也会出现在源页面。

mediawiki-includeonly-test.png
分类名出现在了我的测试页面中,而模板页中却没有分类名。
该插件还有另一个功能就是,可以将你创建的模板生成一个表单页面,然后通过表单形式为模板赋值。比如:
mediawiki-pageforms-edit-form.png
至于你是喜欢用表单形式还是采用可视化编辑器赋值,全凭个人喜好了(如果从上传文件的方式来看,表单形式更加便捷,至于其他差异不算太大)。
注:上图中有个错误 ,Website应该是校徽的,估计复制黏贴的时候忘改了。

创建和修改模板

模板需求

其实,在讲完所有插件之后,大体上也就能够快速上手创建一个简单的模板了。不过为了把这个示例讲完整,还是来看一下我的模板需求:

  • 我的维基站只针对中文用户,而且也只针对大陆的简体中文用户,所以模板是不需要考虑语言转换的;
  • 模板参数名称尽可能简洁和清晰,并且能够方便填写。

创建模板

通过PageForms插件,我们输入需要的所有相关参数,点击保存(具体过程参见上面内容)。
进入到模板编辑页面后,点击管理模板数据,添加模板参数。注意;模板的参数如果有新增或者是修改,记得先保存模板然后再进行模板数据管理,此时就能够建议添加模板参数而无需自己手动添加了。

修改模板

插件自动生成的模板有几点是让人不太满意的:

  1. 信息框事实上是一个两列表格,左边列为信息标题,右边列为信息内容,但是像校徽之类的图片我希望它能够将表格合并后居中显示;
  2. 如果参数没有赋值,信息框中仍然会显示其标题,只是内容为空白,而我需要的是如果有赋值则显示标题和内容,未赋值内容则整行都不显示;
  3. 我希望模板有自己的分类,便于我查看,而插入模板的页面有另一个分类。

解决方法:
第一条其实就是维基表格的处理,我们将校徽的部分改成:

|-
| style="text-align: center;" colspan="2" |[[{{{SealImage|}}}|200px]]

是不是很眼熟,对的,就是html的样式。而{{{SealImage|}}}后面的200px是我给图标设定的尺寸,以保证所以图标都有一致的大小。
第二条,只需要增加一个解析器函数#if就可以,它会根据参数赋值进行显示控制,比如:

|-
! {{#if:{{{AbbrName|}}}|简称}}
| {{{AbbrName|}}}

当{{{AbbrName}}}参数被赋值后,就显示简称标题,否则标题和内容均不显示。
第三条,在创建模板时,自定义的分类填写页面所希望的分类名称,比如大学院校。而模板自身的分类则可以通过手动添加

<includeonly>
……
[[分类:大学院校]]
</includeonly>
<noinclude>
[[分类:信息框模板]]
<templatedata>
……
</templatedata>
</noinclude>

你只需将分类放入<noinclude>标签内即可。

实际效果

新建一个页面,试着插入模板,填入数据,保存。
mediawiki-template-review.png
怎么样,效果还是不错的吧,至少对于一个新手来说,还是蛮有成就感的(内容先暂时借百度的一用)。

写在最后

MediaWiki一直是有一搭没一搭地在用,总是会在不经意之间就发现很多新的插件和功能,然后就有种之前的折腾都有白费的感觉,因为对于用户来说确实是越来越便捷了。

以上内容如有理解错误,还望在评论区指正,多谢。

参考:
Help:Templates
Help:Transclusion
Help:TemplateData
Page_Forms/Quick_start_guide
Help:Extension:ParserFunctions

最后修改:2023 年 04 月 28 日
如果觉得我的文章对你有用,请随意赞赏