logo

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

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

演示 EBT 模块 下载 EBT 模块

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

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

演示 EPT 模块 滚动

GLightbox is a pure javascript lightbox (Colorbox alternative without jQuery)❗

It can display images, iframes, inline content and videos with optional autoplay for YouTube, Vimeo and even self-hosted videos.

Demo GLightbox Download GLightbox

滚动

配置 Drupal 用户资料页面

14/10/2025, by Ivan

个人资料字段

我们的用户资料内容目前几乎是空的。让我们添加一些基本信息字段,我将其称为 “个人资料字段”。这一步确实需要一些思考,以确定需要哪些字段。常见的字段包括:关于我、性别、爱好、职业等。要定义这些附加字段,我们需要使用 Profile2 模块。我通常会将所有字段放在一个 fieldset 中。你也可以添加字段分组。只需填写字段内容、拖放排序即可完成。请记住,用户资料会在注册时自动创建。这意味着:应尽量减少必填字段。用户应该能够快速注册。此外,即使某些字段不是必填项,我们也不希望用过多的文本输入框让他们感到疲惫。你可以针对特定的字段组,让用户资料页面保持整洁有序。

头像

你的用户需要一个“面孔”。用户头像在现代互联网中扮演着非常重要的角色。它们能够极大地提升整体体验,使用户之间产生“个人联系”的感觉。在 Drupal 中,已经提供了创建精美用户头像所需的所有工具。

为 Drupal 7 开发模块

14/10/2025, by Ivan

在本教程部分中,我将向你展示 Drupal 不仅仅是一款 CMS。我们将了解 Drupal 模块 的组成结构,并亲手创建几个属于我们自己的模块。

Drupal 是一个快速发展的系统,目前已经推出了第七个主要版本。成千上万个模块被开发出来,用于在网站上实现各种功能。然而,有时我们不仅仅需要通过鼠标来配置模块。有时我们可能不满意数据的输出顺序,或者数据显示的样式无法满足我们的需求。这时,Drupal 框架就能派上用场。我们将在以下网站上进一步了解该框架的强大功能:

api.drupal.org

我们决定在 Drupal 中创建一个模块,为此我们需要准备以下内容:

Drupal 7 — 使用 PHP PDO 进行数据库操作

14/10/2025, by Ivan

随着我们迁移到 Drupal 7,我们也转向了新的 Drupal 数据库抽象层 API,它基于 PDO 实现。PDO 早已被广泛应用于 Zend Framework 以及许多其他 PHP 框架中。那么,既然在 Drupal 6 中编写 SQL 查询已经很方便了,为什么还需要新的方式呢?

首先,让我们了解一下什么是 PDO。

PDO(PHP Data Objects) 允许将 PHP 与数据库交互的代码从一种数据库轻松迁移到另一种数据库。例如,如果你的网站之前使用 MySQL,现在你可以几乎无缝地迁移到 PostgreSQL。至于 Oracle,我暂时还没测试过,但理论上它也应该可以正常工作。

PHP Data Objects(PDO)是 PHP 的一个扩展,它为访问数据库提供了一个轻量级、统一的接口。每个数据库的驱动程序都通过 PDO 接口实现,并且可以扩展以支持特定数据库服务器的功能。

在 Drupal 7 中操作数据库 - 第1课 - Drupal 数据库 API(DB API)

14/10/2025, by Ivan

如果你曾经为 Drupal 6 编写过模块,那么迁移到新的 Drupal 7 Database API 对你来说不会太困难。新的数据库 API 基于 PHP 的 PDO 扩展,这使它能够支持多种数据库,例如 MySQL、PostgreSQL、MSSQL,甚至可能包括 Oracle。虽然语法需要一些时间去适应,但从安全性和可扩展性角度来看,它比直接书写 SQL 更强大。

以下是官方文档中的一些要点:

Drupal 7 Database API 提供了一个标准化且直观的数据库访问抽象层。该 API 在尽可能保持 SQL 语法和灵活性的同时,还提供了以下特性:

在 Drupal 7 中操作数据库 - 第2课 - 数据库配置(Configuration)

14/10/2025, by Ivan

在 Drupal 中,定义数据库连接的主要方式是通过 settings.php 文件中的 $databases 数组。顾名思义,$databases 允许定义多个数据库连接,并且支持多目标配置(target)。数据库连接在第一次执行查询时才会被真正建立(即延迟加载)。

