模塊系統是drupal很重要的運作方式,drupal依靠着少少的核心程序,便能讓模塊能做到任何事情。
drupal只有21個檔案在include裏頭,每次必會loading進來,其他的全都放在modules。
也就是說,除了那幾只檔案以外,全部的東西都把他當成module在寫。諸如CMS最基本的功能,文章管理、評論、討論區、分類…等的功能,全部都寫在 module裏,include裏頭所提供的是各種api,檔案處理函式、數據庫存取、窗體生成…等等,這樣的分層,module便可以專心的開發各種功能。
當然,這樣的架構不夠令人注目。有許多web app架構,對於模塊 (module)、插件(plug-in)…等的運作,通常是讓他們各自爲政,自己幹自己的事情。多是用核心提供的object和function,加上 module自己額外的code,達到module要做到的額外功能。但是drupal的核心運作卻不是如此。
drupal處理使用的程序爲modules/user.module。如果今天想要在看用戶數據的同時,也想看看所有使用者過去發表文章的list,那該怎麼寫呢?
直接一點,更改user.modue,在顯示時,順便去文章數據庫抓相關的數據?然而這樣卻不是一個好方式,今天任何想要對用戶增加新功能的時候,都得trace一次user.module的code,看懂他在幹啥,然後把新的code安插在合適的地方… 最後可能增加user.module的複雜度,增加維護那支module的難度,共同開發時,更是一個危險的方式。
第二種方式,重寫一個新的瀏覽頁面,重新寫一個SELECT的語句,讓SELECT的時候除了用戶信息,也把文章數據一起抓出來,然後顯示到不同的頁面。但是這樣很浪費,明明跟user.module重複的功能達到一半以上,那是不是之後要新增功能,都得重寫一次呢?
上面兩種方式在drupal中也都可以達成,然而熟悉Drupal的人卻不會如此。Drupal的開發者很聰明,他的模塊系統(module system)考慮到了模塊再利用這一點,每個模塊都視爲可以再利用的資源,只要寫module的人想寫,透過模塊系統便可以跟所有的module交互作用。
第三種方式以modules/user.module爲例,他即是處理包含新增、修改、刪除、註冊、登入….等所有與用戶相關的功能。在進行每個重要的功能時,user.module都會呼叫一個函式去掃所有的module,看看是否有其他的module要在user.module進行此動作時,也進行一些其他想要做的事情,這就是drupal重要的Hook System。
example:
在drupal user.module裏頭可以找到如下的程序代碼
function user_view($uid = 0) {
// … skip
// moudle_invoke掃描所有的module
// 看看有沒有modulename_user這個function
// 有個話就看’view’這個功能的部份要加上什麼
foreach (module_list() as $module) {
if ($data = module_invoke($module, ‘user’, ‘view’, ”, $account)) {
// do something…
}
}
// … skip
}
所以,第三種方式,不用重寫,也不用改到user.module,只要自己新增module和寫一個function,便可以輕鬆讓瀏覽用戶信息時,加上過往文章。
example:
新增自己的module,與hook system緊密運作
新增sample.module
function sample_user($type, &$edit, &$user, $category = NULL) {
if ($type == ‘view’) {
return /*過往文章,型別爲一數組*/;
}
}
這就是drupal把衆多主要功能都寫成module的原因,讓所有模塊之間都可以交互利用,或是寫給別人利用,或是利用別人的module,像積木一樣推砌成想要的功能,卻又不浪費資源