3人贊同了該回答
? MediaWiki 應(yīng)用程序最為人所知之處就是它是 Wikipedia 背后的引擎。很多人都發(fā)現(xiàn) MediaWiki 提供了一個(gè)可用的環(huán)境來在工作組、甚至整個(gè)組織以及在線社區(qū)之間共享信息。MediaWiki 讓用戶可以通過博客、wiki 以及文件來共享信息。它還允許使用一個(gè)標(biāo)記云來保護(hù)所上載的文件,標(biāo)記文件以便輕松定位,以及定位專家。
那么,如果想要引入一些不想手動(dòng)更新的定制信息并插入到您的 wiki 頁(yè)面,該怎么辦呢? 又如果想要為特定的某種信息提供定制的輸出格式化,又該怎樣呢?這些情況正是 MediaWiki 的用武之地,因?yàn)槟梢暂p松地通過擴(kuò)展的使用來添加這些特定于站點(diǎn)的特性。
讓我們來看看您如何創(chuàng)建能夠與不同的信息源協(xié)作的 MediaWiki 擴(kuò)展,而同時(shí)又能通過熟悉的 wiki 頁(yè)的用戶界面來提供數(shù)據(jù)。
擴(kuò)展可以向用來撰寫文章的 wiki markup 中添加新的標(biāo)記,通過創(chuàng)建特殊頁(yè)面添加新的報(bào)告和管理特性,通過格式化皮膚更改 wiki 的觀感,甚至與外部的身份驗(yàn)證方法相集成(但是身份驗(yàn)證不會(huì)在本文中介紹)。
擴(kuò)展用 PHP 編寫并利用了 MediaWiki 的各種內(nèi)部 hook、類和方法來使其作業(yè)有效完成。在您使用任何受支持的 Web 服務(wù)器以及自己偏愛的 PHP 開發(fā)環(huán)境開發(fā)和部署 MediaWiki 時(shí),您將會(huì)用到本文中所列的如下工具:
Eclipse V3.5.2 — 支持大量編程語(yǔ)言和環(huán)境
PHP Development Tools (PDT) V2.2.0 — 一個(gè)面向 Eclipse 的 PHP 插件
MAMP Pro V1.9 — 一個(gè)面向 Mac OS X 的十分便利的包,用一個(gè)有用的 GUI 前端在一個(gè)隔離的環(huán)境中提供了 Apache、 MySQL 和 PHP。雖然 OS X 自帶了安裝好了的 Apache 和 PHP,但是我更愿意使用這個(gè)包,因?yàn)?OS X V10.6 Snow Leopard (V5.3.1) 內(nèi)的 PHP 版本有一個(gè)明顯的 bug,有礙于 MediaWiki 的正確運(yùn)行。
MediaWiki V1.15.3 — MediaWiki 的當(dāng)前穩(wěn)定版本
在深入探究不同類型的擴(kuò)展之前,讓我們先來看看為大多數(shù)擴(kuò)展使用的文件夾和文件布局。之后,是對(duì)皮膚擴(kuò)展的高度概覽以供您更改您的 MediaWiki 站點(diǎn)。接下來,將創(chuàng)建一個(gè)可生成管理性統(tǒng)計(jì)數(shù)據(jù)的特殊頁(yè)擴(kuò)展。最后,您將看到如何添加定制 XML 標(biāo)記 markup 支持以供您在編寫 wiki 頁(yè)面時(shí)使用。
MediaWiki 擴(kuò)展安裝于主 MediaWiki 路徑的 extensions 目錄。大多數(shù)現(xiàn)代的擴(kuò)展都安裝于其自己的目錄并一般包含如下三個(gè)文件( 是擴(kuò)展的名稱):
.php
.body.php
.i18n.php
第一個(gè)文件執(zhí)行初始化以及設(shè)置任務(wù)。第二個(gè)文件是擴(kuò)展的主體,是實(shí)現(xiàn)擴(kuò)展的工作代碼。最后一個(gè)文件包含國(guó)際化(i18n 是一個(gè)常見縮寫)字符串。通過將您的擴(kuò)展消息字符串提取到這個(gè) i18n 文件,就可以為任何 MediaWiki 支持的本地環(huán)境提供擴(kuò)展的本地化版本(假設(shè)您能夠找到翻譯文本的幫助)。
舉個(gè)例子,假如我創(chuàng)建了一個(gè)名為 的 Hello World 擴(kuò)展(有關(guān)本例的源代碼以及本文中其他示例的源代碼,參見 下載)。只要有人在 wiki 頁(yè)面上插入了 , 就會(huì)插入當(dāng)前的日期/時(shí)間戳。它包含如下文件:
CHTimeStamp/CHTimeStamp.php
CHTimeStamp/CHTimeStamp.body.php
CHTimeStamp/CHTimeStamp.i18n.php
圖 1. Eclipse 內(nèi)的 布局
擴(kuò)展會(huì)向 MediaWiki 的 markup 添加一個(gè) 變量。每當(dāng)您將 放入一個(gè)頁(yè)面,它都會(huì)被一個(gè)時(shí)間戳取代。這不難理解,對(duì)么?如果您有興趣,可以查看源代碼;我在此只給出一個(gè)大概,旨在為您介紹 MediaWiki 擴(kuò)展的總體布局和約定。
我的 CHTimeStamp.php 注冊(cè)這個(gè)國(guó)際化消息文件,告訴 wiki 引擎它能夠在 CHTimeStamp.body.php 找到 類并將此 方法添加到擴(kuò)展函數(shù)的數(shù)組。
在 CHTimeStamp.body.php 內(nèi),定義 類。如果仔細(xì)看一下此代碼,就會(huì)發(fā)現(xiàn)這完全由靜態(tài)方法組成,所以它也可以在無需更改擴(kuò)展行為的情況下作為一系列函數(shù)編寫。 的 方法注冊(cè)這些靜態(tài)方法來創(chuàng)建這個(gè) 變量以及處理使用此變量的那些頁(yè)面。
最后,在 CHTimeStamp.i18n.php 內(nèi),我為擴(kuò)展內(nèi)惟一的靜態(tài)字符串(它的描述)創(chuàng)建了譯文。借助 Google Translate,CHTimeStamp 可支持法語(yǔ)、德語(yǔ)以及西班牙語(yǔ)的本地語(yǔ)言環(huán)境。但我希望這種自動(dòng)翻譯不會(huì)將我的英語(yǔ)翻譯成難以理解(或不適當(dāng)?shù)模┑臇|西!
創(chuàng)建或下載了擴(kuò)展后,需要將它安裝到 MediaWiki 內(nèi)并激活它。
為您的 MediaWiki 站點(diǎn)準(zhǔn)備好一個(gè)有趣且有用的擴(kuò)展后,您肯定想要安裝并啟用它:
將此擴(kuò)展復(fù)制并解壓縮到 MediaWiki 的 extensions 目錄。
編輯 MediaWiki 根目錄內(nèi)的 LocalSettings.php。使用您喜愛的文本編輯器,添加一些行來配置這個(gè)新擴(kuò)展,然后使用 PHP 的 語(yǔ)句激活它。
比如,為了安裝 ,我已經(jīng)將它的 目錄復(fù)制到了 extensions 目錄并將如下語(yǔ)句添加到了 LocalSettings.php:。
通過訪問 wiki 的 Special:Version 頁(yè)面,可以檢查擴(kuò)展是否已經(jīng)被成功加載。除了有關(guān)所運(yùn)行的 MediaWiki 版本的信息外,這個(gè) Special:Version 頁(yè)面還會(huì)列出已成功加載的擴(kuò)展。
圖 2. Special:Version 頁(yè)面顯示
MediaWiki 利用了 PHP 的混合代碼功能以及 HTML markup 來讓您能夠通過皮膚的使用控制您 wiki 的觀感。除了主要的 PHP 代碼之外,一個(gè)皮膚可以包含各種 CSS 文件以及支持的圖像或 JavaScript。
一個(gè)皮膚通常包含兩個(gè) PHP 文件、一個(gè)內(nèi)含其他支持文件的目錄。比如,著名的默認(rèn)皮膚 MonoBook 的組成如下:
MonoBook.php — 主要的 MonoBook 皮膚代碼
MonoBook.deps.php — 對(duì) PHP V5 的 APC opcode 緩存內(nèi)的 bug 的修復(fù)
monobook/ — 支持的 CSS 和圖片
皮膚的命名約定非常嚴(yán)格,要求必須是 SkinName.php、SkinName.deps.php,并且以 (小寫)作為這個(gè)支持文件夾的名稱。
在這個(gè) 文件夾內(nèi)有皮膚樣式所需的 main.css。特定于瀏覽器的樣式修復(fù)也位于此處,所以可以經(jīng)常在這里看到 FF2Fixes.css、IE6Fixes.css、Opera6Fixes.css 等。
SkinName.php 將開始于某些有用的元數(shù)據(jù)。
清單 1. MediaWiki 皮膚元數(shù)據(jù)
可以用適合于您皮膚的內(nèi)容代替上述代碼中方括號(hào)中的內(nèi)容。
接下來,需要?jiǎng)?chuàng)建 的子類并覆蓋 方法來表明您皮膚的名稱、樣式和模板。請(qǐng)記住用您皮膚的名稱替換 和 。
清單 2. 擴(kuò)展 來提供一個(gè)新皮膚
您皮膚的主要工作將位于您的 子類中。
清單 3. 大多數(shù)的工作都是在這個(gè)模板中完成的
在 子類的內(nèi)部,通過覆蓋這些方法,可以隨心所欲地格式化和樣式化類別列表和交叉引用等。這個(gè)類的 方法將整個(gè)頁(yè)面布局為一個(gè) XHTML 文檔,讓您得以完全控制頁(yè)面的組織和樣式化。
在這里,您不能進(jìn)行 XHTML 和 CSS 頁(yè)面的布局和樣式化,但可以先看一下您 MediaWiki 的 skins 文件夾內(nèi)的示例并立即嘗試。
MediaWiki 內(nèi)的特殊頁(yè)是按需生成的,目的是做某些特定的并且對(duì) wiki 可能有用的事情,比如讓您編輯系統(tǒng)范圍的消息文本、列出所安裝的擴(kuò)展或獲得外部鏈接的列表。
除非特別指定,否則特殊頁(yè)將對(duì)所有人可用并會(huì)出現(xiàn)在 特殊頁(yè)列表內(nèi)。此外,還可以設(shè)置特殊頁(yè)以便使用 語(yǔ)法就能將它包含在頁(yè)面上。
與其他的擴(kuò)展類似,特殊頁(yè)也作為一個(gè)目錄安裝在 extensions 文件夾內(nèi)。它們通常包含如下 4 個(gè)文件:
specialpage/specialpage.php — 擴(kuò)展的設(shè)置文件
specialpage/specialpage.aliases.php — 特殊頁(yè)名稱的別名
specialpage/specialpage.body.php — 特殊頁(yè)的主要代碼
specialpage/specialpage.i18n.php — 特殊頁(yè)的國(guó)際化字符串
例如,如果要?jiǎng)?chuàng)建一個(gè)名為 CHStats 的特殊頁(yè),那么它的布局將類似于圖 3。
圖 3. Eclipse 內(nèi)的 CHStats
CHStats.php 內(nèi)的代碼會(huì)為此擴(kuò)展添加更多的功能,注冊(cè)別名、主體和 i18n 文件并告訴這個(gè) wiki 引擎在需要時(shí)自動(dòng)加載 類。
清單 4. 設(shè)置 CHStats 特殊頁(yè)
在 CHStats.body.php 內(nèi),創(chuàng)建一個(gè)新類 ,這個(gè)新類擴(kuò)展了 類。在這個(gè)構(gòu)造函數(shù)內(nèi),初始化父類,然后通過調(diào)用 加載國(guó)際化消息。有關(guān) 類構(gòu)造函數(shù)(利用它可限制訪問、隱藏頁(yè)面等)的更多信息,請(qǐng)查閱特殊頁(yè)開發(fā)指南頁(yè)面。
覆蓋 方法是為了生成這個(gè)頁(yè)面。
清單 5. 生成 CHStats 特殊頁(yè)
在 方法內(nèi), 參數(shù)是子頁(yè)面。例如,如果加載 , 將會(huì)被設(shè)為 。
首先,您使用 方法來設(shè)置頁(yè)面 header,然后調(diào)用 來編寫某些 markup 到輸出流。您還能夠使用 來直接編寫格式化了的 HTML ,但我在輸出中使用了 wiki markup。有關(guān)的更多信息以及如何向特殊頁(yè)正確添加 wiki markup 和/或 HTML,請(qǐng)查閱特殊頁(yè)開發(fā)指南。
CHStats 頁(yè)使用了 函數(shù)來獲得對(duì)數(shù)據(jù)庫(kù)的一個(gè)引用(使用 DB_SLAVE 進(jìn)行只讀操作,使用 DB_MASTER 進(jìn)行寫操作)。然后從 site_stats 數(shù)據(jù)庫(kù)選擇幾個(gè)字段并使用 wiki markup 將結(jié)果格式化為項(xiàng)目符號(hào)格式的列表。
此特殊頁(yè)的輸出將類似于圖 4。
圖 4. 實(shí)際運(yùn)行中的 CHStats
CHStats.i18n.php 內(nèi)的國(guó)際化字符串包含一個(gè)數(shù)組,針對(duì)每個(gè)受支持語(yǔ)言(在本例中為英語(yǔ)、法語(yǔ)、德語(yǔ)和西班牙語(yǔ))各有一項(xiàng)。每一項(xiàng)中都有一個(gè)數(shù)組,將字符串 IDs 映射到它們的本地文本(希望如此)。法語(yǔ)、德語(yǔ)和西班牙語(yǔ)的翻譯是利用 Google Translate 完成的。
CHStats.aliases.php 具有一個(gè)類似的數(shù)組,包含了 CHStats 頁(yè)面名稱本身的本地化版本。這可讓法國(guó)用戶(比如)以 訪問此頁(yè)面。
擴(kuò)展 MediaWiki 的另一個(gè)流行的方式是向 markup 添加對(duì)新 XML 標(biāo)記的支持。這些標(biāo)記可以基于標(biāo)記的屬性或內(nèi)容生成不同的輸出并且對(duì)于插入內(nèi)聯(lián) HTML 甚至大塊的格式化了的輸出非常有用。
Tag 擴(kuò)展安裝于 extensions 文件夾內(nèi)的其自己的目錄,并使用在本文開始時(shí)給出的這三個(gè)文件約定。讓我們來看由我虛構(gòu)的一個(gè)名為 CHUser 的簡(jiǎn)單擴(kuò)展:
CHUser/CHUser.php — 擴(kuò)展設(shè)置
CHUser/CHUser.body.php — 主要的擴(kuò)展代碼
CHUser/CHUser.i18n.php — 國(guó)際化數(shù)據(jù)
CHUser.php 內(nèi)進(jìn)行的擴(kuò)展設(shè)置類似于我們已經(jīng)看到過的那些,只不過這里使用了 數(shù)組來向 列表添加此擴(kuò)展的 方法。首次使用時(shí),將會(huì)調(diào)用 。
清單 6. 設(shè)置標(biāo)記擴(kuò)展
在 CHUser.body.php 內(nèi), 方法注冊(cè)了兩個(gè)標(biāo)記: 和 (參見清單 7)。這個(gè)擴(kuò)展可在一個(gè)擴(kuò)展內(nèi)提供兩個(gè)不同的標(biāo)記。如果愿意,可以輕松組合本文中討論的所有擴(kuò)展,這里并沒有任何拆分開來的要求(除非您自己愿意)。
清單 7. 注冊(cè) 和 標(biāo)記
只要 wiki markup 引擎遇到一個(gè) 標(biāo)記,它就會(huì)調(diào)用 方法,而 標(biāo)記將會(huì)調(diào)用 。
呈現(xiàn)方法選擇指定的用戶全名和電子郵件地址,并將其格式化成圍繞用戶全名(如果有的話)的 鏈接的形式。從清單 8 可以看出大多數(shù)的邏輯只是為了處理在數(shù)據(jù)庫(kù)中未出現(xiàn)用戶全名或電子郵件地址的情況(比如我的 wiki 上的 Admin 帳戶)。
清單 8. 處理
清單 9 顯示了 標(biāo)記是如何使用其 ID 屬性鏈接到 MediaWiki Bugzilla 數(shù)據(jù)庫(kù)內(nèi)的一個(gè)指定的 bug 報(bào)告的。它展示了處理外部的數(shù)據(jù)資源是多么地容易。如果想要更為花哨一點(diǎn),可以使用 Ajax 加載這個(gè) bug 報(bào)告,而不是只鏈接到此報(bào)告,并進(jìn)而顯示報(bào)告的某些數(shù)據(jù),而不是僅顯示鏈接。
清單 9. 到 MediaWiki Bugzilla 的 鏈接
在圖 5 中可以看到實(shí)際運(yùn)行中的這兩個(gè)標(biāo)記。
圖 5. 實(shí)際運(yùn)行中的擴(kuò)展
清單 10 向您顯示了對(duì)于頁(yè)面的該部分,這個(gè) wiki markup 看起來是什么樣子的。
清單 10. 這個(gè) wiki markup 展示了這些擴(kuò)展
正如從 擴(kuò)展中看到的,添加對(duì)定制 XML 標(biāo)記的支持很簡(jiǎn)單,幾乎可隨意添加。所有的 PHP 特性和 MediaWiki 服務(wù)均可用,所以您可以從外部系統(tǒng)拉出(或向外部系統(tǒng)發(fā)送)數(shù)據(jù),基于當(dāng)前用戶的憑證和權(quán)限更改您的行為或插入 JavaScript 以便直接在查看者的瀏覽器內(nèi)運(yùn)行任務(wù)??赡苄院芏啵皇芟抻谀囟ǖ男枰托枨?。
在本文中,向您介紹了幾個(gè)受 MediaWiki 支持的擴(kuò)展技術(shù),MediaWiki 是一種開源的 wiki 系統(tǒng),類似于商業(yè)的 wiki 軟件,比如 Lotus? Connections。
您看到了 MediaWiki 的擴(kuò)展約定,作為編寫 MediaWiki 擴(kuò)展的一個(gè)簡(jiǎn)單介紹,我還向您展示了如何創(chuàng)建一個(gè)簡(jiǎn)單的 wiki 變量擴(kuò)展。之后對(duì) MediaWiki 的皮膚特性的概覽可幫助您開始創(chuàng)建您自己的定制站點(diǎn)布局。
特殊頁(yè)面常用來生成信息,不管信息是從數(shù)據(jù)庫(kù)還是其他資源檢索而來,在本文中就制作了一個(gè)特殊頁(yè)來顯示系統(tǒng)的某些統(tǒng)計(jì)信息。然后創(chuàng)建了幾個(gè)定制 XML 標(biāo)記,可包含在任何頁(yè)面的 wiki markup 內(nèi)。
下載本文源碼
發(fā)布于2023-03-16