跳转至内容

Wikibooks:Dialog/do/doc

来自 Wikibooks,开放世界中的开放书籍

对话框操作执行若干操作中的任意一个。将所有这些操作放在单个操作中可以使顺序操作更快,因为操作之间不需要单独的页面加载。

传入的对话框参数verb选择操作。如果省略此参数,或其值无法识别,则选择操作view

如果操作页面不是通过对话框操作请求访问的,但访问 URL 包含查询参数(包括一个名为verb的参数),则 URL 查询参数将转换为对话框操作请求。

动词:查看

[编辑源代码]

操作view显示指定的页面,并根据传入的对话框参数修改显示内容。要显示的页面由传入的对话框参数page命名。页面处理分为四个阶段。

  1. 如果指定的页面请求一个与提供的对话框参数同名的模板参数,则替换该模板参数。如果模板参数包含嵌套,则忽略它们(因此,{{{foo|{{{bar|quux}}}}}}将允许替换bar,但不允许替换foo)。此外,某些模板参数将被特殊处理;请参见下文。
  2. 处理对{{dialog/init}}的任何调用,可能会覆盖传入的对话框参数值,但对模板参数替换没有影响,因为该替换已经发生。
  3. 根据维基软件,对整个页面进行模板扩展并格式化以供显示。
  4. 如果指定页面上的任何交互式对话框字段与传入的对话框参数(或通过{{dialog/init}}提供)具有相同的名称(id),则将参数的值替换为该交互式字段的初始内容。

保留参数——任何名称以大写字母开头且不包含任何小写字母的对话框参数——不能通过按钮传递,也不能通过{{dialog/init}}覆盖;任何尝试传递或覆盖它们的尝试都将被忽略。

本地参数——任何名称以local开头的对话框参数——不能通过按钮直接传递,但可以通过{{dialog/init}}设置;请求者提供的任何本地参数都会通过将其名称转换为全大写并添加前缀INCOMING-来转换为保留参数。

各种保留参数将被替换为从其他地方提取的值。其中一些在可用时始终分配;其他一些除非作为模板参数出现,否则不会被提取(但一旦提取,它们就可以用于初始化对话框字段)。

  • INCOMING-AUTHENTICATED是传入请求的经过身份验证的源页面名称,如果传入请求未经过身份验证,则未定义。
  • REQUESTING-PAGE是传入请求的页面名称,即使未经过身份验证。
  • ACTIVE-PARAMETERS是按钮明确传递的对话框参数列表;该列表既是&分隔的,又是&分隔符分隔的。这可用于区分特意设置的参数与通过委托传递的参数。
  • USERNAME是用户正在编辑的维基媒体帐户名称,如果用户未登录,则为空白。
  • USER-GROUPS是用户所属的用户组列表,以空格分隔。
  • SUBJECT-EXISTStruefalse,具体取决于对话框参数subject命名的页面是否存在。
  • SUBJECT-CONTENT如果提取,则为主题页面的原始维基标记内容。
  • SUBJECT-TIMESTAMP如果提取,则为主题页面最新修订版的时间戳。
  • SUBJECT-CATEGORIES如果提取,则为主题页面所属的所有类别的名称列表,以双引号分隔并以空格分隔。
  • SUBJECT-FLAGGED如果提取,则为主题页面的flaggedrevs状态:neverpendingcurrent
  • PRELOAD-PAGENAME是被查看页面的关联预加载页面的页面名称。
  • PRELOAD-CONTENT如果提取,则为预加载页面的原始维基标记内容,其中包含指令已处理以进行转换。
  • DIALOG-GADGET-VERSION标识正在使用的对话框小工具版本。
  • DIALOG-RECEIVE-VERSION标识正在使用的接收模块版本。
  • DIALOG-DO-VERSION标识正在使用的do操作版本。

通过{{dialog/init}}的local-error的非空白值将启动委托到错误处理页面,该页面的名称在当前对话框页面的名称后附加/error。由于任何以local开头的传入对话框参数都将被转移到保留参数,因此local-error只能通过{{dialog/init}}为非空白。委托要求当前对话框页面的名称不以error结尾,并且错误处理页面存在。当前字段值将委托给错误处理页面(除了page变为错误处理页面的名称)。错误处理页面接收委托页面的REQUESTING-PAGE及其INCOMING-AUTHENTICATED;本地参数将根据上述内容转移到保留参数INCOMING-LOCAL-ERROR

