通过上一讲内容(《MeidaWiki教程之Cargo篇》),你可能已经创建了信息框模板来处理所有数据,并考虑了每种情况的理想页面布局。但是,如何让用户使用你所创建的这一切呢?那就需要用到这一讲的主角——“Page Forms(页面表单)”:它可以让你定义表单,并通过这些表单使用已设置好的结构来创建和编辑页面(如果你看过本站之前的另一篇文章《如何用插件创建我的第一个MediaWiki信息框模板》,那么你可能已经见识过Page Forms的效果了)。它会尽可能利用来自CargoSemantic MediaWiki的信息(例如字段类型),以便使创建表单尽可能变得容易。
从2007年到2016年,页面表单被称之为语义表单。它之所以得名,是因为它是Semantic MediaWiki的扩展(事实上,它是第一个)。但现在它也可以与Cargo扩展程序一起使用或单独使用。
说明:下文中的特殊页面以英文为主,中英文对照如下:

  • Special:CreateClass —— 特殊:创建类
  • Special:CreateCategory —— 特殊:创建分类
  • Special:CreateTemplate —— 特殊:创建模板
  • Special:CreateForm —— 特殊:创建表单

入门

本章的其余部分详细介绍了可与页面表单一起使用的语法和工作流程。但如果你才刚开始使用,最好的方法是使用页面表单的帮助页快速创建页面。基本上有五个不错的选择:

  1. 使用Special:CreateClass页面一次性创建所有内容——分类(Category)、模板(Template)和表单(Form)。
  2. 分别使用Special:CreateCategory、Special:CreateTemplate和Special:CreateForm创建整个数据结构。这需要一定的实操经验,不太适合入门,但是如果你已经有现成的模板和分类(以及可能的属性),而只想创建仍然缺少的部分,那么这也非常管用。
  3. 与上一个选项类似,你可以转到任何尚未创建的特定分类、模板或表单页面,然后单击“采用表单创建”选项卡,该选项卡显示与这四个特殊页面中的相关表单。
  4. 从现有的安装或程序包中复制。如果你在其他地方看到喜欢的数据结构设置,则可以将所有必需的文件复制并粘贴到自己的维基站上,而且很有可能会有这样的打包页面,它们出于通用目的(例如项目管理)而创建,当然只有少数公司提供此类软件包。
  5. 使用Page Schemas扩展。你可以用它为数据结构创建一组“架构(schemas)”,从中可以自动生成表单、模板等。

首先,让我们看一下Special:CreateClass。下图显示了该页面上展示的界面。
MediaWiki-Create_Class-Page.png
使用此接口,你可以定义一个完整的“类”——一种表示单个页面类型的数据结构,它由模板、表单、分类和属性组成。并非每种页面类型都可以用这种方式定义——例如,某些页面将包含多个标准模板——但是在许多情况下,这是一个很好的起点。底部的一组字段用于创建模板、表单和属性。
为什么要花精力创建分类呢?因为在页面表单中,分类是在页面及其表单之间进行定义的地方,所以“编辑表单”选项卡显示在每个页面的顶部。这是通过#default_form函数完成的,稍后我们将进行介绍。
另一种选择是使用特殊页面Special:CreateCategory,Special:CreateTemplate和Special:CreateForm,这些页面均由页面表单定义。这些具有粒度优势——你可以创建或重新生成任何特定页面——并且还具有Special:CreateClass不提供的其他字段的优势。
例如,在下图中,你可以在Special:CreateForm上看到帮助程序表单的一部分——它使你可以为每个表单字段设置所有允许的参数,并根据所选的输入类型来设置参数组。在下一节中,我们将介绍所有这些特定参数。
CreateForm interface.png

表单定义

Page Forms提供了用于定义表单的完整语法,该语法利用了包含三重花括号在中的特殊标签。定义表单的页面应始终位于“Form:”命名空间中(对于非英语Wiki,则对应另一种语言,中文wiki仍以Form:开头)。此类页面不被称为表单,而是被叫做“表单定义页面”,以将其与用户看到的实际对应表单区别开来。
在定义语法之前,下面是“项目”表单的示例,包括了定义页面的全部内容:

<noinclude>
这是“项目”表单。
要用这个表单创建一个页面,在下面输入页面名;
如果使用这个名称的页面已存在,你将直接编辑那个页面的表单。 
 
