我写了一个D6模块,它为用户提供了沟通,配置参数和测试第三方API服务的能力。
该模块按预期工作,但我想分开communicator类并将其捆绑为foo模块。然后将其余(管理页面)作为foo-ui模块打包。就像意见和观点一样。
我不知道什么是最佳做法/设计模式。任何想法?分离Drupal模块逻辑和UI
回答
据我所知,目前还没有具体的模式,但始终有一个问题:
- 为什么我应该将模块的逻辑和用户界面分成多个模块?这真的需要吗?
它的需要,只有当你已经开发出可以接受不同的UI就像views和simple 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.inc
是unfuddle的API包装类,它以某种方式包装在将用于实例化对象的类中的第三方代码。
IMO应该保留在核心模块中。但为了设计起见,我们必须通过删除variable_get()
调用并将传递的参数直接设置为类属性来更改构造方法。我们稍后将在.module
文件中添加它们。
文件unfuddle_api.module
包含主模块代码,hook_menu()
的hook_perm()
加一的实现,创建管理页面,并命名为unfuddle_api_create()
一个辅助功能,这是莫名其妙地Factory助手来创建Unfuddle
类unfuddle_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中的核心模块配置。
希望它有帮助。
有没有简单的答案。您需要强制与用户界面分开功能。因此,您需要将程序的所有API放在一个模块中,并将用户界面放在另一个模块中。为您的API编写测试用例 - 使用simpletest模块。通过编写测试用例,您将成为API的“消费者”。实际上,您可以延迟UI的实现足够长的时间,以确保在模块中具有负责“核心”功能的正确的一组函数/类。
你也应该探索CTools模块。它提供了一些有用的工具,如能够导出等等。
Drupal没有像Java或C#这样的书籍形式的丰富文献。但PHP呢。查看关于PHP设计模式的书籍。虽然我还没有读过它,但Manning的“PHP in action”似乎对你所要求的东西有很多东西。
做这种事情的另一种方法是看别人是如何做到的。 imagecache模块足够小,它将UI和功能分开(还有一个独立的Imagecache UI模块需要启用)。为什么不实际探索imagecache的源代码? [查看为1 MB的+源代码,因此它可能不是一个好主意,探索,只是还没有:-)]
对于不使用UI关闭的模块也是有用的。禁用UI可保存一些资源。 我建议你检查imagecache模块作为例子。 http://drupal.org/project/imagecache
好的例子在这里! – sepehr 2010-10-13 23:44:44
- 1. 如何分离模型(业务逻辑和商店逻辑)?
- 2. 从Backbone.Device分离模板逻辑
- 3. 如何在我的Android游戏中分离UI和逻辑?
- 4. 将socket.io事件逻辑分离到模块中
- 5. PHP:分离业务逻辑和表达逻辑,值得吗?
- 6. 分离逻辑/ GUI和用户交互
- 7. 分离业务逻辑
- 8. 业务逻辑分离
- 9. 在express/node.js中分离模型,逻辑和DAO
- 10. PyroCMS模块升级逻辑
- 11. 模块分离
- 12. 我该如何分离Android中的逻辑/ UI
- 13. 模型逻辑和服务层逻辑
- 14. 在Angular2,如何去耦UI模块与逻辑
- 15. 什么是分离UI(设计/编辑)从包框架(如Visual Studio包)逻辑
- 16. statsmodel部分逻辑模型
- 17. 物理或逻辑分离我的dll?
- 18. C#DAL与PL逻辑分离
- 19. 从java中的GUI中分离逻辑
- 20. 从逻辑中分离数据
- 21. JSP - 从逻辑中分离设计
- 22. 如何分离业务逻辑
- 23. 数据建模问题 - 数据和计算和访问逻辑的分离
- 24. 实现现有的SuiteCRM模块的逻辑和编辑
- 25. 任何人都可以提出设计模式来分离JavaScript中的业务逻辑和表示逻辑吗?
- 26. jquery-ui-timepicker&drupal的editablefields模块
- 27. 如何分离Drupal中的博客模块?
- 28. F#和模糊逻辑
- 29. 模块化功能背后的逻辑
- 30. AngularJS模块注入逻辑了解
谢谢,我已经为API和它的包装器编写了测试用例,它们是模块的核心功能。我认为有一个特定的模式来分离Drupal模块的逻辑和用户界面。再次感谢你。 – 2010-10-12 10:40:05
+1和Manning的“PHP in Action”。我也推荐PHP对象,模式和实践,第二版by Zandra – 2010-10-12 13:26:12