1

(对于downvote:我在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

这样做的典型用途是将数据放在文章页面上,然后能够提供比使用类别更丰富的列表。目前,列表上的所有数据都是重复的,因此如果它发生更改,则需要在两个地方进行更新——在文章中和在“富豪榜”中。

4

1 回答 1

0

我想我已经想出了如何做到这一点。首先,正确的解决方案似乎是使用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(例如 with ),那么您将获得正确的数据。{{#ifeq:...}}这很重要,因为如果您使用的页面没有启用数据的信息框,那么每次Template:D出现都会嵌入页面的全部内容!

最后,每个信息框都必须更改为这样输入:

<onlyinclude>{{My Infobox|{{{1|}}}
 | Field1 = Value1
 | Field2 = Value2
 | etc.
}}</onlyinclude>

这是必需的,因为 MediaWiki不能<onlyinclude>在模板中嵌入标签|{{{1|}}}信息框名称末尾的 用于将字段参数从文章Template:D页面传递到信息框模板本身。

这是一个工作示例:

于 2015-02-11T02:26:29.857 回答