首頁‎ > ‎電子期刊‎ > ‎Semantic MediaWiki‎ > ‎

擴充MediaWiki功能,大局觀


前言

在本文中分享如何擴充MediaWiki功能,一個好的軟體設計要能易於擴充是很重要的事,未來的軟體開發,除了軟體本身功能強大,更重要的是能否成為一個軟體平台,能夠吸引更多人來參與,以形成一個社群持續加強軟體的功能。

筆者會撰寫這篇還有一個原因,現在網路服務越來越發達,我們會把許多常用甚至是機密的資料放置於特定的網路服務上,例如使用GMail來收發郵件、使用Flickr來存放圖片、使用黑米來放置個人書籤;高度依賴網路服務的結果要是這些公司對於穩私權的規定不夠完善或落實,伺服器不夠穩定或是被網路攻擊,那麼我們的日常生活及工作可能會因此停擺或蒙受損失。

最近一部片子終極警探4.0-網災來襲就是在談類似的議題;筆者並不是反對使用網路服務,本身也是上述網路服務的愛好者,但是我們應該去思考要是沒有這些網路服務的情況我們的生活及工作是否還能繼續運作正常。

我推薦將Wikipeida背後的軟體MeidaWiki當做個人或組織的知識管理系統有幾點原因:

  1. 所有Wikipeida系列的文章達到1000萬左右的條目,英文Wikipedia達到200萬條目,對於如此龐大數量的文章能支撐其背後的軟體想必有一定的穩定性;用來做個人或組織知識管理相信也足夠。
  2. Wikipeida背後的MeidaWiki軟體是用開放源碼的方式發行且有著活躍的社群在維護,大約每三個月就會釋出新的版本;並且許多加值的應用不斷被開發出來。

目前Wikipeida是Alexa流量統計前幾名唯一屬於公益性質的網站,其他皆是商業性的公司。


本文是對上述想法的具體回應,希望未來的知識管理或是網路服務能達到以下要求:

  1. 網路服務有著龐大的使用者(流量),並且能夠取得網路服務的源始碼,並不一定要用GLP條款發行,但至少不會有很高的取得成本。
  2. 有著活躍的開發社群,不斷的針對軟體本身進行加強並且也有前膽性的模組不斷被開發出來。

從另一個開放源始碼的角度來看,雖然MoodleJoomla也 是開放源始碼,但是筆者並沒有想大力推廣及使用,主要的關鍵是這些開放源碼軟體重點在於軟體,並非開始以形成一個廣大的使用者社群為目標;唯一能結合廣大 的社群使用者及內容,並且背後軟體是以開放源碼發行的,目前筆者只有看到MeidaWiki軟體,若讀者有看到其他Web 2.0的服務並且開放源碼的並請不吝來信告知

回文本文主題,本文適合給有架過MeidaWiki軟體並且想深入瞭解其內部架構或是想擴充其功能的讀者;若是您剛考慮想架設,可以參考筆者撰寫的MediaWiki網站架設心得MediaWiki網站架設設定MediaWiki網站架設進階設定

MediaWiki架構大局觀

本節從一個比較大的角度來看MediaWiki的設計,下面所探討每個主題都可以再撰寫專文深入探討,主要本節是想給讀者有個大局觀,在深入這些主題時不會見樹不見林。

程式碼檔案架構

底下針對MeidaWiki檔案目錄的部份做說明,至於每個目錄下有哪些重要的檔案則需再專文討論。

名稱 說明
math 存放解析數學公式的程式碼,一般而言不會接觸到,但若是數學公式功能無法成功安裝,可藉由目錄下的資訊來除錯。
bin 存放在開發MediaWiki時會用到的批次檔,一般管理者或開發者不會接觸到。
config 存放預設的MediaWiki設定檔(LocalSettings.php),只會於安裝時接觸到。
docs 存放說明文件,對於要擴充功能的開發者很具有參考價值。
extensions 存放擴充套件之目錄,對於想要擴充功能的開發者是必須要瞭解的目錄。
images 存放檔案以及圖片的目錄。
includes 存放主要的程式碼,要深入瞭解MediaWiki程式架構此程式碼必深入研究。
languages 存放各種語系的翻譯檔案。
maintenance 存放維護程式碼,例如資料庫SQL指令、升級程式碼。
skins 存放佈景主題程式碼,可用來修改軟體外觀。

可以撰寫哪些擴充功能?

MediaWiki對於想要擴充其功能的開發者,已經有規劃一些方法讓開發者使用,介紹如下:

