2010-10-12 72 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