第一部分:基本模块结构
事实上,模块真正必须实现的函数只有一个,那就是hook_help()。这里我们约定在本文中对drupal的系统“钩子”我们都写为“hook_钩子名”的形式,你实现的时候的函数名实际上是“模块名_钩子名”的形式。
什么是钩子(hook)?
Drupal 是一个内容管理系统的编程框架,其核心功能已经很完备了。我们编写扩展模块时并不需要自己完成每一个功能,大多数扩展系统的方法只是按命名规则写好钩子 (Hook)的实现函数,系统就会在特定的时候来调用你的函数,这样你的扩展功能就被实现了。记住,不是你去调用系统,而是系统来调用你,我觉得这个和 Windows的消息循环是有点类似的。
Hook_help()可以告诉drupal系统模块的信息以使模块在“模块”管理页面上列出来,这样用户就可以选择是否启用或禁用此模块了。模块一但被 启用,模块文件里的全部代码都被包含到系统中,同时,模块的函数也可以调用drupal的所有可用函数和访问所有可用变量了。
下面是最简单的hook_help()写法,这里的模块文件名是example.module,模块名是example,记得在php文件要有〈?php和?〉标记在文件首尾。
function example_help($section) {
switch ($section) {
case 'admin/modules#description':
// 下面的描述会显示在admin/modules路径下的模块列表里
return t('An example module showing how to develop a module for Drupal.');
}
}
只要将包含上面函数的example.module文件放到drupal目录下的modules子目录里,访问“模块”管理页面(在admin/modules)就可以启用这个模块了,简单吧。
注:上面的返回值中我们使用了t()函数,这个函数用以实现drupal的本地化,虽然代码里是写的英文,但如果我们有对应的本地语言的翻译,用户会看到对应的本地化字符串。
现在,我们有了一个可启用/禁用的模块了,在开始为它添加功能之前,我们先了解一下Drupal的模块开发编程规范(全文见 http://cvs.drupal.org/viewcvs/*checkout*/drupal/contributions/CODING_STANDARDS.html?rev=1.1&content-type=text%2Fplain )。Drupal为了最大程度的兼容PHP的不同版本,它不使用命名空间或类的封装特性,因此,我们需要特别注意命名的问题,一般的约定是:
1)函数和方法使用小写字符,并用下划线分隔单词。函数应当使用模块名作为前缀以避免不同模块间的函数名冲突。私有的函数和方法再在名称前加一个下划线。
2)常量名完全大写,并用下划线分隔单词。前面应当加上大写的模块名前缀。
3)你定义的全局变量的名字前加上“_模块名_”前缀。
其他的约定请参见编码规范。
模块可以实现的功能很多,一般分为如下几个功能类别:
1)产生页面显示内容;
2)自定义node类型;
3)扩展现有的node类型;
4)生成定制的区块(block);
5)控制node的显示权限;
6)文件上传;
7)定制过滤器(Filter);
8)其他高级应用。
下面我们以自定义页面显示内容为例开始module开发之旅。