{{#forminput:form=项目|autocomplete on category=项目}}
</noinclude><includeonly>
<div id="wikiPreview" style="display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;"></div>
 
{{{for template|Project}}}
{| class="formtable"
! 客户
| {{{field|Client|input type=combobox|values from category=Clients}}}
|-
! 开始日期
| {{{field|Start date}}}
|-
! 结束日期
| {{{field|Start date}}}
|-
! 状态
| {{{field|Status}}}
|}
{{{end template}}}
{{{for template|Task|multiple|label=Tasks}}}
{| class="formtable"
! 任务名
| {{{field|Task name}}}
|-
! 截至日期
| {{{field|Deadline}}}
|-
! 状态
| {{{field|Status}}}
|}
{{{end template}}}
</includeonly>

现在,无需深入探讨语法的任何细节,你就可以注意到以下几点:

  • 表单定义页面具有双重目的:在标记内,它包含表单定义;而在标记内,它包含对该表单的简要说明,以及用于获取实际表单的输入。(这两个标记的作用与模板中的作用相同,详细内容可参见此处。)
  • 表单定义包含常规Wiki文本和特殊语法,后者在三个大括号内定义。
  • 表单可以在一个页面中指定多个模板——上述例子中有两个。
  • 表单字段在大多数情况下可以很简单,尽管它们也可以接受参数。(表单字段标签通常很简单,因为页面表单已经可以从其模板中获得许多有关每个字段性质的信息。)

稍后我们将对该定义的几乎所有元素进行完整的解释,除了

元素。它是一个可选元素,当用户单击“显示预览”按钮时,“页面表单”代码可以在屏幕上同时显示表单和预览页面。
你可以在下图中看到用户进入该表单页面时所呈现的。在标记内的内容将显示在页面的上部。
A_form_definition_page's_display.jpg
当选中表单定义页面上的输入框时,用户必须在其中输入页面名称。假设输入的文本“Mindseed”,然后点“创建或编辑”按钮。下图显示了由“项目”表单创建表单页面的实际效果(用户还点击了“添加另一个”按钮)。
A_Page_Forms-based_form.jpg
需要特别注意的是,该表格既可以用来创建新页面,也可以用来编辑现有页面。在这两种情况下,表单的外观都相同,只是现有页面是预先填充了字段值。
现在,让我们看一下表单定义语法。

表单标记语言

表单是使用一组标签来定义的,这些标签指定了模板以及这些模板中的字段。Wikitext和一些HTML可以自由地嵌入到标签之外的任何位置。Page Forms标记始终被三个大括号包围,并用管道分隔其“参数”,并且通常包含至少一个额外的参数来定义名称。例如,示例表单定义中的文本“{{{field|Start date}}}”是PF标签。它们与模板调用不同,前者有三个花括号而后者只使用两个。它们与模板定义中的参数也不同,模板定义使用三个大括号,但只能在“Template:”(中文系统为“模板:”)命名空间中使用,而PF标签只能在“Form:”(在中文系统中仍为“Form:”)命名空间中使用。
下面列出了表单定义中允许的标签以及每个标签的允许参数。参考上面的示例表单定义可能会有所帮助,以了解这些标记如何适合上下文。

“info”标签

“info”标签包含有关表单的特殊信息。该标签是可选的,但如果存在,则应放置在表单顶部。该标签的允许参数为:

  • partial form ——表明这是一个局部表单(参见“局部表单”)
  • create title=标题文本 ——如果使用表单创建新页面,则设置“FormEdit”页面的标题。默认情况下,页面名称将显示在标题右侧(但是,通过在标题值中放置“”,你可以将页面名称嵌入到标题中。)。
  • edit title=标题文本 ——如果使用表单来编辑现有页面,则设置“FormEdit”页面的标题。类似地,你也可以在标题值中嵌入“”。
  • query title=标题文本 ——设置“RunQuery”页面的标题。
  • page name=公式 ——设置用于自动设置要添加的页面名称的公式;请参阅后面的“一步流程”。
  • query form at top ——将表单置于“RunQuery”页面的顶部而不是底部。

“for template”标签

“for template”标签指定了模板名称,并声明以下所有字段(直到“end template”为止)都将是该模板的字段。紧随“for template”声明之后的文本是模板的名称。该标签的允许参数为:

  • label=标签文本 ——指定一个标签,该标签将被放置在方括号所包围的模板字段的整个集合中。如果模板有多个实例的话,则会特别有用。
  • Multiple ——指定用户可以更改表单中该模板的实例数量,从而允许多次(或零次)出现;请参阅后面的“多实例模板” 。
  • intro= ——设置置于此模板输入之前的文本。这对于具有“label”集的多实例模板特别有用,但可以用于任何模板。
  • display= ——为该模板的所有输入设置预设显示;输入标签周围的wikitext(如果有)将被忽略。此参数可以采用三个值:“table”(可用于任何模板),“spreadsheet”(仅可用于多实例模板)和“calendar”(仅可用于多实例模板,且模板至少包含一个日期字段)。在这三种情况下,除非为该输入指定“label=”值,否则字段名称将用作每个输入的“label”。更多有关“spreadsheet”的信息请参阅“Spreadsheet样式编辑”。
  • height= ——设置“spreadsheet”显示的高度;默认值为200px。
  • minimum instances=数字 ——对于多实例模板,设置允许的最小实例数。
  • maximum instances=数字 ——对于多实例模板,设置允许的最大实例数。
  • add button text=文本 ——对于多实例模板,在“添加另一个”的按钮中设置文本。
  • strict ——指定仅将表单中与模板使用的字段相对应的字段转换为表单元素。
  • embed in field=template name[field name] ——用于嵌入式模板。

“end template”标签

“end template”标签可结束模板的范围。该标签没有参数。

“field”标签

“field”标签指定要以表单形式放置的字段,对应于模板字段。紧随字段声明之后的名字是模板字段的名称。该标签有很多可能的参数,其中某些参数只能用于某些输入类型。
可以应用于任何字段的参数是:

  • input type=输入类型 ——指定在该字段在表单中的输入类型。如果字段对应于语义属性,则默认情况下,表单通常具有正确的输入类型;否则默认为文本。如果不能自动确定相应的语义属性(例如,如果它在模板中被间接调用),则可以使用参数“property”或者是“cargo table”和“cargo field”来手动指定它(请参见下文)。对于每种语义属性类型,允许的输入类型集是不同的。有关完整的选项列表,请参见此处。
  • hidden ——指定此字段将在表单中隐藏;用于保留已编辑页面中的值。
  • mandatory ——指定该字段必须由用户填写。注意:mandatory不能与hidden同时使用。在任何字段中使用这两种方法将导致在保存表单时对任何字段的强制检查失败。
  • restricted ——指定此字段仅可由admins/sysops编辑,而对所有其他用户禁用。此参数也可以采用“restricted=用户组名”的方式被调用,它将字段的编辑限制为指定的用户组。
  • default=默认值 ——指定此字段的默认值。对于与日期相关的字段,default=now会将值设置为当前日期以及可能的时间。对于文本字段,default=current user会将值设置为添加此页面的用户的名字。对于复选框输入类型,default=yes将默认选中该复选框(另一方面,“checkboxes”输入类型与“listbox”类型一样,需要指定实际值,例如default=Value A, Value C)。你还可以在“default=”值中包含模板、解析器函数和魔术字。
  • class=类名 ——指定该字段的输入应有的CSS类。
  • property=属性名 ——指定该字段对应于某个Semantic MediaWiki属性,因而获得适当的输入类型、自动完成等。
  • cargo table=表名、cargo field =字段名 ——共同用于指定此表单字段对应于某个“cargo”字段,因而获得相应的输入类型、自动完成等(此为两个参数,中间用分割符|分隔)。
  • list ——指定此字段包含值列表。
  • delimiter=分隔符 ——指定此字段(如果它表示值列表)应使用的分隔符或字符串;默认值为“,”。
  • label=label text ——如果在for templatetag标签中设置了"display="值,则该参数设置字段的标签名称(默认情况下,标签是该字段的名称)。
  • label msg=label message ——设置要插入的消息的名称(在“MediaWiki:”命名空间的页面中定义),而不是标签文本,以允许翻译。
  • feeds to map=template name[coordinates field name] ——可以应用于多个字段,以指定这些字段集共同定义一个地址,该地址应用于定位一组坐标。
  • holds template ——用于嵌入式模板;参见嵌入式模板。
  • translatable ——如果安装了翻译扩展,指定像""这样的翻译标签应被包裹在该输入值周围。
  • unique ——指定为此字段输入的值必须唯一,即不得与此模板字段相对应的SMW属性(如果使用SMW)或“cargo”字段(如果使用Cargo)的任何值相同。
  • unique for category=类别名称 ——指定为此字段输入的值不得与给定类别中任何页面的名称相同。
  • unique for namespace=命名空间 ——指定为此字段输入的值不得与给定命名空间中任何页面的名称相同。
  • unique for concept=concept名称 ——指定在此字段中输入的值不得与给定SMW的“concept”中任何页面的名称相同。

有关所有特定于输入类型的参数,以及有关配置表单字段的更多信息,请参见后面的“输入类型”部分。

“section”标签

“section”标签指定了表单中的文本区域,该区域与页面部分相对应。“section|”之后的名称是该部分的名称。该标签有两个参数:

  • level=级别 ——输入1到6之间的一个数字,指定节标题的级别。
  • hide if empty ——指定如果该节为空,则根本不应该将该节的标题添加到页面中。

下列用于“textarea”输入类型和自由文本输入的参数,同样可以用于“section”标签中。具体请参见“textarea”部分。

  • mandatory
  • restricted
  • hidden
  • class
  • placeholder
  • rows
  • cols
  • autogrow

“standard input”标签

“standard input”标签用于十种不同的输入,通常出现在每个表单的底部。“standard input|”之后的文本是每个输入的名称。这些输入中最值得注意的是“自由文本”,它是一个文本区域,可容纳页面中的所有非模板文本。其他九个是表单元素,例如“保存”和“预览”按钮。参见下面的完整列表。“自由文本”输入比其他标准输入具有更精细的处理。有关允许的参数,请参见“自由文本输入”。
对于其他标准输入类型,允许的参数为:

  • label=标签名称 ——在表单上指定与此输入关联的文本。
  • class=标签名称 ——指定此输入的CSS类。
  • style=标签名称 ——指定此输入的CSS样式。

此外,“watch”输入类型可以接受参数“checked”,该参数默认情况下会选中“监视本页”复选框。

输入类型

输入类型

text

默认输入类型,对应于HTML“text”输入。
特殊参数:

  • size=尺寸 ——指定输入的宽度,以字符为单位。
  • maxlength=最大长度 ——指定输入的最大允许长度。
  • placeholder=占位符文本 ——指定在用户点击之前在输入中显示的帮助文本。

textarea

对应于HTML <textarea>标签。
特殊参数:

  • rows=行数 ——指定行数。
  • cols=列数 ——指定列数。
  • maxlength=最大长度 ——指定输入的最大允许长度。
  • autogrow ——将文本区域设置为“自动增长”其高度以匹配其内容的高度,从而不需要滚动条。
  • editor=编辑器样式 ——将基于JavaScript的编辑器添加到文本区域,以使其内容的编辑更加友好。支持以下值:

    • wikieditor ——使用WikiEditor扩展(请参阅此处)。
    • TinyMce ——使用TinyMCE扩展(请参阅此处)。
    • visualeditor ——使用VisualEditor扩展(请参阅此处),为了正常使用可视化编辑器,还必须安装另一个扩展VEForAll。
  • max height=最大高度 ——如果使用VisualEditor,由于它使用autogrow,因此要指定文本区域的最大高度(以像素为单位)。默认情况下,此值为400。
  • placeholder=占位符文本 ——指定用户点击之前在输入中显示的帮助文本。

text with autocomplete、textarea with autocomplete

这两个输入的显示方式与text和textarea输入类型的显示方式相同,可以用相同的方式进行配置,但是它们还提供自动补全功能——一个或多个值。有关如何自定义自动补全功能,请参见下面的“Setting values and [](#Mappings)”和“自动补全”部分。

rating

此输入类型显示星级,通常用于评论。
特殊参数:

  • num stars=数值 ——星星数;默认值为5。
  • allow half stars ——允许用户选择半颗星,评分为3.5。

combobox

“combobox”输入类型提供了一个组合框界面:一种输入,其功能类似于常规的自动完成字段,但具有一个额外的向下箭头图标(例如下拉菜单),以使用户一次查看所有可用值。它是使用JavaScript库Select2实现的。
Combobox_input.png
特殊参数:

  • size=尺寸 ——指定输入的宽度,以字符为单位。
  • existing values only ——禁止在字段中使用任意值。
  • placeholder=占位符文本 ——指定用户点击之前在输入中显示的帮助文本。

tokens

此输入类型“tokenizes”字段中的值,即,在每个值周围放置一个块以使其成为单个单位,而不仅仅是字符串。然后,也可以重新排列这些“tokens”。与“combobox”类似,此输入是使用JavaScript库Select2实现的。
datepicker_input.png
特殊参数:

  • size=尺寸 ——指定输入的宽度,以字符为单位。
  • max values=最大值 ——指定允许的最大数量。
  • existing values only ——禁止在字段中使用任意值。
  • placeholder=占位符文本 ——指定在用户点击之前在输入中显示的帮助文本。

radiobutton

“radiobutton”输入对应于HTML的“radio”输入。它显示了一组值,用户只能从中选择一个。
默认情况下,第一个单选按钮值为“None”,这使用户可以选择一个空白值。为了防止显示“None”,你必须将字段设置为“mandatory”,并将字段之一的允许值设为“default=”值。

dropdown

“dropdown”输入对应于HTML的<select>标记。它显示值的下拉列表,用户只能从中选择一个。

checkboxes

“checkboxes”输入显示复选框,以便用户选择任意数量的值。

listbox

“listbox”输入对应于HTML的<select>标记,并添加了“multiple”属性。它显示了选项的垂直列表,用户可以在其中选择任意数量的值。
特殊参数:

  • size=尺寸 ——指定列表框的高度。

tree

“tree”输入类型允许分层的树状输入,其中所有值旁边都有单选按钮或复选框,具体取决于该字段可以容纳一项还是多项。值可以来自Wiki中的类别树(category tree),也可以在表单定义中手动设置。
该输入是如何知道它可以容纳一个或多个值,并因此而显示单选按钮与复选框的呢?它通过检查模板中的字段是否已定义为值列表(使用#arraymap)。不过,此检查并不完美。如果树状输入显示单选按钮而不是复选框,则只需在表单定义的字段标记中添加参数“|list”,即可确定这是一个列表。
根据值的来源,你需要指定以下两个附加参数之一:

  • top category= ——在“tree”的顶部设置类别的名称。
  • structure= ——设置整个树状结构;应该使用维基文本样式的项目符号(如*)来设置层级。

如果使用“structure”参数,则其外观应如下所示:

{{{field|Location|input type=tree
|structure=*宇宙
**银河系
***太阳系
**仙女座星系
……等等。
}}}

你还可以选择设置以下参数:

  • height= ——设置树状显示框的高度(以像素为单位)。
  • width= ——设置树状显示框的宽度(以像素为单位)。
  • delimiter= ——设置字段可以包含值列表时的分隔符。默认值为“,”。
  • hideroot ——隐藏顶级类别的名称。
  • depth= ——设置开头显示的三个级别的数量。默认值是10。

如果你使用“tree”输入类型显示类别树,请注意,此输入将仅打印所选类别的名称,而没有“Category:”命名空间。因此,如果你也希望将其显示在页面中,则必须添加模板。
如果该字段指定多个类别,并且模板使用#arraymap来执行此操作,则对#arraymap的调用应类似于:

{{#arraymap:{{{Categories|}}}|,|x|[[Category:x]] |<nowiki> </nowiki>}}

换句话说,你需要为#arraymap指定最终的“delimiter”参数,并使其成为空格,空白或类似内容,以避免在类别标签之间打印逗号。

checkbox

单个复选框,用于布尔值。

date

该输入包含年、月和日的三个单独的条目。

datetime

“datetime”输入类似于“date”输入,但包括小时、分钟、秒和AM/PM的其他条目。
特殊参数:

  • include timezone ——指定还应包括时区条目。

year

“year”是一个简单的文本输入,用于获取日期字段的年份值。

datepicker、datetimepicker

“datepicker”使用户可以在基于JavaScript的弹出式日历的帮助下选择日期。“datetimepicker”通过包括时间的弹出框来扩展datepicker输入。这两个输入都有许多可选参数,但是很可能你将不需要使用任何一个(如有需要可参考官方帮助文档中的介绍)。
datepicker_input.png

googlemaps、leaflet、openlayers

通过“googlemaps”,“leaflet”和“openlayers”输入类型,你可以分别使用Google Maps,Leaflet或OpenLayers服务来显示地图以获取坐标值。
你还可以选择为这些输入类型设置以下参数:

  • height= ——设置地图的高度(以像素为单位)。
  • width= ——设置地图的宽度(以像素为单位)。
  • starting bounds= ——引入一对坐标来设置所显示地图的边界;仅当输入没有值时,此参数才适用。(此参数的示例值:"-20,-15;50,55"。)
  • image= ——仅适用于“leaflet”输入类型;将图片(必须是已上传到Wiki的图片)设置为地图的背景,而不是世界的标准地图。

PF map input.png
图17.5页面表单“ googlemaps”表单输入

regexp

“regexp”并不是真正的输入类型,但是能够以额外的、基于正则表达式的验证来显示另一个输入(通常是“text”)。
特殊参数:

  • base type ——要使用的基本类型。可以是生成输入或选择类型(例如带值或不带值的文本、列表框、日期选择器)或其他正则表达式的html表单元素的任何输入类型。默认为文本。
  • base prefix ——基本类型参数的前缀(请参见示例)
  • regexp ——输入必须匹配的正则表达式才有效。此值必须包含斜杠!它默认为/.*/,即任何值。

数据类型的允许输入类型

每个定义的Semantic MediaWiki或Cargo数据类型都具有默认输入类型,并且在适用时还具有默认输入大小。此外,如果字段为包含分隔符的值列表,而不是单个值,则某些数据类型会进行特殊处理。
以下是每种数据类型的默认值和其他允许的输入类型(单个值):

数据类型默认输入类型其他允许的输入类型
Pagecomboboxtext, text with autocomplete, textarea, textarea with autocomplete, tree
Stringtexttext with autocomplete, combobox, textarea, textarea with autocomplete
Texttextareatext
URLtexttextarea
Integer, Floattexttextarea
Date, Start date, End datedateyear (simply a text input)
Datetime, Start datetime, End datetimedatetime
Enumerationdropdownradiobutton
Booleancheckboxdropdown, radiobutton
Coordinatesopenlayersgooglemaps, leaflet

这是某些数据类型的分隔列表的默认输入类型和其他允许的输入类型:

数据类型默认输入类型其他允许的输入类型
Pagetokenstext, textarea, text with autocomplete, textarea with autocomplete, tree, checkboxes
Stringtexttokens, text with autocomplete, textarea, textarea with autocomplete
Enumerationcheckboxeslistbox
HierarchyN/Atree

设置值和映射

对于具有预定值集的输入,无论是硬编码(如“dropdown”输入)还是建议值(如“combobox”),都必须在某处定义其值。如果你使用的是SMW或Cargo,则可能已经在表格外定义了这些值。但是,你始终可以在表单中覆盖它们——或为一个没有为其定义值的字段设置它们。可以在“field”标签中使用以下参数:

  • values=可能的值 ——指定此字段可以有的一组可能值或自动补全值(取决于输入类型),覆盖从Semantic MediaWiki或Cargo设置的任何值。默认情况下,这组值用英文逗号分隔,但是可以使用delimiter=参数修改分隔符。
  • values from category=类别名称的值 ——与values=类似,但是从属于特定类别的所有页面的名称中获取其值。
  • values from namespace=命名空间的名称 ——与values=相似,但是从属于特定命名空间的所有页面的名称中获取其值(要从主命名空间获取值,请使用“Main”作为命名空间名称,或将其保留为空白)。

基于自动补全的输入还有更多选项。请参阅下一节“自动补全”。
如果希望向用户显示的值集与页面的Wikitext中实际显示的值集不同,则还可以设置“mappings”。以下参数启用此类映射:

  • mapping template=模板名称 ——接受“mapping template”的名称(该模板接受单个未命名参数,即{{{1|}}},并显示“mapped”字符串),并使用该模板来映射每个潜在值,以便在屏幕上显示值的“aliases”,而不是值本身。
  • mapping property=属性名 ——用于选择具有“combobox”,“tokens”,“listbox”和“dropdown”输入类型的页面的字段。对于每个可能的值,显示该页面上的SMW属性而不是页面标题,但是将所选页面的标题保存为字段值。与“values...”参数一起使用以获取可能值的列表。
  • mapping cargo table=表名/mapping cargo field=字段名 ——与property=相似,不同之处在于它用于cargo字段。

自动补全

四种输入类型(tokens、combobox、具有自动完成功能的text和具有自动完成功能的textarea)使用自动完成功能——当用户开始键入内容时,输入将显示可能完成的下拉列表。
如果某个类型为“Page”的字段表示的是Semantic MediaWiki属性或Cargo字段,则默认情况下将启用自动补全功能——该字段将在该属性或字段已指向的所有页面的名称上自动完成。对于任何其他类型,没有默认的自动完成功能,但是只需将输入类型设置为具有自动完成功能的四种类型之一,就可以实现相同的效果。
你可以通过使用“values...”参数之一来手动设置一个字段,以对各种值之一进行自动完成——请参见上一小节“设置值和映射”。
你还可以自动补全基于维基站外(包含在网页,数据库,文件等)的值;有关执行此操作的各种方法,请参见下面的“自动补全外部值”。如果指定一个字段包含多个值,默认情况下,自动补全将支持多个值:输入一个值并放置一个分隔符后,下一个值将开始新的自动补全。你可以通过在字段的定义中添加“list”参数来手动指定字段应具有多值自动完成功能。你也可以使用“delimiter=”参数为该值列表指定分隔符(默认为英文逗号)。
默认情况下,一个字段提供的自动补全功能的最大数量为1,000;这是出于性能原因。要更改此数字,请更改LocalSettings.php$wgPageFormsMaxAutocompleteValues的值。

禁用

你可以通过将输入类型设置为简单的“text”或“textarea”来禁用自动补全(如果默认情况下已为字段启用)。

匹配每个字符

默认情况下,页面表单自动补全功能会匹配一组可能值中每个单词的开头。但是,你可以通过将以下行添加到LocalSettings.php来更改自动补全功能以匹配每个字符。

$wgPageFormsAutocompleteOnAllChars = true;

对于具有非ASCII字符值的Wiki(例如具有非罗马字母的语言的Wiki),此功能尤其重要。由于默认情况下,基于单词的自动完成功能尚不适用于非ASCII字符。

自动补全外部值

目前,用维基站的外部值自动补全是一个相当繁琐的过程,因为你必须对外部数据进行处理才能使其完全正确地格式化。理想情况下,将来会有所变化,以便可以在表单中使用任意值列表。在此之前,要使字段自动完成外部值,你必须执行以下步骤:

  1. 创建一个页面/Web服务,该服务通过查询字符串接收一个子字符串,并显示一组自动完成值;值应为JSON格式,并且看起来像MediaWiki API返回的JSON(请参阅此处)。这也使得用来自另一个Wiki的值进行自动补全变得容易。
  2. 确定一个简短的字符串来表示此URL。
  3. 将一行添加到LocalSettings.php中,如下所示:

    $wgPageFormsAutocompletionURLs['URL-identifier-string'] = 'URL';

    • 此行中的URL应该看起来像是对该Web服务的调用,但是子字符串已替换为字符串“”。
  4. 将参数“values from url=*URL-identifier-string*”添加到表单定义中的相关字段。

上传文件

如果表单中的字段用于保存上传文件的名称(例如图像),则可以允许用户直接通过表单上传该文件。只需在表单定义中将该参数“uploadable”添加到该字段的声明中即可。然后将会在表单中此字段旁边添加一个“上传文件”的按钮。如果用户单击此链接,它将弹出一个“lightbox”样式的窗口,允许用户上传文件。用户一旦上传完毕,窗口将关闭,并且该字段将包含上载文件的名称。
如果该字段配置为含有值列表,则新文件名将附加到以前的文件名之后;否则,文件名将覆盖之前包含的任何字段。
仅可应用于保存上传文件列表的字段的参数为:

  • uploadable ——指定这是一个可上传字段。
  • image preview ——指定应在表单中的字段下放置上载图像的缩略图。
  • default filename=文件名 ——指定使用此字段上传的文件的默认文件名。

“show on select”

对于“checkbox”、“checkboxes”、“radiobutton”、“dropdown”和“listbox”的输入类型,如果在该输入中选择了某个值(或多个值),那么可以使用show on select=参数来指定仅应向用户显示页面上的一个或多个元素。该参数的语法为:

  • show on select=value 1=>element ID 1;value 2=>element ID 2;etc.

对于“checkbox”类型的输入,应仅使用“show on select=element ID”。

注:此处的element ID主要是HTML的元素ID,可以通过这种方式来切换显示或隐藏。

同一字段的多个值

页面表单支持在给定的字段中具有多个值,并且某些表单输入类型(例如“dropdown”和“listbox”)特别适用于包含多个值的字段。文本和文本区域字段还可以支持自动补全多个值。如果表单字段用于保存多个值,则相应的模板字段最有可能包含对#arraymap#arraymaptemplate的调用(请参见此处)。但是,无论模板中包含什么内容,字段的含义都可以通过在{{{field}}}标签中添加参数“ list”来硬编码到表单定义中。如果值之间的分隔符不是默认值(英文逗号),则参数“delimiter=”也可能会有所帮助。

多实例模板

如果将“multiple”参数添加到模板,则它将在表单中(因此在生成的页面中)允许该模板的多个(或没有)实例。这里有一个很好的多实例模板的表单示例。有一个标记为“添加另一个”的按钮;单击它会创建该模板及其字段的新实例。可以通过单击“删除”按钮来删除实例,也可以通过单击左侧的“罗纹”图标并在集合中向上或向下拖动实例来重新排列实例。
你可以使用“add button text=”参数将“添加另一个”按钮重命名为其他任何文本。例如,要将按钮更改为读取名为“职业”的模板的“添加另一个职业”,你可能需要:

{{{for template|职业|multiple|add button text=添加另一个职业}}}

嵌入式模板

你可以选择将多实例模板的所有实例存储为其他模板的参数值,这样对该模板的调用将不会像这样:

{{Skill|Name=Cooking|Level=5}}
{{Skill|Name=Guitar|Level=2}}
{{Skill|Name=Karate|Level=4}}

而是像这样:

{{Person ... |Skills={{Skill|Name=Cooking|Level=5}} {{Skill|Name=Guitar|Level=2}}                    
{{Skill|Name=Karate|Level=4}} ... }}

为了完成此示例,你只需要:

  • 在表单定义的“Person”模板部分内添加一个标签,例如“{{{field|Skills|holds template}}}
  • 在页面Template:Person内的某处添加“{{{Skills|}}}}”,使其在页面中显示
  • 将“|embed in field=Person[Skills]”添加到表单定义的“{{{for template|Skill|multiple”部分

这种方法有几个优点:

  • 无论是表单还是生成的页面,你都可以更好地控制多实例模板的位置,因此你可以将其放置在“主”模板的任何两个字段之间。
  • 你可以轻松地在多实例模板之前和之后放置特殊文本,例如表格的页眉和页脚,而无需特殊的页眉和/或页脚模板。
  • 模板调用之间不会放置空格,这可能有助于格式化。

请注意,你不能在其他(常规或嵌入式)多实例模板中嵌入多实例模板。

定义表格的底部

可以使用“standard input”标签自定义表格底部的用户输入。可以修改每个输入的布局,包含和文本。每个用户输入都被定义为具有自己值的“standard input”标签;允许的值为:

  • save(用于“保存页面”按钮)
  • preview(用于“显示预览”按钮)
  • save and continue(用于“保存并继续”按钮——这可以使用户无需离开表单即可保存页面)
  • changes(用于“显示更改”按钮)
  • summary(用于“摘要”文本字段)
  • minor edit(用于“这是次要编辑”复选框)
  • watch(用于“监视本页”复选框)
  • cancel(用于“取消”链接)
  • run query(用于查询表单中的“运行查询”按钮)

例如,可以使用“{{{standard input|save|label=保存本页}}}}”来修改原来的“保存页面”按钮,并将其放在定义的位置,文本显示为“保存本页”。如果表单定义中未包含任何标准输入标签,则基本的七个输入(除“保存并继续”和“运行”之外的所有输入)将显示在表单底部,就像常规的“编辑”页面一样。但是,如果哪怕包括一个这样的标签,那么将仅按顺序显示这些已包含的输入,并以Wiki文本的形式显示在表单定义中。

启用多个字段值

Page Forms定义了两个解析器函数#arraymap#arraymaptemplate,它们可以通过将相同的语义属性应用于以英文逗号(或以其他方式)分隔的列表(逗号分隔列表是一段文本,其中不同的值用逗号分隔)中的每个元素,从而在同一字段中保存多个值。这些函数没有特定形式甚至特定语义的。但是在创建页面表单之前似乎并不需要它们,这就是为什么将它们存储在那里的原因。其中,#arraymap更为重要:它的使用频率更高,并且当指定一个字段来保存值列表时,它是Special:CreateClass和Special:CreateTemplate在模板中自动应用的一种。如果所需的映射对于#arraymap太复杂,则#arraymaptemplate很有用。

#arraymap

此函数的通用调用是:

{{#arraymap:value |delimiter |var |formula |new delimiter}}

该函数用“分隔符(delimiter)”来分隔“值(value)”,然后对每个变量将“公式(formula)”所做的相同映射应用于“var”,最后使用“新分隔符(new delimiter)”再次结合所有值。例如,如果你有一个填充“作者”字段的表单,并且希望该字段能够容纳多个值,并以逗号分隔;并且你还希望每个值都以粗体显示,则可以在模板代码中添加以下内容:

{{#arraymap:{{{作者|}}}|,|x|'''x'''}}

本质上,此函数将格式“映射”到字段中每个逗号分隔的值。(如果未设置,“delimiter”参数默认为“,”,“new delimiter”默认为“,”(请注意多余的空格)。)因此,用户可以在同一行上输入所有值,带或不带逗号之间的空格。(顺便说一句,请注意,“x”在此处用作内部变量:如果属性名称本身包含字母“x”,则将导致问题,因此应使用某些字符替换字母“x”或没有出现在属性名称中的字符串,例如“@@@@”。)
“新分隔符”参数设置在结果输出中的值之间放置的文本。它是可选的,通常未设置,因为通常需要使用其默认值(逗号加空格)。但是,此参数在某些情况下很有用。如果没有实际显示任何结果值,则特别有用,因为在这种情况下,你不希望输出为逗号字符串。一个常见的例子是,原始值是否包含类别名称列表,并且每个名称都变成了类别标签,但实际上并未显示。为了避免在这种情况下显示逗号,你应该使用类似于空格的HTML编码“&#32;”将“新分隔符”值设置为等于空格。(最后只使用“ |”是无效的,

{{#arraymap:{{{categories|}}}|,|x|[[Category:x]]|&#32;}}

如果使用“CreateTemplate”或“CreateClass”页面创建模板,并指定一个字段可以接受多个值,则#arraymap调用将自动添加到生成的模板中。

#arraymaptemplate

有些映射非常复杂,无法将其放置在#arraymap函数中。为此,你可以改用类似的#arraymaptemplate函数。要使用此功能,请创建一个包含单个字段的模板,并将你想要的映射应用于该字段。然后像使用#arraymap一样,将#arraymaptemplate应用于主模板字段,使用以下格式:

{{#arraymaptemplate:value |template |delimiter |new delimiter}}

...其中“模板”是相关映射模板的名称。

\n分隔符

对于#arraymap#arraymaptemplate,分隔符或新分隔符值中的字符串“\n”都将转换为换行符。如果希望实际的换行符出现在值之间,则应使用两个换行符(即“\n\n”)作为分隔符,因为MediaWiki需要两个换行符才能显示换行符。

“采用表单编辑(edit with form)”标签

如果不允许用户编辑可进行表单编辑的页面,则该选项卡将显示为“查看表单”,单击选项卡将显示已禁用的表单。

显示“采用表单编辑”

可以通过三种方法在特定页面上显示“采用表单编辑”标签:

根据类别

第一种也是推荐的方法是使用类别。要使页面以这种方式具有选项卡,必须执行以下两个步骤:

  • 首先将该页面定义为属于特定类别。匹配具有类别的页面的最佳方法是在定义此页面类型的主模板内放置“Category”标签。这样,使用此模板的每个页面都将成为此类别的一部分。
  • 完成此操作后,在该分类的页面中放置一个函数调用,例如{{#default_form:form_name}}。(如果你使用“创建类(CreateCategory)”页面创建分类,则可以自动执行此操作。)

基于命名空间

第二种可能的方法是将页面的命名空间与表单匹配。你可以通过在定义该命名空间的页面中放置#default_form函数来实现。例如,如果你的Wiki被称为“MyWiki”,而你要与表单关联的命名空间是“User”,则需要在其中添加#default_form的页面可能会被称为“MyWiki:User”(你可能需要创建此页面)。如果你要使用默认表单的命名空间是主要命名空间(即没有名称的命名空间),则需要创建#default_form并将其添加到名为“MyWiki:Main”的页面,或在其中调用任何主要命名空间此Wiki的语言。
添加此功能后,该命名空间中的每个页面都将具有与之关联的格式,除非它已经属于具有关联格式的类别(类别优先于命名空间)。

在页面内

你还可以在任何常规页面上添加对#default_form的调用,以仅为该页面设置表单。当无法使用类别和命名空间选项时(例如,页面属于具有不同默认格式的多个类别时),此功能特别有用。

配置编辑选项卡

对于具有“采用表单编辑”标签的页面,你可能希望将常规的“编辑”标签重命名甚至完全删除。你可以在“LocalSettings.php”中设置一些标志,以更改编辑选项卡的外观:

  • $wgPageFormsRenameEditTabs——如果设置为true,则将“采用表单编辑”选项卡重命名为“编辑”,将“编辑”选项卡重命名为“编辑源代码”(使用查看Wiki的任何语言)
  • $wgPageFormsRenameMainEditTab——如果设置为true,则仅将“编辑”选项卡重命名为“编辑源代码”(使用查看维基的任何语言)
  • $wgGroupPermissions...——可以针对不同类型的浏览器进行设置,以切换每种类型的浏览器是否会看到常规的编辑选项卡。一种常见的修改是将其正常设置为false(即,对于浏览器类型为“*”),对于“sysop”查看器为true:

    • $wgGroupPermissions'*'=false;
    • $wgGroupPermissions'sysop'=true;

如果将这些设置添加到LocalSettings.php,则应在包含页面表单之后将它们放置在文件中。

链接到表单

你如何让用户首先使用表单来创建页面?标准方法是通过#forminput解析器函数调用,该函数显示单个输入,供用户输入页面名称。如果输入这样的名称并单击按钮,则将它们发送到表单以创建该页面(除非已经存在具有该名称的页面,在这种情况下,将它们发送到表单以编辑现有页面)。这就是所谓的“两步流程(two-step process)”。要求用户首先输入页面名称的第一步是为了确保用户不会意外覆盖现有页面。此过程非常标准,它通过Page Forms的Special:CreateFormSpecial:CreateClass辅助页面内置于默认完成的表单中(任何由Page Forms创建的表单定义页面都会在顶部调用#forminput),以便转到那个表单页面的用户可以自动开始使用表单。
但是,也可以跳过第一步,即输入页面名称——如果表单包含用于基于用户输入来设置页面名称的公式,则应该这样做。那是“一步流程(one-step process)”,它使用解析器函数#formlink而不是#forminput
使用Special:RunQuery的查询表单具有自己的链接方法,使用解析器函数#queryformlink——我们将在这里进行介绍。

两步流程

使用#forminput解析器函数完成两步过程,即让用户进入表单的标准方法。

使用#forminput

这是#forminput解析器函数的语法:

{{#forminput:form= |size= |default value= |button text= |query string= |query string parameters |autocomplete on category= |autocomplete on namespace= |remote autocompletion |placeholder= |popup}}

所有参数都是可选的。参数说明:

  • form= ——要使用的PF表单的名称。如果传入以英文逗号分隔的表单列表,则会出现一个下拉列表,让用户在这些表单中进行选择。如果将此参数保留为空,则会出现一个下拉菜单,使用户可以在所有现有表单中进行选择。
  • size= ——文本输入的大小(默认为25)。
  • default value= ——输入的起始值(默认为空白)。
  • button text= ——将显示在“提交”按钮上的文本(默认为“创建或编辑页面”)。
  • query string= ——你可以使用此选项将信息传递给表单;此信息通常采用templateName[fieldName]=value的形式。它看起来像一个典型的URL查询字符串。例如“query string=namespace=User&User[Is_employee]=yes”。另外,任何查询字符串值都可以直接作为参数传递,因此,上述值可以改成用“|namespace=User|User[Is_employee]=yes”来传递。
  • autocomplete on category= ——使用特定分类中所有页面的名称将自动完成功能添加到输入中。
  • autocomplete on namespace= ——使用特定命名空间中所有页面的名称将自动完成功能添加到输入中(只能使用这两个名称之一)。
  • remote autocompletion ——指定应从服务器动态检索自动完成值,而不是直接从页面HTML中隐藏的值列表中检索(因此允许更多值)。
  • placeholder= ——在用户输入任何内容之前,在表单输入中出现的“占位符”文本。
  • namespace selector= ——指定在页面名称的输入之前应放置一个下拉列表,以便用户从该页面的一组可能的命名空间中进行选择;此参数的值包含该命名空间名称集,以英文逗号分隔。(对于主命名空间,只需输入一个空白值,例如“,User,Project”。)
  • popup ——在弹出窗口中打开表单。
  • reload ——如果指定了“popup”或“returnto”,则一旦提交表单,将使用户返回的页面重新加载。
  • no autofocus ——表单输入获得自动聚焦,即在页面加载时将光标置于输入中;默认情况下,此参数指定不执行此操作。
  • returnto= ——提交表单后用户将被发送到的页面的名称,而不是简单地转到保存的页面。

添加特定命名空间的页面

你可以使用页面输入表单在默认情况下在特定命名空间(如“User:”)中创建页面,而不必强迫用户每次键入该命名空间。为此,请在query string=参数中添加“namespace=命名空间名称” 。

添加子页面

在MediaWiki中,你可以通过在页面名称中包含斜杠来创建子页面(请参见此处)。要使自动添加的页面成为子页面,可以在查询字符串中为“super_page=”添加一个值。要使其成为当前页面的子页面,可以将此值设置为“super_page={{FULLPAGENAME}}”。这会将“current-page-name/”放在用户键入的页面名称的开头。

一步流程

通过在表单定义的“info”标记中添加“page name”参数,可以自动设置由表单创建的页面的名称。有两种类型的“变量(variables)”可以包含在此参数的值中:

  • <TemplateName[FieldName]> ——被指定模板 TemplateName中指定字段FieldName的值替换 。
  • ——默认情况下,将替换为生成的页面标题唯一的最低编号。通常,此值以空白开头,然后依次为2、3,依此类推。但是,可以通过添加“start=”参数来手动设置该值的起始编号。此数字必须为0或更高。例如,要使数字从1开始并向上移动,应将标签设置为<unique number;start=1>。你还可以通过添加“random”参数来将其设置为六位随机数字,以使标记看起来像“<unique number;random>”。请注意,无论哪种情况,参数都以英文分号分隔。

请注意,由于页面表单中的错误,“page name=”值不能以“”开头;在此之前必须有一些文字。并且它不能包含字符“#”,因为MediaWiki不允许在页面标题中使用井号(#)。
例如,设想一种用于存储引用的表单。其 {{{info}}} 标记可以具有参数“page name=<Quote[Author name]> quote <unique number;start=1>”。这将在每个引用页面的名称中包括作者的名字,以及一个数字,以保证每个添加的引语条目页面的唯一性。然后,用户可以转到URL“http://mywiki.com/wiki/Special:FormEdit/Quote”并填写表格;如果他们将作者设置为“Ernest Hemingway”,而Wiki中没有其他引号要求他为作者,则单击“保存页面”按钮将导致一个名为“Ernest Hemingway quote 1”的新页面。
start”值可以有前导零;例如,值“001”将导致页面的值分别为“001”和“002”,依此类推。
MediaWiki解析器将解析“page name=”值,因此你还可以将解析器函数,预定义变量等添加到该值中。
注意,必须将用户发送到页面“Special:FormEdit/表单名称”,此自动页面设置才能起作用;如果它们以某种方式终止于#forminput调用并提示输入页面名称,则该名称将覆盖自动页面名称。

使用#formlink

如果需要,可以使用“#formlink”解析器函数生成指向“一步流程”表单的链接,而不是直接创建URL。该函数称为:

{{#formlink:form= |link text= |link type= |query string= |query string parameters |target= |tooltip= |popup |reload |new window |returnto=}}

“form=”、“query string”、“popup”、“reload”和“returnto =”参数的工作方式与它们在#forminput中的等效工作方式大致相同,而“link text=”的工作方式类似于#forminput的“button text=” 。“link type =”参数设置链接的显示:如果将其设置为“button”,则链接将显示为按钮;否则,链接将显示为按钮。如果将其设置为“发布按钮”,它将是一个使用“发布”而不是通过URL发送查询字符串值的按钮-当必须预加载大量数据时,这很有用。查询字符串中的特殊字符(例如换行符)更强大;如果将其设置为空白或其他任何内容,它将显示为常规链接。通常不应使用“target=”参数,但是如果你要链接到特定页面的编辑,它将设置要编辑的目标页面。如果用户将链接悬停,则“tooltip=”参数显示一个“tooltip”。根据浏览器的不同,“新窗口”参数会在新窗口或新标签页中打开表单。
调用#formlink的示例为:

{{#formlink:form=Quote
|link text=Add a quote for this author
|link type=button
|query string=Quote[Author]={{PAGENAME}}
}}

这将通过按钮从页面链接到添加引号的表单,其中“作者”字段将填写当前页面名称。如果有多个值,则应使用“&”分隔。
你可能希望表单的链接是图像,而不是文本或按钮。为此,你可以这样称呼:

{{#formlink:form=Quote
|link text= [[File:edit.png|link=]]
}}

将红色链接指向表单

在MediaWiki中,指向不存在的页面的链接称为“红链(red links)”,因为它们通常被涂成红色。默认情况下,这些链接会转到用于使用标准编辑界面将文章添加到Wiki的页面。但是,如果语义属性指向该不存在的页面,则红色链接可以将用户带到正确的PF表单以添加该页面。
如果指向的页面不存在,则要使特定链接(单独或在模板内)指向表单,请使用#formredlink解析器功能。对#formredlink的典型调用将放在模板内,如下所示:

{{#formredlink:
target={{{PageNameParameter|}}}
|form=FormName}}

#formredlink的整体语法为:

{{#formredlink:form=|link text=|existing page link text=|link type=|query string=|target=|tooltip=|popup|new window|create page}}

这些参数与#formlink的参数非常相似(请参见上文)。它有两个附加参数:

  • existing page link text= ——设置当指向目标页面已经存在时链接的文本(“link text=”参数仅在目标不存在时才生效)。
  • create page ——导致红色链接的页面由系统自动创建。

有时候,你不确定链接页面将使用哪种形式。它可能是许多选择之一。你可以对其进行设置,以使用户单击红色链接时可以通过向#formredlink调用中添加一个或多个“alt_form”参数(每个参数都有自己的编号)来获得其他可能性。

预加载数据

你可能希望表单在用户进入时已经包含一些数据。(请注意,这仅适用于添加新数据或查询表单;对于编辑现有页面,除该页面的当前内容外,无法将表单的内容设置为其他任何内容。)做这个:

  • 为你希望在表单中具有值的任何字段指定一个“default”值。
  • 为“free text”输入指定一个“preload”页面,这将使用该页面的内容预加载自由文本字段。
  • 在“forminput”调用的查询字符串值中添加“preload=preload-page-name”; 这将使用该页面的内容预加载整个表单。
  • 同样,你可以在“FormStart”或“FormEdit” URL的查询字符串中添加“preload=...”值。
  • 在“forminput”调用中向查询字符串值 添加“template-name[field-name]=field-value”,以设置特定字段的值。要预加载多个字段的值,请使用“&”:“template1[field1]=val1&template1[field2]=val2”。
  • 同样,你可以将特定字段的值添加到“FormStart”或“FormEdit”的URL查询字符串中。
  • 最后,你可以使用“sfEditFormPreloadText”钩子创建自己的自定义处理。如果另一个扩展程序调用此挂钩,则它可以根据需要预加载数据。在此钩子上注册的函数应具有类似以下内容的标头:

    function-name(&$page_contents, $page_title, $form_title)

创建查询表单

表单也可以用于查询,而不是添加或编辑数据。换句话说,你可以创建一个表单,该表单将不会修改任何页面,而是将用于搜索现有数据-在该表单中,用户在不同的字段中输入值,然后看到与这些字段匹配的一组页面。
要拥有查询表单,你需要使用Special:RunQuery页面,该页面以类似于Special:FormEdit的方式显示表单,但是没有关联的目标页面。相反,当用户通过单击“运行查询”按钮提交表单时,用户停留在Special:RunQuery页面上,但是现在该页面显示了模板及其输入的值显示时的外观。表单使用的模板最有可能包含一个或多个Semantic MediaWiki内联查询,以使用用户输入的值查询数据。

“运行查询”按钮

默认情况下,如果通过Special:RunQuery访问表单,则会在表单底部显示一个名为“运行查询”的按钮。你可以使用表单定义中的标签“{{{standard input | run query}}}}来更改此按钮的位置和文本。(此标记还可以接受其他参数,例如“ label =”和“ class =”。)

创建查询表单的链接

创建查询表单后,你可以使用如下语法来链接到它:

[[Special:RunQuery/query form name]]

但是,首选的解决方案是#queryformlink解析器功能,因为它更容易且功能更强大。该函数的基本调用如下所示:

{{#queryformlink:form=query form name}}

这是#queryformlink的完整语法:

{{#queryformlink:form= |link text= |link type= |query string= |query string parameters |tooltip= |popup}}

这些参数几乎与#formlink使用的参数相同(请参见此处)。

嵌入查询表格

你也可以在另一个页面中嵌入查询表单。为此,请在要显示查询表单的页面中添加以下内容:

{{Special:RunQuery/query form name}}

自动修改页面

你可以创建链接,这些链接在单击时可以使用#autoedit解析器功能在后台自动创建或编辑带有预加载值的页面。调用和显示此功能的方式与#formlink非常相似-区别在于链接仅在后台执行操作,而不是将用户带到表单。#autoedit的语法是

{{#autoedit:form= |target= |link text= |link type= |query string= |query string parameters |reload }}

除“reload”外,所有这些参数的工作方式与它们在#formlink中的工作方式相同;如果将“reload”添加到呼叫中,则在单击链接后重新加载当前页面。
举例来说,假设你要创建一个简单的投票方案,让用户在“香草”,“巧克力”和“草莓”之间进行投票。每个页面都有一个页面,每个页面都包含一个名为“Flavor”的模板,该模板带有一个名为“ Num选民”的字段–该字段又设置了一个语义属性,称为“具有投票数”。还有一种表单,也称为“Flavor”,用于编辑此类页面。要创建一个链接,当单击该链接时,会将“香草”页面中的投票数增加一,你可以在页面上进行以下调用:

{{#autoedit:form=Flavor
|target=Vanilla
|link text=Vote for Vanilla
|query string=Flavor[Num votes]={{#expr:{{#show:Vanilla|?Has number of votes}} + 1}} }}

用户单击这样的链接会怎样?它们将保留在该页面上,但是链接将变成文本,显示为“使用表单表单名成功修改的目标页面”。如果用户刷新页面或稍后再访问该页面,他们将再次看到原始链接,并且可以单击该链接;用户单击#autoedit链接的次数没有限制。(尽管你可以在#if调用中嵌入#autoedit调用,但如果安装了ParserFunctions,则仅向某些用户或在某些情况下显示。)
此功能也可以通过MediaWiki API(请参阅此处)作为“pfautoedit”操作使用-这使外部脚本和bot可以在Wiki页面中修改模板调用。你可以通过在Wiki的api.php文件中搜索“pfautoedit”来找到完整的文档。本质上,这些参数与#autoedit相同。

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