名稱 用途
Tag Extension 擴充MediaWiki語法,用XML格式來方式,其語法為<語法名稱 參數一="參數值" 參數二="參數值">傳入內容</語法名稱> ;Tag Extension傳回內容只能是Wiki所接受的HTML語法。
Parser Function 擴充MediaWiki語法,其語法為{{ #函式名稱: 參數一 | 參數二 | 參數三 }};Parser Function傳回的內容可以是Wiki語法並且參數能夠傳入MediaWiki的變數在函式中處理,例如{{{CURRENTDATE}}}
Hook Hook可以用來欄截MediaWiki軟體中的事件,例如儲存頁面、上傳檔案、登入…等等;在使用Hook時要指定由哪個函式來執行,語法為$wgHooks['event'][] = 'function';。其中的function會根據每個Hook的不同而有不同的型式,例如傳入兩個參數或是需指定一個物件,下面為傳入兩個參數的函式範例someFunction($param1, $param2);
Special Page 在MediaWiki中有Special Page,意思是特殊頁面,例如帳號登入、網站統計、權限管理…等較特殊的功能都會在Special Page中實作。

帳號整合

MediaWiki若要與其他系統進行整合,帳號是第一步需要整合的應用系統要素,而帳號整合一直有個很響亮的名字叫做Single Sign On;大家都期待只需要記憶一組帳號密碼就可以通行無阻。

在MediaWiki中可以實作不同的帳號認證方式,其作法是實作AuthPlugin.php裡面的函式,例如筆者實作的程式碼檔案為IntelliAuthentication.php,那麼需於LocalSettings.php檔案中引用,置換掉原有帳號認證方式。

 
include_once('IntelliAuthentication.php');

$wgAuth = new IntelliAuthenticationPlugin();

資料表架構

要瞭解一個系統的架構,資料庫表格是必需深入的部份,本小節列出MediaWiki重要的表格並加以簡述給讀者參考,在往後的文章會詳細針對每個表格裡的重要欄位進行說明,目的是可以針對需求下SQL指令取出資料表格中的資料或是寫入。

頁面表格

表格名稱 表格說明
Page table 描述頁面名稱相關資訊。
Revision table 描述頁面各個版本資訊,一個頁面可以有多個版本。
Text table 用來實際儲存頁面內容,一筆Text table可對應到多個版本。
Page restrictions table 記錄頁面權限資訊,例如誰可以移動及刪除。
Archive table 記錄刪除的頁面資訊。
Image table 記錄上傳檔案資訊。
Oldimage table 記錄舊版的上傳檔案資訊,其中舊版檔案放置於/image/archive目錄。
Filearchive table 記錄刪除的檔案資訊,必須要將$wgFileStore參數啟動才會記錄。
Math table 記錄數學公式相關資訊,主要為原始的數學公式語法及解析後的數學公式語法。

使用者表格

表格名稱 表格說明
User table 描述使用者資訊。
User groups table 描述使用者對應的群組,主要為管理員及行政管理員。
User newtalk table 記錄誰在使用者討論頁面留言,系統傳遞訊息告知使用者。
Ipblocks table 記錄被封鎖的使用者或是IP位址。
Watchlist table 記錄個別使用者的觀察頁面列表。

連結表格

表格名稱 表格說明
Pagelinks table 用來儲存頁面的內部連結名稱,此內部連結頁面可能不存在。
Templatelinks table 用來儲存頁面的樣板頁面名稱。
Externallinks table 記錄頁面的外部連結。
Categorylinks table 記錄頁面的分類連結。
Imagelinks table 記錄頁面的檔案連結。
Redirect table 記錄某個頁面重新導向的連結。
Interwiki table 記錄跨MediaWiki間的連結。
Langlinks table 記錄語言連結,例如首頁/tw、首頁/jp。

系統管理表格

表格名稱 表格說明
Logging table 記錄使用者對網站的異動資訊。
Recentchanges table 記錄最近更動頁面。
Site stats table 記錄網站統計資訊。
Job table 記錄待處理工作。
Searchindex table 搜尋索引。

資料匯出匯入

若要將MediaWiki軟體做為個人或組織的知識管理軟體,資料能夠匯出及匯入與其他系統或資料來源整合是很重要的,底下是幾個方式:

方法 說明
用頁面Special:ExportSpecial:Import進行匯出及匯入 這是MediaWiki內建所提供的方式,好處是一般使用者即可進行匯出及匯入,並且能跨MeidaWiki版本使用。
直接存取資料庫 這個方法相當直接,彈性也相當大;不過必須要對資料表結構相當瞭解。
使用MediaWiki的API來存取資料 在MediaWiki設定檔當中有兩個參數$wgEnableAPI=true;$wgEnableWriteAPI=false;若設為true即可使用外部程式來存取如頁面資料,在寫入的部份則尚未實作,讀者可以參考Wikipedia API來看實際的範例,其中用目前熱門的RSET概念來實作API。

結語

在本文中分享了要如何廣充MediaWiki的功能,比較屬於觀念性的探討,在往後的文章我們會針對其中的每個主題再進行深入探討。


Comments