logo

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

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

演示 EBT 模块 下载 EBT 模块

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

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

演示 EPT 模块 滚动

滚动

在 Drupal 7 中操作数据库 - 第10课 - 删除查询(DELETE)

14/10/2025, by Ivan

删除查询应使用查询构造器(Query Builder)。它们从函数 db_delete() 开始:

<?php
$query = db_delete('node', $options);
?>

此删除查询将从表 node 中删除记录。请注意,无需在表名外加花括号,查询构造器会自动处理。删除查询使用 Fluent API(链式调用),即除 execute() 之外的所有方法都会返回查询对象本身(与更新 UPDATE 和插入 INSERT 查询相同)。

删除查询非常简单,仅使用 WHERE 表达式。关于 WHERE 的详细内容将在后续课程中讲解,现在我们来看一个基本的删除示例:

在 Drupal 7 中操作数据库 - 第11课 - 合并查询(MERGE)

14/10/2025, by Ivan

合并查询是一种特殊的混合类型查询。尽管这种语法在 SQL 2003 中被定义,但实际上几乎没有数据库原生支持该语法。然而,大多数数据库都提供了各自特定的替代实现。Drupal 中的合并查询构造器(Merge Query Builder)将“合并查询”的概念抽象为对象结构,这样系统可以根据不同数据库的特性分别编译对应的查询语句。

总体而言,合并查询是 INSERTUPDATE 查询的组合。如果满足某个条件(例如表中存在指定键的记录),则执行一个查询;否则执行另一个查询。大多数情况下,它等价于以下逻辑:

在 Drupal 7 中操作数据库 - 第12课 - 查询条件(WHERE、HAVING、LIKE)

14/10/2025, by Ivan

查询条件允许我们选择仅符合特定限制的记录,例如两周内创建的节点、名称中包含“Drupal”一词的术语等。在 SQL 中,我们使用 WHEREHAVING 来为 SELECT、UPDATE、DELETE 查询设置限制。在 Drupal 的动态查询中,也提供了用于处理查询条件的机制。这个机制在三种类型的查询(选择、更新、删除)中工作方式相同。

条件表达式的概念

条件包含在一个专门定义限制的表达式中。

合并(相加、并集、逻辑与)

每个条件可以由多个条件表达式组成,这些表达式可以组合在一起。条件通过运算符 AND(与)OR(或) 来连接。

条件对象

Drupal 将每个条件片段表示为 QueryConditional 类的实例。条件对象是该类的一个实例。

我们来看一个 SQL 查询示例:

查询语句:

在 Drupal 中创建模块,快速入门

14/10/2025, by Ivan

我们从 api.drupal.org 开始,打开钩子 hook_node_presave() 的页面,它会在节点(node)添加之前触发。

http://api.drupal.org/api/drupal/modules!node!node.api.php/function/hook_node_validate/7

钩子允许我们将自定义代码嵌入 Drupal 的正常执行流程中,例如添加验证、数据字段、表单元素等。

在目录 sites/all/modules 中添加我们的模块:

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 7 hook_block_info() 和 hook_block_view() 在区块中输出信息

14/10/2025, by Ivan

在上一课中,我们为 Drupal 7 创建了一个模块,而在本课中,我们将继续扩展模块的功能。我们将通过 hook_block_view()hook_block_info() 添加一个区块(block)输出。在这个区块中,将显示站点上最近注册的用户列表,并附带指向他们个人页面的链接。

我们先来看一下 hook_block_info() 的说明:

定义由模块创建的所有区块。

此钩子在 Drupal 中用于定义模块将输出哪些区块,同时还可以描述区块的显示设置。

hook_block_info() 中,模块的每个区块都会获得一个唯一的标识符 "delta"(即返回数组的键)。该 delta 值在模块中必须唯一,并用于以下场景:

Hook_menu Drupal 7 通过模块创建页面

14/10/2025, by Ivan

在上一课中,我们学习了如何通过 Drupal API 从数据库中输出信息,具体来说使用了钩子 hook_block_info()hook_block_view()。在本课中,我们将学习如何输出页面,也就是使用钩子 hook_menu,将页面连接到 Drupal 的其他部分,如菜单、翻译模块、模板等。

我们从简单的开始,创建一个页面,用于输出最近 10 条新闻的标题和描述。这样就能得到一个简短的新闻列表。我们将使用 hook_menu()。以下是它的说明,之后我们会进行实际使用。

hook_menu()

定义菜单项并返回页面。

当模块中调用此钩子时,它会注册路径,并指定 Drupal 处理的顺序。路径既可以仅用于处理请求,也可以被添加到菜单中,例如导航菜单。路径及其相关信息称为 menu router item。此钩子只在特定情况下被调用(例如启用模块时),其结果会被缓存到数据库中。因此,在修改模块中的钩子后,通常需要清除缓存。

hook_permission Drupal 7 不同角色的访问权限

14/10/2025, by Ivan

在之前的课程中,我们已经在不同位置输出了页面和区块,并且使用了 access argumentsaccess callback 属性来设置页面访问限制。在本课中,我们将创建一种更灵活的方式,通过管理页面来编辑操作的访问权限。为此,我们将使用 hook_permission()(在 Drupal 6 中该钩子名为 hook_perm())。

hook_permission()

定义用户的权限。

该钩子可以添加权限,使您的模块能够定义哪些权限会出现在用户权限页面上。同时,该钩子还可用于控制模块执行的动作(actions)的全部或部分访问。

权限通过 user_access() 函数进行检查。

返回值

返回一个数组,其键是权限名称,对应的值是包含以下键值对的数组:

title:权限的可读名称,会显示在权限页面上。此值应使用 t() 函数包装,以便可以被翻译成其他语言。

Form API Drupal 7 —— 在 Drupal 中创建表单

14/10/2025, by Ivan

在前几节课程中,我们已经学习了钩子 hook_block_info()hook_block_view()hook_menu()hook_permission(),因此我们现在已经能够通过编程方式创建任意数量的页面和区块。而在本节中,我们将学习 Drupal 7 的 Form API,用于创建表单。我们将创建一个用于模块管理的表单,并尽量使用我们已经掌握的钩子来巩固知识。

首先,我们输出 3 个区块,这对你来说应该已经不难了: