跳转到内容

帮助:对话

来自维基教科书,开放世界中的开放书籍

对话功能允许构建交互式、动态的维基页面。该功能包含两个主要部分:一组用于指定维基页面上交互式元素的模板,以及一组可以由这些交互式元素控制的通用“操作”。

使用这些功能意味着只需要编写维基标记,因此交互式页面可以由维基社区进行开发和维护。

从用户的角度来看,交互式页面允许通过对话框和类似的输入元素输入数据,并允许这些数据流向其他页面的输入元素、模板参数和操作。

在内部,这些功能的核心是使用 JavaScript 实现的,旨在通过使用 JavaScript 的其他操作扩展,而一些补充功能则在 Lua 中实现(参见 {{evalx}})。

更高级别的 交互式助手 基于这些功能。

页面元素

[编辑 | 编辑源代码]

交互式维基页面使用许多模板进行排列,这些模板收集在 Category:Dialog 格式化模板 中。

支持四种类型的输入字段:文本、textarea、选择和复选框。它们分别使用模板 {{dialog/text}}、{{dialog/textarea}}、{{dialog/select}} 和 {{dialog/checkbox}} 指定。

每个模板都需要一个参数 id=name,指定字段的名称。理论上,每个 ID 在该页面上的输入字段中必须是唯一的,如果同一页面上的两个输入字段具有相同的 ID,可能会发生糟糕的事情。在实践中,有时没有好方法来保证唯一性;但有一种技术可以防止在最常见的情况下发生糟糕的事情,下面在 按钮 部分解释。

文本字段是一个单行文本输入框。可选参数 size=width 指定框的宽度,这会影响框的显示方式,但不会影响其内容的大小。可选地,一个未命名参数指定文本框的初始内容;默认情况下,框最初为空。

textarea 字段是一个多行文本输入框。可选参数 cols=widthrows=length 指定框的宽度和高度,这会影响框的显示方式,但不会影响其内容的大小。在某些 Web 浏览器上,无论指定什么宽度,框始终保持相同的宽度。可选地,一个未命名参数指定 textarea 框的初始内容;默认情况下,框最初为空。

选择字段是一个供选择的选项菜单。未命名参数指定选项。未命名参数成对出现:一个参数指定菜单上出现的选项,下一个参数指定该菜单项选择的内部值。最初,第一个选项被选中。

复选框字段是一个可以切换的开/关值。它的内部值是“yes”或“”(空白)。可选参数 checked=非空白 使复选框最初处于开启状态;否则,它最初处于关闭状态。

按钮通常使用模板 {{dialog/button}} 指定。为创建特定类型的按钮提供了更专业的模板,并且可以在适合预期用途的情况下使用。

按钮在点击时的功能是将数据发送到一个操作。模板参数 action=name 指定操作的名称。可选模板参数 label=text 指定按钮上显示的文本;默认情况下,按钮的标签为操作的名称。未命名模板参数指定要传递给操作的对话框参数。

每个对话框参数都以三种方式之一指定。首先,模板参数可以仅仅是页面上对话框字段的 ID,在这种情况下,当按钮被点击时,该字段的内容将作为对话框参数传递给操作,该参数的名称为该字段的 ID。其次,字段的内容可以在不同的名称下传递给操作,方法是指定不同的名称、冒号和字段的 ID。第三,要传递给操作的对话框参数的名称后面可以是两个冒号,然后是一个要传递给该名称的值,就像该值已作为 {{dialog/textarea}} 的初始值指定一样,然后从中获取该值(这就是在内部发生的)。如果指定的值包含冒号,则假定它是页面的名称,并通过 {{隐藏使用}} 进行链接;如果已知该值是页面名称,但可能不包含冒号,请使用 {{dialog/page}} 来保证冒号的存在。为某些类型的按钮提供了专用模板;截至撰写本文时,{{dialog/view}} 和 {{dialog/edit}},在下面的 查看编辑 动词部分进行了描述。

有时模板需要生成一个对话框字段仅仅是为了保存要由生成的按钮使用的一个值——尽管你可能不必自己设置它,因为 {{dialog/button}} 已经以这种方式处理了值。为了防止持有者字段混淆页面,请使用 {{dialog/textarea}} 参数 hidden=非空白。但是,在这种情况下,可能没有好方法来保证整个页面上的字段 ID 是唯一的。为了确保按钮即使在可能重复的字段 ID 下也能找到正确的字段,请将字段放在按钮的后面;当一个按钮查找具有给定 ID 的对话框字段的值时,它从页面上按钮出现的位置开始查找,并获取它找到的第一个具有正确 ID 的字段,只有在它在按钮之后没有找到任何这样的字段时,才会查看页面的开头。

