logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动

Drupal 7 模块由哪些部分组成?

14/10/2025, by Ivan

在开始创建我们的模块之前,我还要简单介绍一下 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.infositemade.module

Drupal 模块

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 上传识别

现在,我们的模块应该会出现在模块管理页面中,让我们启用它:

Drupal 模块列表

启用模块后,我们就可以开始添加代码了。接下来,我们尝试移除用户页面上的文本区块“History(历史)”:

Drupal 区块

首先,我们需要了解其工作原理,这里将使用 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 缓存,这是让新钩子生效所必需的。现在,你会在页面顶部看到一堆文字:

Drupal module

实际上,这些内容就是钩子 hook_user_view 提供的 $account 数组。print_r 函数将该数组直接输出到页面。如果你使用的是 Mozilla Firefox(我推荐它进行网站开发),可以按 Ctrl+U 查看页面源代码,就能看到数组的完整结构。

Drupal account

请注意其中的 uidname 字段,它们分别表示用户 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 编程教材 中进一步了解。