将一篇文章中的数据引用到另一篇文章中
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
通过文章页面传递到信息框模板本身。
这是一个工作示例:
- Template:D
- Data-enabled Infobox
- List of pages, with content extracted from each page's infobox - 注意此页面使用自定义
{{#foreach:}}
命令为类别中的每个页面重复 wikitext,其中 {{#i:}}
在每个循环中替换为页面名称迭代。所以{{d|{{#i:}}|Example}}
用于在当前循环迭代中从页面中提取Example
字段。
(对于否决票:我在 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
通过文章页面传递到信息框模板本身。
这是一个工作示例:
- Template:D
- Data-enabled Infobox
- List of pages, with content extracted from each page's infobox - 注意此页面使用自定义
{{#foreach:}}
命令为类别中的每个页面重复 wikitext,其中{{#i:}}
在每个循环中替换为页面名称迭代。所以{{d|{{#i:}}|Example}}
用于在当前循环迭代中从页面中提取Example
字段。