连接键(Connection Key)

连接键是数据库连接的唯一标识符。它在整个网站范围内必须唯一,并且必须为主数据库设置一个默认连接键。通常,大多数站点只会有一个默认连接。

连接目标(Connection Target)

每个连接可以包含一个或多个“目标(target)”。目标是一种可选机制,用于在可用时使用不同的数据库。若所请求的目标未定义,系统会自动回退到默认目标(“default”),而默认目标必须始终存在。

在 Drupal 7 中操作数据库 - 第3课 - 静态查询(SELECT)

14/10/2025, by Ivan

在 Drupal 中最常见的查询形式是静态查询(Static Query)。静态查询会直接、完整地传递给数据库。只有 SELECT 查询可以是静态的。

静态查询仅适用于非常简单的场景。如果你需要构建复杂的、可动态生成或执行后可修改的查询,应该使用动态查询(Dynamic Query)

执行静态查询的最简单方式是使用查询方法:

<?php
$result = $conn->query("SELECT nid, title FROM {node}");
?>

但更推荐使用过程式封装函数:

<?php
$result = db_query("SELECT nid, title FROM {node}");
?>

上述调用等价于以下语句:

在 Drupal 7 中操作数据库 - 第4课 - 动态查询(SELECT)

14/10/2025, by Ivan

我们终于来到了 Drupal Database API 中最有趣的部分:动态查询(Dynamic Queries)。之所以称为动态查询,是因为 Drupal 会动态地构建 SQL 查询语句。所有的插入(INSERT)、更新(UPDATE)、删除(DELETE)和合并(MERGE)查询都可以是动态的。SELECT 查询既可以是静态的,也可以是动态的,但在大多数情况下,推荐使用动态查询。

所有 动态查询 都是通过创建查询对象的方式生成的,我们可以在需要时对该对象进行操作。与静态查询类似,大多数动态查询也通过过程式封装函数(procedural wrapper)来执行。查询对象可以根据需要添加参数或条件。

db_select() 查询

动态 SELECT 查询从 db_select() 函数开始,例如:

在 Drupal 7 中操作数据库 - 第5课 - Extenders(扩展器)

14/10/2025, by Ivan

在 Drupal 7 中,SELECT 查询支持使用 扩展(Extenders)。扩展允许在运行时为查询对象添加额外功能,这些功能可以是新增的方法,也可以修改现有方法的行为。

在面向对象编程(OOP)中,这种机制通过设计模式实现,具体来说是采用了 装饰者模式(Decorator Pattern)。扩展通过为动态对象附加额外职责,为查询对象提供一种灵活的功能增强方式。

使用 Extenders(扩展)

要使用扩展,首先必须有一个查询对象。调用查询对象的 extend() 方法会返回一个新的查询对象,该对象包含扩展功能。例如:

在 Drupal 7 中操作数据库 - 第6课 - 动态修改查询(hook_query_alter)

14/10/2025, by Ivan

动态选择查询(SELECT)的一个重要特性是,其他模块可以在运行时修改查询。这允许模块向查询中插入自己的指令,从而影响查询的行为,或在执行时进行修改,例如为节点(node)添加访问权限过滤。实现动态修改查询的机制包括三个部分:tagging(标签)meta data(元数据)hook_query_alter()

Tagging(标签)

任何动态查询都可以添加一个或多个标签(tag)。这些标签用于标识查询类型,使其他模块能够识别并对其进行相应的处理。标签应为小写字母和数字的组合,遵循与 PHP 变量相同的命名规则。要为查询添加标签,请使用 addTag() 方法:

<?php
$query->addTag('node_access');
?>

可以使用以下三种方法来检测查询对象中是否存在标签:

在 Drupal 7 中操作数据库 - 第7课 - 查询结果的处理(fetch)

14/10/2025, by Ivan

SELECT 查询的执行结果总是返回 0 条或多条记录。对于查询结果的处理,Drupal 提供了多种方式,您可以根据实际需求选择使用。

最常见的方式是通过 foreach() 循环遍历结果:

<?php
$result = db_query("SELECT nid, title FROM {node}");
foreach ($result as $record) {
  // 处理每一条记录
  $node = node_load($record->nid);
}
?>

根据你需要的输出形式,你还可以使用其他方式来获取结果记录。若需逐条显式读取记录,请使用以下方法: