将一篇文章中的数据引用到另一篇文章中

Referencing data from one article on another

(对于否决票:我在 Stack Overflow 上提问的原因是因为这是一个涉及 "programming" 与 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'页面中的数据,像这样:

* Example created by {{d|Example|CreatedBy}} on {{d|Example|CreationDate}}

会出现这样的:

* Example created by John Smith on 2015-01-01

这个的典型用途是将数据放在文章页面上,然后能够提供比使用类别更丰富的列表。目前列表中的所有数据都是重复的,因此如果它被更改,则需要在两个位置进行更新 - 文章内和 "rich list".

我想我已经想出了如何做到这一点。首先,正确的解决方案似乎是使用 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 can't embed <onlyinclude> tags within templates。信息框名称末尾的 |{{{1|}}} 用于将字段参数从 Template:D 通过文章页面传递到信息框模板本身。

这是一个工作示例: