(对于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.
然后在另一页上,我可以参考上面的示例&#39;示例&#39;页面,像这样:
* Example created by {{d|Example|CreatedBy}} on {{d|Example|CreationDate}}
这将是这样的:
* Example created by John Smith on 2015-01-01
这种情况的典型用途是将数据放在文章页面上,然后能够提供比使用类别更丰富的列表。目前列表中的所有数据都是重复的,因此如果它被更改,则需要在两个地方进行更新 - 包括文章内和#34;丰富列表中的#34;。
答案 0 :(得分:0)
我想我已经研究过如何做到这一点。首先,正确的解决方案似乎是使用Semantic MediaWiki,这是一个专为使用MediaWiki进行数据存储而设计的扩展。但是在普通的MediaWiki中,这可以通过以下方式实现。
Page Template:D
:
{{#if:{{{2|}}}|{{:{{{d|Page|Field}}
}|{{{2}}}}}
| {{:{{FULLPAGENAME}}|{{{d|Field}}
}}}
}}
这允许{{#if:{{{1|}}}|{{#ifeq:{
和Template:D
}|_valid|1|{{{{Template:D
}|}}}}}|
<!-- Existing infobox goes here -->
}}
_valid
像原始问题一样工作。
还需要更改信息框代码,以便它被包围:
1
这使得信息框数据已启用。这意味着您可以将其中包含其中一个信息框的页面作为模板处理,并将其包含在另一个页面中。这就是{{d|Pagename|_valid}}
所做的事情 - 它将整篇文章作为模板包含在内,而信息框中的这段代码可确保代替整个页面内容包含在1
点,而不是利息包括在内。
它还添加了一个名为{{#ifeq:...}}
的特殊字段,其值为Template:D
,可用于检测包含有效信息框的页面。如果您在使用该页面上的任何字段之前确保<onlyinclude>{{My Infobox|{{{1|}}}
| Field1 = Value1
| Field2 = Value2
| etc.
}}</onlyinclude>
等于|{{{1|}}}
(例如使用Template:D
),那么您将获得正确的数据。这很重要,因为如果您使用的页面没有启用数据的信息框,那么每个{{#foreach:}}
次出现都会嵌入页面的全部内容!
最后,每个信息框都必须更改为这样输入:
{{#i:}}
这是必需的,因为MediaWiki can't embed <onlyinclude>
tags within templates。信息框名称末尾的{{d|{{#i:}}|Example}}
用于将字段参数从Example
传递到文章页面并传递到信息框模板本身。
以下是一个有效的例子: