2010-10-12 75 views
3

我寫了一個D6模塊,它爲用戶提供了溝通,配置參數和測試第三方API服務的能力。
該模塊按預期工作,但我想分開communicator類並將其捆綁爲foo模塊。然後將其餘(管理頁面)作爲foo-ui模塊打包。就像意見和觀點一樣。
我不知道什麼是最佳做法/設計模式。任何想法?分離Drupal模塊邏輯和UI

回答

2

據我所知,目前還沒有具體的模式,但始終有一個問題:

- 爲什麼我應該將模塊的邏輯和用戶界面分成多個模塊?這真的需要嗎?

它的需要,只有當你已經開發出可以接受不同的UI就像viewssimple views的模塊。海事組織沒有其他理由這樣做。

好的,假設我們的模塊需要_ui的東西。在這裏,我嘗試將模塊的核心功能與其配置用戶界面分開來作爲示例。看看Unfuddle API module,這是一個非常小巧,簡單的模塊,適合我們的案例。這裏是$ tree ./unfuddle_api

unfuddle_api/ 
|-- LICENSE.txt 
|-- README.txt 
|-- unfuddle_api.classes.inc 
|-- unfuddle_api.info 
|-- unfuddle_api.install 
|-- unfuddle_api.module 

0 directories, 6 files 

閱讀它的代碼! unfuddle_api.install不安裝模式,但實現hook_uninstall()刪除模塊卸載中使用variable_del()幾個變量。這些變量實際上是將在模塊的管理頁面中設置的API連接參數,您的模塊中也可能有一些參數。
IMO這是要遷移到unfuddle_api_ui模塊的部分。

文件unfuddle_api.classes.incunfuddle的API包裝類,它以某種方式包裝在將用於實例化對象的類中的第三方代碼。
IMO應該保留在覈心模塊中。但爲了設計起見,我們必須通過刪除variable_get()調用並將傳遞的參數直接設置爲類屬性來更改構造方法。我們稍後將在.module文件中添加它們。

文件unfuddle_api.module包含主模塊代碼,hook_menu()hook_perm()加一的實現,創建管理頁面,並命名爲unfuddle_api_create()一個輔助功能,這是莫名其妙地Factory助手來創建Unfuddleunfuddle_api.classes.inc編碼的對象。
國際海事組織兩個掛鉤實施應移植到_ui模塊。上面討論的unfuddle_api.classes.inc的部分variable_get()部分也應該加入unfuddle_api_create()功能

所以,作爲一個提綱:我們有一個unfuddle_api模塊,它充當Unfuddle API類的包裝。它爲我們提供了所有功能,但沒有配置UI。所有配置都應通過代碼中的unfuddle_api_create()模塊進行設置。
我們還得到了一個unfuddle_api_ui模塊,該模塊取決於unfuddle_api模塊,如果啓用,將爲我們提供UI中的核心模塊配置。

希望它有幫助。

1

有沒有簡單的答案。您需要強制與用戶界面分開功能。因此,您需要將程序的所有API放在一個模塊中,並將用戶界面放在另一個模塊中。爲您的API編寫測試用例 - 使用simpletest模塊。通過編寫測試用例,您將成爲API的「消費者」。實際上,您可以延遲UI的實現足夠長的時間,以確保在模塊中具有負責「核心」功能的正確的一組函數/類。

你也應該探索CTools模塊。它提供了一些有用的工具,如能夠導出等等。

Drupal沒有像Java或C#這樣的書籍形式的豐富文獻。但PHP呢。查看關於PHP設計模式的書籍。雖然我還沒有讀過它,但Manning的「PHP in action」似乎對你所要求的東西有很多東西。

做這種事情的另一種方法是看別人是如何做到的。 imagecache模塊足夠小,它將UI和功能分開(還有一個獨立的Imagecache UI模塊需要啓用)。爲什麼不實際探索imagecache的源代碼? [查看爲1 MB的+源代碼,因此它可能不是一個好主意,探索,只是還沒有:-)]

+0

謝謝,我已經爲API和它的包裝器編寫了測試用例,它們是模塊的核心功能。我認爲有一個特定的模式來分離Drupal模塊的邏輯和用戶界面。再次感謝你。 – 2010-10-12 10:40:05

+0

+1和Manning的「PHP in Action」。我也推薦PHP對象,模式和實踐,第二版by Zandra – 2010-10-12 13:26:12

2

對於不使用UI關閉的模塊也是有用的。禁用UI可保存一些資源。 我建議你檢查imagecache模塊作爲例子。 http://drupal.org/project/imagecache

+2

好的例子在這裏! – sepehr 2010-10-13 23:44:44