几个以SUBJECT-HISTORY-开头的保留模板参数请求有关subject命名的页面的修订历史的信息。请求必须通过{{dialog/init}}中的非空白local-subject-history确认。最多收集 50 次修订版的信息。数据将放置在保留参数SUBJECT-HISTORY-REVIDSUBJECT-HISTORY-TIMESTAMPSUBJECT-HISTORY-USERSUBJECT-HISTORY-MINORSUBJECT-HISTORY-SIZESUBJECT-HISTORY-COMMENT中;每个都是每个修订版的命名数据的&分隔列表。local-subject-history-direction可以指定列表的方向,值为newer按时间递增列出修订版,值为older按时间递减列出修订版。如果在报告的修订版之后还有更多修订版,则SUBJECT-HISTORY-CONTINUE包含一个值,该值可用于请求更多修订版,在以后请求页面历史记录时,通过将该值放在local-subject-history-continue中。

几个以CATEGORY-MEMBERS-开头的保留模板参数请求有关category命名的页面的成员的信息。请记住在页面名称中包含前缀Category:。请求必须通过{{dialog/init}}中的非空白local-category-members确认。最多收集 50 个成员的信息,并将信息放置在保留参数CATEGORY-MEMBERS-TITLECATEGORY-MEMBERS-TYPECATEGORY-MEMBERS-TIMESTAMP中;每个都是每个成员的命名数据的&分隔列表。local-category-members-directionlocal-category-members-typelocal-category-members-sort可以调整结果列表;请参阅mw:API:Categorymembers。如果在报告的成员之后还有更多成员,则CATEGORY-MEMBERS-CONTINUE包含一个值,该值可用于请求更多修订版,在以后请求类别成员时,通过将该值放在local-category-members-continue中。

保留模板参数EXPANDED-TEXT请求对非空白local-text-to-expand中包含的原始维基标记进行模板扩展。

各种以FILE-INFO-开头的保留模板参数请求有关file命名的文件的详细信息。请求必须通过非黑色local-file-info确认。有关未缩放图像的基本信息将放置在保留参数FILE-INFO-SIZEFILE-INFO-WIDTHFILE-INFO-HEIGHT中。元数据将放置在以FILE-INFO-META-开头的保留参数中;请参阅mw:API:Imageinfo,特别是extmetadata

如果内部堆栈上保存了任何对话框状态,则将它们的数量作为保留参数STACK-DEPTH提供。如果当前页面完全受保护,则非空白local-pop将命名另一个传入的对话框参数;如果命名的参数非空白,则尝试从堆栈“弹出”一个状态,即从堆栈中删除最近保存的状态并进入该状态。否则,如果当前页面完全受保护,则非空白local-push将命名一个传入的对话框参数,如果命名的参数非空白,则尝试“推送”当前请求发出的对话框状态,即将其保存到堆栈顶部。仅当当前请求未委托且堆栈未满时才允许推送。如果推送成功,则保留参数INCOMING-PUSH将分配非空白值,否则保留参数INCOMING-PUSH-ERROR将分配一个错误消息来解释失败原因。

动词:编辑

[编辑源代码]

操作 edit 修改或创建指定页面,由一个表单页面进行中介,该表单页面决定操作的可行性和修改或创建页面的新内容。Dialog参数subject指定要修改或创建的页面,form指定中介页面。这两个参数是必需的。表单页面必须存在并且必须被完全保护。

传入的动作请求必须针对在noinclude模式下查看的表单进行身份验证。也就是说,表单页面必须转入模板{{dialog/null requirement}}{{dialog/require origin}}以指定允许传入动作请求来自何处。模板参数和{{dialog/init}}调用与动词view的处理方式相同。在不进行身份验证时,最佳实践是在{{dialog/require origin}}中引入显式调用(这样即使是偷偷插入的{{dialog/null requirement}}也无法诱导身份验证)。

Dialog参数local-basetimestamplocal-creation指定主题页面的预期预先存在状态。必须提供其中一个,但不能同时提供两个,必须通过{{dialog/init}}提供,因为它们是本地的。如果提供了local-basetimestamp,则主题页面必须存在并具有该时间戳。如果提供了local-creation,则其值必须为requiredprohibitedoptional;当required时,主题页面必须不存在,当prohibited时,主题页面必须存在。

