Drupal7模块开发 系列是 由 Drupal 7 Module Development 英文版翻译过来的, 主要用于学习drupal的模块开发. 至于翻译质量, 我只能说尽力了, 大家凑活看吧, 鄙人文字功底有限. 如果有些地方真的被我翻译到误人子弟的地步, 恳请大家指正.
模块命名
Drupal的模块有两个名字,人读名与机读名.
人读名: 是由首字母大写的且用空格分开的单词组成,例如:Views, Eldorado Superfly等等.
机读名: 是由小写字母,数字和下划线组成的字符串,且不允许有其他字母.例如上面两个模块的机读名字则应该为:views和eldorado_superfly.
按照惯例这两个名字应该差不多,而且通常应该将大写祖母转化为小写字母.
模块存放位置
Drupal 的自定义模块通常是用来存放在 /sites/default/modules 文件夹下面, 这样做的好处是可以与标准模块分开,以便更容易找到自己没有整理的杂乱的代码.
Drupal中自定义模块如果放在 /sites/default 文件夹中, 只能被默认站点所加载. 这意味着, 在实践中如果把模块放在 /sites/default/modules 文件夹下,根本不会加载到其他站点中. 在这种情况下, 一般会建议把自定义模块放在/sites/all/modules/custom 这个文件夹下.
创建模块文件夹
模块可以以多种途径来进行组织, 但是实践证明, 最好的选择还是得将模块放在 /sites/defualt/modules 文件夹下,并且模块中至少得有两个文件a.info以及a.module
文件夹,以及文件夹下的.info文件和.module文件,都必须以机读名的方式来命名. 且.info和.module文件只能被设定为只读模式
编写.info文件
.info文件是为Drupal提供信息的文件. 其中的信息包括:模块人读名, 此模块所要请求的其他模块, 以及此模块提供了哪些代码文件.
一个.info文件是一个类似于.ini标准的控制文件. 在.info文件中的指令是由: 名称, 等号, 值.这三个元素组成的. 例如:name = value或者以数组的形式进行申明,例如:
name[] = value1 name[] = value2(注意,两个方括号中间没有空格)
drupal的编码规范中,在等号两端通常都有一个空格符号.
如果一个值的跨度超过一行, 那他应该被包含在一个括号之中.
在drupal的ini解释器中,任何以分号开头的代码都将作为注释,被忽略掉.编写.module文件
.module文件一般是一个包含了模块所使用的主要的钩子的PHP文件.
下面是一个简单的help钩子的代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// $Id$
/**
* @file
* A module exemplifying Drupal coding practices and APIs.
*
* This module provides a block that lists all of the
* installed modules. It illustrates coding standards,
* practices, and API use for Drupal 7.
*/
/**
* Implements hook_help().
*/
function first_help($path, $arg) {
if ($path == 'admin/help#first') {
return t('A demonstration module.');
}
}在上述代码中有以下代码规范:
- 所有的PHP 和 Javascript文件的都使用两格空格来进行缩进, tab是不允许使用在任何代码里.
- 在一个完全的PHP文件代码中,通常是省略结尾部的结束标签代码 ‘?>’. 这是要防止夹杂着的空白来打断HTTP的标头.
- Drupal 是使用 Doxygen-styel风格来注释(/* /)方法,类,界面,常亮,文件,全局文件的. #号是不允许使用在注释之中的.
- 在运算符两边必须有一个空格的.
- 所有的控制流程代码都必须包括在大括号之内.即使if的控制流程代码只有一行主体代码,也是需要用大括号包裹起来.
- 方法的命名都是用小写字母以及下划线来分割单词.
- 变量名是使用小写字母以及下划线来分割单词之间的空格的.
翻译函数
t()和翻译
翻译函数必须遵循如下写法:t('This is my string');不能以下面的方式来写:
$variable = 'This is a string'; t($variable);这是因为t()函数, 他不执行代码, 只是读取代码.
t()函数接受一个可选参数,这是个关联数组. 例如:$values = array('@user' => $username); print t('Welcome, @user', $values);这两行代码中,申明@user为占位符,值为变量
$username的值.当t()函数被调用时, $values的映射将替换掉要被翻译语句中的占位符.
如果占位符使用@符号开头, 则Drupal将在插入翻译之前, 对这个值使用check_plain()方法来进行过滤.
如果你确定你的字符串没有任何危险,则可以使用感叹号(!)开头来命名占位符.但这样做,drupal将直接插入这个值,而不进行过滤.这在不需要对你要插入的数据进行翻译的时候,是非常有用的. 像这样写:$values = array('!url' => 'http://example.com'); print t('The website can be found at !url', $values);百分号开头的占位符,可以在值插入之前进行安全过滤,并且强制值为文本类型;(用em标签包围),像这样写:
$values = array('%color' => 'blue'); print t('My favorite color is %color.', $values);