可选模板参数 delegable=no 阻止按钮将其操作委托给目标——否则它会尝试这样做。按钮的委托只有在当前页面是通过操作查看时才有可能;目前,这个操作必须是 do。委托按钮不会将其目标操作传递给它指定的那些对话框参数,而是修改传递给当前视图的对话框参数,并将此修改后的对话框参数集传递给它的目标操作。

  • 即使在技术上可能进行委托并且 delegable 模板参数允许委托的情况下,按钮也只有在目标操作与当前页面正在查看的操作相同的情况下,才需要尝试进行委托。 do 操作只在此必要的情况下进行委托。
  • 当当前操作和目标操作相同时,委托可以避免进行新的操作页面访问,这既可以节省时间和服务器负载,又可以避免在显示目标视图之前,用“请稍候”消息破坏性地替换当前视图。
  • 传递给当前视图的对话框参数,但未由按钮指定,将在委托期间传递给目标。当委托使这些额外的对话框参数可用时,目标视图可能能够利用这些参数。
  • 委托的一个潜在缺点是,由于委托会破坏性地更新接收到的对话框参数,因此当前视图无法通过单击 Web 浏览器上的“后退”导航按钮来恢复;“后退”通常会将您带到最近一个没有委托给其后继视图的页面视图。

可选的模板参数echo=非空会导致在主按钮旁边出现第二个按钮,与第一个按钮相同,但其目标操作是操作echo;这有助于调试对话框,通过允许对话框撰写者查看按钮传递的数据以及传出的操作请求是否已验证。

当请求某个操作执行具有重大后果的操作时,该操作可能需要一些证明请求是合法的证据。这通过对话框软件提供的操作请求验证来完成。经过验证的操作请求来自页面上的按钮点击,该页面满足以下所有四个条件

  • 源页面必须是操作页面,或者由操作页面显示。目前,唯一支持显示另一个页面的操作是do
  • 源页面必须得到完全保护。
  • 源页面必须包含一个或多个模板调用,指定对导致显示源页面的传入操作请求需要验证什么(如果有)。这些模板将在下面解释。
  • 负责显示源页面的操作必须在内部调用验证。此内部调用既是操作如何确定其传入的操作请求是否满足页面的要求,也是操作如何提供其传出操作请求的验证的方式。

对传入操作请求的要求通过模板{{dialog/null requirement}}{{dialog/require origin}}指定。

  • {{dialog/null requirement}} 不需要对传入的操作请求进行任何验证。
  • {{dialog/require origin}} 需要来自固定允许来源列表中的一个的已验证传入操作请求;这些允许来源由未命名的模板参数命名。可选的模板参数proxy=名称表示源页面由命名操作页面显示,而不是源页面本身是一个操作页面。

如果在单个页面上使用多个传入验证模板调用,则为了验证传入的操作请求,所有这些模板调用都必须得到满足。特别是,如果{{dialog/require origin}}在没有未命名模板参数的情况下调用,则无论页面上发生了什么其他调用,传入的操作请求都无法验证。

请仔细注意,验证的是操作请求;任何特定操作页面视图都可能与两个独立的请求相关联 - 一个传入请求,其来源是当前请求之前查看的页面,以及一个可能存在的传出请求,其来源是当前页面。传入请求的验证完全取决于之前查看的页面;传出请求的验证取决于当前页面,包括它对上述模板{{dialog/null requirement}}{{dialog/require origin}}的使用。

Ifsupported

[编辑 | 编辑源代码]

如果页面使用对话框功能,通常需要设计页面,使其在用户的浏览器不支持对话框功能的情况下合理地运行。这通过模板{{dialog/ifsupported}}来完成。模板接受两个未命名参数。如果对话框功能可用,则第一个模板参数可见,而第二个模板参数隐藏。如果对话框功能不可用,则第一个模板参数隐藏,而第二个模板参数可见。

按钮执行的操作体现为名称格式为Wikibooks:Dialog/action的页面,其中action是按钮调用操作的名称。这些操作被收集在一起,在Category:Dialog actions中。

操作: do

[编辑 | 编辑源代码]

do 操作执行几种不同的功能,这些功能由传入的对话框参数verb选择。将所有这些功能放在单个操作下,可以从一个功能委托到另一个功能,节省大量时间(可能是每次按钮点击一到两秒)并避免重复地使用“请稍候”消息中断页面显示。

动词: view

[编辑 | 编辑源代码]

view 动词在正在进行的对话框序列中显示一个页面,允许显示的内容取决于之前的对话框。

传入的对话框参数page命名要显示的页面,传入的对话框参数替换了显示页面上的模板参数;如果显示的页面包含任何与传入的对话框参数具有相同名称的对话框字段,则传入的值将成为对话框字段的初始值。

传入的对话框参数值通常不被解释为维基标记。模板{{dialog/preview}}将传入的对话框参数preview的值解释为维基标记。

view 动词专门处理传入的对话框参数REQUESTING-PAGEINCOMING-AUTHENTICATEDUSERNAMEUSER-GROUPSSUBJECT-EXISTSSUBJECT-CONTENTSUBJECT-TIMESTAMPSUBJECT-CATEGORIESSUBJECT-FLAGGEDREQUESTING-PAGE 命名操作请求来自的页面;INCOMING-AUTHENTICATED 为非空,当且仅当传入的操作请求已验证。USER-GROUPS 命名查看用户所属的所有用户组,由双引号分隔,并用空格隔开。SUBJECT-* 提供有关传入对话框参数subject命名的页面的信息。

view 要求进行传出的验证,但指定验证要求(通过{{dialog/null requirement}} 或 {{dialog/require origin}}) 是显示页面的责任,无论验证是否成功,view 都将继续进行。

在使用 do/view 指定按钮和要显示的固定页面时,可以使用模板{{dialog/view}},而不是使用通用模板{{dialog/button}}。专门的模板负责操作和动词,如果未提供模板参数page,则会发出警告。

显示的页面可能要求 view 动词改为显示错误处理页面;这通常是在传入的对话框参数未通过某些验证检查时进行的。错误处理页面将/error 附加到显示页面的名称。仅当请求页面名称不以“error”结尾且错误处理页面存在时才会遵守重定向请求。重定向请求通过使用{{dialog/init}} 将对话框字段local-error 设置为非空值来实现;遵循局部参数的标准处理,错误处理页面可以访问保留的传入对话框参数INCOMING-LOCAL-ERROR。有关subject命名的页面的修订历史信息可以通过以SUBJECT-HISTORY- 开头的保留参数来请求;有关category命名的类别的成员可以通过以CATEGORY-MEMBERS- 开头的保留参数来请求;有关file命名的文件元数据可以通过以FILE-INFO- 开头的保留参数来请求;维基标记可以通过保留参数EXPANDED-TEXT 来模板扩展;所有这些高级查询都通过使用{{dialog/init}} 指定的局部参数来进行管理。

当通过 do/view 查看页面时,页面顶部显示的页面名称是显示页面的名称,选项卡引用查看的页面(历史记录、编辑等);标题右侧的小括号内的维基链接提供对操作页面的访问。在撰写本文时,侧边栏上的相关链接(如“WhatLinksHere”)仍然引用操作页面而不是显示页面。

如果您通过委托以外的方式从查看页面导航离开,则 do 操作会将对话框字段的值保存在显示中。如果您后退以返回到显示的视图,则对话框字段的值将自动恢复到您离开时的状态。只保存一定数量的这些页面状态,因此如果您在返回之前执行了许多其他操作,则数据可能已被丢弃;但例如,如果显示的页面包含{{dialog/button}},您可以单击 echo 按钮以查看正在传递的值,然后后退以单击主按钮,而无需重新输入显示页面上的所有字段值。(但是,如果{{dialog/button}}位于直接查看而不是通过 do/view 查看的页面上,则此方法将不起作用。)

对话框页面可能要求用户在通过 view 动词查看页面之前通过模板{{dialog/confirm view}}确认一个确认问题(取消/确定)。

如果视图请求的目标页面完全受保护,它可以请求保存请求对话框状态以供稍后恢复,或者使用通过 {{dialog/init}} 指定的字段(参见 此处)来恢复以这种方式保存的对话框状态。

动词:编辑

[编辑 | 编辑源代码]

