分离Drupal模块逻辑和UI

时间:2010-10-12 09:27:52

标签: php drupal drupal-6 drupal-modules

我写了一个D6模块,它为用户提供了沟通,配置参数和测试第三方API服务的能力。
该模块按预期工作,但我想分离通信器类并将其捆绑为foo模块。然后将其余部分(管理页面)打包为foo-ui模块。就像观点和观点一样 - ui 我不知道这样做的最佳实践/设计模式是什么。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

据我所知,没有特定的模式,但总有一个问题:

  

- 为什么要将模块的逻辑和UI分成多个模块?这真的需要吗?

     

只有在您开发了可能接受viewssimple views之类的不同用户界面的模块时,才需要这样做。国际海事组织没有其他理由这样做。

好的,假设我们的模块需要_ui的东西。在这里,我尝试将模块的核心功能及其配置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_perm()的实现加上hook_menu()的实现以创建管理页面和名为unfuddle_api_create()的辅助函数,这是某种方式一个Factory帮助器,用于Unfuddle中编码的unfuddle_api.classes.inc类创建对象 IMO两个钩子实现都应该移植到_ui模块。此外,上面讨论的variable_get()已移除的unfuddle_api.classes.inc部分也应添加到unfuddle_api_create()函数中。

所以,作为大纲:我们有一个unfuddle_api模块,它充当Unfuddle API类的包装器。它为我们提供了所有功能,但没有配置UI。所有配置都应通过代码中的unfuddle_api_create()模块进行设置 我们还有一个unfuddle_api_ui模块,该模块依赖于unfuddle_api模块,如果启用,将为我们提供UI中的核心模块配置。

希望它有所帮助。

答案 1 :(得分:2)

对于不经常使用UI的模块也很有用。禁用UI可节省一些资源。 我建议您查看imagecache模块作为示例。 http://drupal.org/project/imagecache

答案 2 :(得分:1)

没有简单的答案。您需要从用户界面您自己强制执行功能分离。因此,您需要将程序的所有API放在一个模块中,将用户界面放在另一个模块中。使用simpletest模块为您的API编写测试用例。通过编写测试用例,您将成为API的“使用者”。实际上,您可以延迟UI的实现,以确保您在模块中具有负责“核心”功能的正确函数/类集。

您还应该浏览CTools模块。它提供了一些有用的工具,比如能够制作出口等等。

Drupal没有像Java或C#这样的书籍形式的大量文献。但PHP确实如此。查看有关PHP设计模式的书籍。虽然我还没有读过它,但Manning的“PHP in action”似乎在你所要求的东西上有很多东西。

另一种做这种事情的方法是看看其他人是如何做到的。 imagecache模块足够小,它将UI与功能分开(您需要启用单独的Imagecache UI模块)。为什么不实际探索imagecache的源代码? [视图是1 MB +源代码,所以探讨它可能不是一个好主意: - )]