对于主题页面的新内容,表单加载的方式就像在主题页面中转入一样。同样,模板参数和{{dialog/init}}调用与动词view的处理方式相同。{{dialog/init}}调用在noinclude指令之前处理,因此不受转入页面的选择影响。可以通过dialog参数local-summary提供用于成功操作的自定义编辑摘要。

通过dialog参数local-sectionlocal-sectiontitlelocal-minorlocal-notminor可以实现操作的进一步变化;请参阅mw:API:Edit#Parameters

在成功修改或创建主题后,如果提供了dialog参数page,则所有传递给此操作的dialog参数都将传递给动词view。如果未提供dialog参数page,则用户将继续查看修改/创建的页面。

如果操作尝试但未能进行身份验证,则可以通过dialog参数local-error提供自定义错误消息。操作会考虑将dialog参数传递到另一个页面,该页面通过将/error附加到表单名称来命名;如果此页面存在并且被完全保护,则其名称将复制到dialog参数page,并且dialog参数将传递给动词view。如果该页面不存在或未被完全保护,或者如果操作因其他某些原因失败,则会向用户报告错误消息,并且如果可能,用户将返回到发出编辑请求的对话框状态。如果无法恢复先前的对话框状态,则会提供一系列选项,建议用户下一步该做什么。

动作序列

[编辑源代码]

在特定条件下,只需单击一下按钮即可在无需进一步用户干预的情况下执行一系列操作。这是一种强大的功能,应谨慎使用,因为单击一次可能会造成大量损坏。在正在进行的动作序列期间,页面顶部会出现一个STOP SEQUENCE按钮,该按钮不会中止已在管道中的操作,但会阻止序列继续(在停止按钮生效之前,操作可能会有 1 或 2 个操作的延迟)。

截至撰写本文时,最大动作序列长度为 10 个操作(为避免单数数字给人“少”的感觉,这是必要的最小长度)。如果满足以下所有条件,则已查看页面会自动触发序列中的下一个操作

  • 页面通过{{dialog/init}}为dialog参数local-sequence分配一个非空值。
  • 页面上恰好有一个按钮被标记为序列按钮;请参阅{{dialog/button}}。
  • 序列按钮委托给操作do。
  • 页面具有传出身份验证
  • 页面不使用{{dialog/preview}}。

作为传出身份验证的推论,页面必须被完全保护。因此,无法伪造local-sequence,因为{{dialog/init}}仅在直接出现在页面上时才起作用;并且只要页面上提供了一个序列按钮,序列就不会被通过(通过页面上使用的某些未受保护的模板)转入其他按钮来劫持,因为当存在多个序列按钮时,序列不会继续。

URL转换

[编辑源代码]

如果在没有对话框操作请求的情况下访问操作页面,并且访问URL包含查询参数(包括一个名为verb的参数),则会将URL查询参数转换为对话框操作请求。

如果通过动词view从页面视图中跟随链接到操作页面,则单击该链接时会将其转换为委托操作请求。在这种情况下,查询参数FIELDS可以指定一个用逗号分隔的字段列表,这些字段将像按钮一样通过操作请求传递;这些字段也可以使用冒号表示法作为按钮,以在不同的参数名称下传递字段值。

否则,通常会为转换后的对话框操作请求分配一个新的操作ID号。操作ID号区分不同的操作请求,以便可以在该ID下存储对话框数据,并且用户可以从请求中导航到网页浏览器,然后返回到该请求,并且(在一定程度上)可以恢复存储的数据。非委托按钮点击会在操作页面访问的URL中嵌入一个新分配的ID号,该ID号位于名为wndialogid的查询参数中;并且动词view对已查看页面上链接的任何基于URL的操作查询也执行相同的操作。但是,查询URL不包含嵌入的ID;因此,如果用户从它导航到其他地方然后返回,则会发出一个新的操作请求,并分配一个新的操作ID。

伪操作Wikibooks:Dialog提供了一种更通用但速度较慢的URL转换形式。该伪操作能够生成经过身份验证的操作请求,始终分配一个新的ID并访问生成的URL,并且始终生成具有可恢复状态的URL,适用于任何操作(不仅仅是do),但需要大约两秒钟的中间页面访问时间。

另请参阅

[编辑源代码]
华夏公益教科书