编辑动词基于一个中介表单来修改或创建页面,该表单确定操作是否允许,以及如果允许,编辑页面后的新内容是什么。要修改或创建的页面由传入的对话框参数 subject 指定,而中介页面由传入的对话框参数 form 指定;这些传入的对话框参数必须由请求者提供。

只有在传入的请求满足作为独立页面在表单上指定的传出身份验证要求时,操作才允许(因此,包括 <noinclude> 块但不包括 <includeonly> 块)。因此,表单通常应包含一个调用 {{dialog/require origin}}{{dialog/null requirement}}noinclude 块;编辑操作的权限可能会被条件性地包含 {{dialog/require origin}} 拒绝,而没有任何参数(无论包含任何其他条件,都禁止身份验证)。如果目标页面的状态(存在和时间戳,如果存在)与传入的对话框参数 local-basetimestamplocal-creation 不一致,操作也会被阻止,其中一个必须通过 {{dialog/init}} 提供。

主题页面的新内容是通过与 view 动词一样的方式替换模板参数来确定的,将表单解释为如果在主题页面上包含(因此,省略 noincluded 块)并扩展模板。实际上,因此表单计算主题的新内容。

在完成或失败时,编辑动词可能会将传入的操作请求重定向到其他地方。

  • 在完成时,可以通过传入的对话框参数 local-summary 提供自定义编辑摘要。如果提供了传入的对话框参数 page,则请求将转发给动词 view;因此,view 会接收与 edit 提供的相同的对话框参数,这些参数会根据表单上的任何 {{dialog/init}} 调用进行修改。在没有参数 page 的情况下完成时,用户只会停留在目标页面上。
  • 由于表单未经身份验证而失败时,可以通过传入的对话框参数 local-error 提供自定义错误消息。如果表单具有完全受保护的子页面 /error,则传入的请求将转发到该子页面;遵循对本地参数的标准处理,子页面可以在保留的传入对话框参数 INCOMING-LOCAL-ERROR 中访问自定义错误消息。
  • 在其他失败情况下,会向用户报告错误消息,并且如果可能,用户将返回到发出编辑请求的对话框状态。如果无法恢复之前的对话框状态,则会提供一个选项列表,指导用户下一步该怎么做。

在指定具有 do/edit 和固定中介表单的按钮时,可以使用模板 {{dialog/edit}} 代替通用模板 {{dialog/button}}。专用模板负责操作和动词,并且如果未提供模板参数 form,则会强烈反对。

操作:回声

[编辑 | 编辑源代码]

回声操作显示传递给它的对话框参数,以及传入的操作请求的源页面和代理页面的经过身份验证的名称(如果有)。这可能有助于调试对话框,例如 {{dialog/edit}} 或 {{dialog/view}}; 参见 上面

操作序列

[编辑 | 编辑源代码]

可以设置对话框以响应单个按钮点击执行一系列操作。这种能力是严格限制的,在诉诸于它之前,应仔细考虑其他替代方案。

当用户手动单击按钮时,会在操作序列的长度上设置一个上限,该上限可以在另一个手动单击之前执行;截至目前,这个上限最初为 10 个操作。在查看页面时,如果此序列上限大于零,并且页面被适当地标记,并且页面上有一个专用于序列使用的按钮,则该按钮会自动触发,并且序列长度上限会递减。有关详细信息,请参见 Wikibooks:Dialog/do/doc#Action sequences

用于调用操作的 URL

[编辑 | 编辑源代码]

操作请求可以编码为 URL,因此在浏览器中加载 URL 会发出对操作的请求。url 由带有附加查询参数的页面链接组成。页面链接可以是 Wikibooks:Dialog/do 或是 Wikibooks:Dialog;使用 Wikibooks:Dialog/do 速度更快,通常大约快两秒,并且可以模拟一些委托按钮的行为,尽管 Wikibooks:Dialog 涵盖了 Wikibooks:Dialog/do 未处理的一些边缘情况。

对于页面 Wikibooks:Dialog/do,查询参数 verb=verb 是必需的,用于命名请求的动词。其他查询参数指定要传递给操作的其他对话框参数。不要使用参数名称 action,因为维基软件会尝试解释它。查询参数附加到 url,第一个参数前加 ?,连续参数之间加 &。例如

