Php 分离Drupal模块逻辑和UI
我编写了一个D6模块,它为用户提供了通信、配置参数和测试第三方API服务的能力。Php 分离Drupal模块逻辑和UI,php,drupal,drupal-6,drupal-modules,Php,Drupal,Drupal 6,Drupal Modules,我编写了一个D6模块,它为用户提供了通信、配置参数和测试第三方API服务的能力。 该模块按预期工作,但我想分离communicator类并将其捆绑为foo模块。然后将其余部分(管理页面)打包为FooUI模块。就像视图和视图ui一样。 我不知道这样做的最佳实践/设计模式是什么。有什么想法吗?没有简单的答案。您需要强制将功能与用户界面分离。因此,您需要将程序的所有API放在一个模块中,将用户界面放在另一个模块中。使用模块为您的API编写测试用例。通过编写测试用例,您将成为API的“消费者”。事实上,
该模块按预期工作,但我想分离communicator类并将其捆绑为foo模块。然后将其余部分(管理页面)打包为FooUI模块。就像视图和视图ui一样。
我不知道这样做的最佳实践/设计模式是什么。有什么想法吗?没有简单的答案。您需要强制将功能与用户界面分离。因此,您需要将程序的所有API放在一个模块中,将用户界面放在另一个模块中。使用模块为您的API编写测试用例。通过编写测试用例,您将成为API的“消费者”。事实上,您可以将UI的实现延迟足够长的时间,以确保在负责“核心”功能的模块中拥有正确的函数/类集 此外,您还应该探索该模块。它提供了一些有用的工具,比如能够制作可导出的东西等等 Drupal没有像Java或C#这样丰富的书籍形式的文献。但PHP确实如此。查看有关PHP设计模式的书籍。虽然我还没有读过它,但曼宁的《PHP在行动》似乎有很多东西都是关于你所要求的东西的
做这些事情的另一种方法是看看别人是怎么做的。imagecache模块足够小,它将UI与功能分开(您需要启用一个单独的imagecache UI模块)。为什么不实际探索imagecache的源代码呢?[Views是1 MB+的源代码,所以现在探索它可能不是一个好主意:-)正如我所知,没有特定的模式,但始终存在一个问题: --为什么我要将模块的逻辑和UI分为多个模块?真的需要吗 只有当您开发了一个模块,可以像和一样接受不同的UI时,才需要它。海事组织没有其他理由这样做 好的,假设我们的模块需要
\u ui
东西。在这里,我尝试将模块的核心功能与其配置UI分开作为一个示例。看一看,这是一个非常小和简单的模块,适合我们的情况。这是$tree./unfuddle\u 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\u api.install
不安装任何架构,而是在模块卸载时使用variable\u del()
执行hook\u uninstall()
删除一些变量。这些变量实际上是API连接参数,将在模块的管理页面中设置,您的模块中可能也会有一些参数。在我看来,这是要迁移到
unfuddle\u api\u ui
模块的一部分
文件unfuddle_api.classes.inc
是的api包装类,它不知何故是包装在类中的第三方代码,将用于实例化对象。海事组织,这应保留在核心模块中。但是为了便于设计,我们必须通过删除
variable\u get()
调用并直接将传递的参数设置为类属性来更改构造函数方法。我们稍后将在.module
文件中添加它们
文件unfuddle\u api.module
包含主模块代码,hook\u perm()
的一个实现加上一个用于hook\u menu()
以创建管理页面和名为unfuddle\u api\u create()的帮助函数
它是从Unfuddle
类创建对象的一个助手,该类在Unfuddle\u api.classes.inc
中编码
IMO两个钩子实现都应该移植到\uUI
模块。此外,上文讨论的unfuddle\u api.classes.inc
中删除的变量\u get()
部分应添加到unfuddle\u api\u create()
函数中
因此,作为一个概要:我们有一个unfuddle_api
模块,它充当unfuddle
api类的包装器。它为我们提供了所有功能,但没有配置UI。所有配置都应通过代码中的unfuddle\u api\u create()
模块进行设置。此外,我们还获得了一个
unfuddle\u api\u ui
模块,该模块依赖于unfuddle\u api
模块,如果启用,将为我们提供ui中的核心模块配置
希望它有帮助。对于不使用UI offten的模块也很有用。禁用UI可以节省一些资源。
我建议您以imagecache模块为例进行检查 谢谢,我已经为API及其包装器编写了测试用例,它们是模块的核心功能。我认为有一个特定的模式来分离Drupal模块的逻辑和ui。再次感谢。曼宁回答+1和“PHP在行动”回答+1。我还推荐Zandra的第二版PHP对象、模式和实践