Drupal 7 模块由哪些部分组成?
在开始创建我们的模块之前,我还要简单介绍一下 Drupal API 的一些功能。API 提供了强大的功能,用于处理分类(Taxonomy)、节点(Node)、用户(User)、数据库的输入和输出等。为了让模块与 Drupal 核心以及模块之间相互交互,Drupal 提供了一个“钩子(Hook)”系统。钩子是一种回调机制,也就是说,当代码执行到钩子时,会调用我们在自己模块中定义的函数,从而“插入”自定义代码。通过这种方式,我们可以处理用户数据、菜单、分类、不同内容类型的节点等。
在以下页面中:
http://api.drupal.org/api/drupal/includes--module.inc/group/hooks/7
列出了 Drupal 核心 的所有钩子。请注意,不同版本的核心中钩子列表不同。我们将要为 Drupal 7 创建模块,因此会使用适用于 7.x 的钩子。
Drupal 中的钩子 命名规则如下:
模块名_钩子名
因此,钩子定义中出现 “hook” 的地方,应替换为你的模块名称,即该钩子所属模块的名称。
首先,我们需要创建模块本身。
1. 在 sites/all/modules
目录下创建一个以模块名称命名的文件夹。我们将模块命名为 site-made。
2. 在该文件夹中创建两个文件:模块名.info 和 模块名.module。在我们的例子中,这两个文件是 sitemade.info 和 sitemade.module。
3. 现在,在 sitemade.info 文件中写入以下内容:
;$Id$ // 该注释用于方便将模块上传到 drupal.org name = Sitemade module // 模块在模块列表中的名称 package = sitemade // 模块所属的软件包名称 core = 7.x // 模块适用的 Drupal 版本 files[] = sitemade.module // 在 files 数组中列出包含 PHP 代码的文件
在 sitemade.module 文件中写入 PHP 代码的起始部分:
<?php // 此标签可以不关闭 //$Id$ // 同样添加用于 drupal.org 上传识别
现在,我们的模块应该会出现在模块管理页面中,让我们启用它:
启用模块后,我们就可以开始添加代码了。接下来,我们尝试移除用户页面上的文本区块“History(历史)”:
首先,我们需要了解其工作原理,这里将使用 hook_user_view:
http://api.drupal.org/api/drupal/modules--user--user.api.php/function/hook_user_view/7
这个钩子的作用是:当 Drupal 执行用于显示用户页面的代码时,它会调用我们模块中对应的钩子函数。在我们的模块中,我们将删除用户数据数组 $account 中的“历史”部分。打开 sitemade.module 文件,插入以下钩子代码:
function sitemade_user_view($account, $view_mode, $langcode){ print_r($account); }
保存模块文件并清除 Drupal 缓存,这是让新钩子生效所必需的。现在,你会在页面顶部看到一堆文字:
实际上,这些内容就是钩子 hook_user_view 提供的 $account 数组。print_r 函数将该数组直接输出到页面。如果你使用的是 Mozilla Firefox(我推荐它进行网站开发),可以按 Ctrl+U 查看页面源代码,就能看到数组的完整结构。
请注意其中的 uid 和 name 字段,它们分别表示用户 ID 和用户名。这些字段在创建指向用户资料页或用户创建内容的链接时非常常用。
可以看到,这里仅包含用户数据,而没有包含“History(历史)”区块的信息。我们可以尝试另一个钩子:hook_user_view_alter。
http://api.drupal.org/api/drupal/modules--user--user.api.php/function/hook_user_view_alter/7
修改模块代码如下:
function sitemade_user_view_alter($account, $view_mode, $langcode){ print_r($account); }
保存更改后,输出的数组将会不同。此时 $account 只是数组中的一个字段,而在 summary 字段中包含了“History(历史)”区块的数据。我们尝试使用函数 unset() 删除该字段:
function sitemade_user_view_alter($account, $view_mode, $langcode){ unset($account['summary']); print_r($account); }
此时,summary 字段被删除,但页面上的“历史”区块仍未消失,为什么?因为函数参数中使用的是简单的变量符号 $,意味着我们只是在本地变量 $account 上修改了数据,而并未影响实际传入的变量。要让更改生效,我们需要在变量名前添加 &(取址符),以传递引用。这样函数内部的修改就会影响到原始变量。
我们将代码修改如下:
function sitemade_user_view_alter(&$account, $view_mode, $langcode){ unset($account['summary']); print_r($account); }
保存文件并清除缓存后,“History(历史)”区块应该会消失。这个符号 & 创建了一个对变量 $account 的引用。关于 PHP 引用的更多细节,你可以在任何 PHP 编程教材 中进一步了解。