在 Drupal 7 中操作数据库 - 第10课 - 删除查询(DELETE)
删除查询应使用查询构造器(Query Builder)。它们从函数 db_delete() 开始:
<?php
$query = db_delete('node', $options);
?>
此删除查询将从表 node 中删除记录。请注意,无需在表名外加花括号,查询构造器会自动处理。删除查询使用 Fluent API(链式调用),即除 execute() 之外的所有方法都会返回查询对象本身(与更新 UPDATE 和插入 INSERT 查询相同)。
删除查询非常简单,仅使用 WHERE 表达式。关于 WHERE 的详细内容将在后续课程中讲解,现在我们来看一个基本的删除示例:
在 Drupal 7 中操作数据库 - 第11课 - 合并查询(MERGE)
合并查询是一种特殊的混合类型查询。尽管这种语法在 SQL 2003 中被定义,但实际上几乎没有数据库原生支持该语法。然而,大多数数据库都提供了各自特定的替代实现。Drupal 中的合并查询构造器(Merge Query Builder)将“合并查询”的概念抽象为对象结构,这样系统可以根据不同数据库的特性分别编译对应的查询语句。
总体而言,合并查询是 INSERT 与 UPDATE 查询的组合。如果满足某个条件(例如表中存在指定键的记录),则执行一个查询;否则执行另一个查询。大多数情况下,它等价于以下逻辑:
在 Drupal 7 中操作数据库 - 第12课 - 查询条件(WHERE、HAVING、LIKE)
查询条件允许我们选择仅符合特定限制的记录,例如两周内创建的节点、名称中包含“Drupal”一词的术语等。在 SQL 中,我们使用 WHERE 和 HAVING 来为 SELECT、UPDATE、DELETE 查询设置限制。在 Drupal 的动态查询中,也提供了用于处理查询条件的机制。这个机制在三种类型的查询(选择、更新、删除)中工作方式相同。
条件表达式的概念
条件包含在一个专门定义限制的表达式中。
合并(相加、并集、逻辑与)
每个条件可以由多个条件表达式组成,这些表达式可以组合在一起。条件通过运算符 AND(与) 和 OR(或) 来连接。
条件对象
Drupal 将每个条件片段表示为 QueryConditional 类的实例。条件对象是该类的一个实例。
我们来看一个 SQL 查询示例:
查询语句:
在 Drupal 中创建模块,快速入门
我们从 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 模块由哪些部分组成?
在开始创建我们的模块之前,我还要简单介绍一下 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() 在区块中输出信息
在上一课中,我们为 Drupal 7 创建了一个模块,而在本课中,我们将继续扩展模块的功能。我们将通过 hook_block_view() 和 hook_block_info() 添加一个区块(block)输出。在这个区块中,将显示站点上最近注册的用户列表,并附带指向他们个人页面的链接。
我们先来看一下 hook_block_info() 的说明:
定义由模块创建的所有区块。
此钩子在 Drupal 中用于定义模块将输出哪些区块,同时还可以描述区块的显示设置。
在 hook_block_info() 中,模块的每个区块都会获得一个唯一的标识符 "delta"(即返回数组的键)。该 delta 值在模块中必须唯一,并用于以下场景:
Hook_menu Drupal 7 通过模块创建页面
在上一课中,我们学习了如何通过 Drupal API 从数据库中输出信息,具体来说使用了钩子 hook_block_info() 和 hook_block_view()。在本课中,我们将学习如何输出页面,也就是使用钩子 hook_menu,将页面连接到 Drupal 的其他部分,如菜单、翻译模块、模板等。
我们从简单的开始,创建一个页面,用于输出最近 10 条新闻的标题和描述。这样就能得到一个简短的新闻列表。我们将使用 hook_menu()。以下是它的说明,之后我们会进行实际使用。
hook_menu()
定义菜单项并返回页面。
当模块中调用此钩子时,它会注册路径,并指定 Drupal 处理的顺序。路径既可以仅用于处理请求,也可以被添加到菜单中,例如导航菜单。路径及其相关信息称为 menu router item。此钩子只在特定情况下被调用(例如启用模块时),其结果会被缓存到数据库中。因此,在修改模块中的钩子后,通常需要清除缓存。
hook_permission Drupal 7 不同角色的访问权限
在之前的课程中,我们已经在不同位置输出了页面和区块,并且使用了 access arguments 和 access callback 属性来设置页面访问限制。在本课中,我们将创建一种更灵活的方式,通过管理页面来编辑操作的访问权限。为此,我们将使用 hook_permission()(在 Drupal 6 中该钩子名为 hook_perm())。
hook_permission()
定义用户的权限。
该钩子可以添加权限,使您的模块能够定义哪些权限会出现在用户权限页面上。同时,该钩子还可用于控制模块执行的动作(actions)的全部或部分访问。
权限通过 user_access() 函数进行检查。
返回值
返回一个数组,其键是权限名称,对应的值是包含以下键值对的数组:
title:权限的可读名称,会显示在权限页面上。此值应使用 t() 函数包装,以便可以被翻译成其他语言。
Form API Drupal 7 —— 在 Drupal 中创建表单
在前几节课程中,我们已经学习了钩子 hook_block_info()、hook_block_view()、hook_menu() 和 hook_permission(),因此我们现在已经能够通过编程方式创建任意数量的页面和区块。而在本节中,我们将学习 Drupal 7 的 Form API,用于创建表单。我们将创建一个用于模块管理的表单,并尽量使用我们已经掌握的钩子来巩固知识。
首先,我们输出 3 个区块,这对你来说应该已经不难了:
Drupal 主题化(样式与模板)
在 Drupal 教程 网站 drupalbook.org 的前两部分中,您已经学习了如何安装网站、添加内容类型、创建不同类型的内容,以及如何通过 Views 模块来输出这些内容。在接下来的部分中,您可能已经了解了 HTML 和 CSS 的基础。现在,是时候学习如何使用 CSS 来修改这些内容的外观了。