[//wikibooks.cn/wiki/Wikibooks:Dialog/do?verb=view&page=Help:Dialog]

或者,您也可以使用 {{fullurl:...}} 魔术词来组装这样的 url,如果您不介意这种技术还会传递一个虚假的参数 title=Wikibooks:Dialog/do

[{{fullurl:{{SITENAME}}:Dialog/do|verb=view&page=Help:Dialog}}]

基于 Wikibooks:Dialog/do 的查询 url 是“不稳定”的,因为如果您从维基页面外部或直接查看的维基页面(而不是通过操作 do)访问了这样的 url,然后从该 url 导航离开并返回,查询将转换为新的操作请求;之前与页面视图相关联的任何对话框数据都将丢失。另一方面,当这些 url 从通过 Wikibooks:Dialog/do 动词 view 查看的页面内部使用时,单击 url 会自动转换为委托操作请求(尽管截至目前,它不会 验证 委托请求)。在以这种方式委托时,保留的查询参数 FIELDS 可以指定页面上的字段,以类似于按钮的方式通过操作请求传递(参见 此处)。

对于页面 Wikibooks:Dialog,查询参数 dialog-action=action 是必需的,用于命名请求的操作。 Wikibooks:Dialog 伪操作将 url 转换为操作请求(在内部,它实际上构建了一个非委托按钮并自动单击它)。例如

[//wikibooks.cn/wiki/Wikibooks:Dialog?dialog-action=echo&foo=one&bar=two]

通常,生成的 action-request 不会被验证。对于页面 Wikibooks:Dialog,指定一个查询参数 dialog-confirm=non-blank 会改变 url 的行为,因此它不会立即发出未经身份验证的请求,而是会向用户显示一个按钮供用户点击,在按钮下方显示提议的对话框参数,并且当用户点击按钮时,会发出经过身份验证的操作请求(源为 Wikibooks:Dialog)。

[//wikibooks.cn/wiki/Wikibooks:Dialog?dialog-action=echo&foo=one&bar=two&dialog-confirm=yes]

诊断面板

[编辑 | 编辑源代码]

在任何给定时间,您的本地客户端可能存储着多个对话框数据组,因此,如果您导航回(不远)到对话框页面,您离开时在那里存在的数据在您返回时仍将存在。提供了一个 诊断面板,使您可以浏览所有这些数据组的内容。该面板还具有专家模式,允许访问有关这些数据集的更多内部元数据,并在某些情况下允许访问尚未完全提交到中央系统的暂定对话框数据组。

添加新的操作

[编辑 | 编辑源代码]

管理员可以创建新的操作。这在开发现有操作的升级时最为常见(几乎可以肯定的是操作 do)。这些功能旨在提供一组功能强大且用途广泛的小型操作,并通过安全检查(例如完全受保护的页面和操作请求身份验证)进行严格限制;创建新操作的人员强烈建议保持此策略。

操作由两个页面定义。

  • 操作的公共界面是页面 Wikibooks:Dialog/action,其中 action 是用于指定操作的名称 {{dialog/button}}。此页面应包含对 {{dialog/action page}} 的调用,包含在允许在调用操作时方便地替换“请稍候”消息的 html div 元素中,并在 Category:Dialog actions 中分类,并使用合适的排序键。有关规范示例,请参见 Wikibooks:Dialog/do
操作页面上的模板 {{dialog/action page}} 提供了一个链接,用于创建操作文档页面,以描述操作的行为。
  • 操作行为的 JavaScript 实现是页面 MediaWiki:Common.js/w/Wikibooks:Dialog/action。(该项目在 MediaWiki:Common.js 中配置,因此在加载任何页面 page 时,会执行 JavaScript MediaWiki:Common.js/w/page。)操作的 JavaScript 基本框架以及在 JavaScript 中调用各种对话框功能的说明,在 MediaWiki talk:Dialog/receive 中提供。负责编写新操作的管理员应该研究现有操作的 JavaScript。

新操作的开发应在用户空间进行。普通用户无法在用户空间中调用操作,但管理员可以。如果按钮在用户空间中指定操作页面,则不会添加前缀 Wikibooks:Dialog/,并且只有管理员才能单击该按钮(尝试单击的非管理员会收到错误提示信息)。每个对话框操作可能都有一组测试页面菜单,管理员可以使用这些菜单来测试用户空间中操作的替代方法。一旦操作准备就绪,就可以在项目空间中重新创建它。


华夏公益教科书