跳轉至內容

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),但需要大約兩秒鐘的中間頁面訪問時間。

另請參閱

[編輯原始碼]
華夏公益教科書