(对于否决票:我之所以询问Stack Overflow,是因为这是一个涉及使用MediaWiki模板系统"编程"的问题)
我正在寻找一种在MediaWiki文章页面上包含数据的方法,这样数据值也可以从其他页面引用,而不需要在其他页面上复制数据。最好不要安装额外的延长件。
我所追求的是创建一个看起来像这样的文章页面的能力:
<!-- This page is 'Example' in the main namespace -->
{{Infobox
| CreationDate = 2015-01-01
| CreatedBy = John Smith
}}
This article is about the item created by {{d|CreatedBy}}.
当在浏览器中查看此页面时,它应该显示如下:
+------------------------+
| Example |
| Created on: 2015-01-01 |
| Created by: John Smith |
+------------------------+
This article is about the item created by John Smith.
然后在另一个页面上,我可以参考上面"示例"页面中的数据,如下所示:
* Example created by {{d|Example|CreatedBy}} on {{d|Example|CreationDate}}
它将显示如下:
* Example created by John Smith on 2015-01-01
这样做的典型用途是将数据放在文章页面上,然后能够提供比使用类别更丰富的列表。目前,列表中的所有数据都是重复的,因此如果它发生了更改,则需要在两个位置进行更新——既在文章中,也在"丰富列表"中。
我想我已经想出了如何做到这一点。首先,正确的解决方案似乎是使用Semantic MediaWiki,这是一个为使用MediaWiki进行数据存储而设计的扩展。然而,在普通的MediaWiki中,这可以通过以下方式实现。
第Template:D
:页
{{#if:{{{2|}}}|{{:{{{1}}}|{{{2}}}}}
| {{:{{FULLPAGENAME}}|{{{1}}}}}
}}
这使得{{d|Page|Field}}
和{{d|Field}}
能够像在原始问题中一样工作。
信息框代码也需要更改,以便它被以下内容包围:
{{#if:{{{1|}}}|{{#ifeq:{{{1}}}|_valid|1|{{{{{{1}}}|}}}}}|
<!-- Existing infobox goes here -->
}}
这将启用信息框数据。这意味着您可以将带有其中一个信息框的页面视为模板,并将其包含在另一个页面中。Template:D
就是这样做的——它将整篇文章作为模板包括在内,信息框中的这段代码确保了Template:D
点不包括整个页面内容,而只包括感兴趣的字段。
它还添加了一个名为_valid
的特殊字段,其值为1
,可用于检测是否包含有效信息框的页面。如果在使用该页面上的任何字段之前确保{{d|Pagename|_valid}}
等于1
(例如与{{#ifeq:...}}
),则您将获得正确的数据。这一点很重要,因为如果您使用的页面没有启用数据的信息框,那么每次出现Template:D
都会嵌入页面的全部内容!
最后,每个信息框都必须更改为这样输入:
<onlyinclude>{{My Infobox|{{{1|}}}
| Field1 = Value1
| Field2 = Value2
| etc.
}}</onlyinclude>
这是必需的,因为MediaWiki无法在模板中嵌入<onlyinclude>
标记。信息框名称末尾的|{{{1|}}}
用于将字段参数从Template:D
传递到文章页面并传递到信息框模板本身。
以下是一个工作示例:
- 模板:D
- 启用数据的信息框
- 页面列表,其中的内容从每个页面的信息框中提取-请注意,此页面使用自定义
{{#foreach:}}
命令为类别中的每个页面重复wikitext,其中{{#i:}}
在每个循环迭代中被替换为页面的名称。因此,{{d|{{#i:}}|Example}}
用于在当前循环迭代中从页面中提取Example
字段