如果说节点是Drupal的内容单元,那么模块(Module)就是Drupal的功能单元。每个模块为Drupal提供一个或多个完整的功能。上文提到的“节点”管理,还有评论管理、用户管理等功能,都是由模块提供的。
一 个模块是由一组脚本文件组成的,它用于扩展Drupal的功能。核心模块和核心可选模块是包含在Drupal安装包里的,不需要单独下载。在后台管理的 “模块管理(Module)”列表中可以看到当前系统可开启的全部模块及状态。第三方模块是由除Drupal开发团队外的开发者开发的,基本上都发布在 http://drupal.org/project/modules中,提供了从内容发布、显示、用户管理、分类等各种各样的模块,而且都是免费和开源 的。
除了直接使用核心模块和第三方模块,也可以使用Drupal API开发自定义模块。Drupal模块的核心机制是钩子函数,通过调用它可以实现对Drupal工作流程的修改。比如创建一个新的系统路径来展示自定义 页面,就需要菜单的钩子函数(hook_menu)来完成。
Drupal使用了“反向控制(inversion control即IoC)”的设计模式,使系统可以在“需要时”加载相关的模块。IoC也被称为是“依赖注入(Dependency Injection)。它的原理简单地讲就是:每个模块只实现自己的功能,何时被调用是由系统决定的。比如一个订单系统,当订单被支付时需要执行一系列操 作。每一个操作是由一个独立的模块来实现的。如果按照传统的系统架构,应该预先定义一段代码使用相关的类或函数完成订单支付后处理的工作流。但在模块化的 架构中,可以安装很多用于对订单支付后进行处理的模块。这些模块通过配置文件让系统得知其存在,并且通过某种接口方式让系统知道应调用哪些方法。那么,系 统在获知订单被支付后,就可以触发这些方法的执行。在Drupal中,模块的注册是由.info文件来实现的,而何时调用哪种方法是通过钩子函数来“通 知”系统的。
图3-2展示了系统中的模块层次结构。最底层的是Drupal框架,它提供了模块机制;上层是Drupal的五个核心 模块:节点模块(Node)、用户模块(User)、系统配置模块(System)、内容过滤器模块(Filter)和区块模块(Block)。再上层是 第三方模块,是由开发ac者使用Drupal框架和五大核心模块提供的API开发的。
图3-2 Drupal的模块架构图