Drupal7模块开发 创建第一个模块

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
    <?php
    // $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);
    
下一步 编写自动测试