你现在的位置:首页 > PHP网站建设知识库 > Drupal > 正文

Drupal 挂钩

为了通过程序定义模块,需要按照预定义函数的语法创建特定的函数。这些挂钩使系统能够调用适当的 PHP 函数来查看页面或在数据库中存储信息。每个挂钩都定义了一套参数和一个返回类型。挂钩的语法是在已定义接口前面加上模块的名称。例如,用来删除 announcement 类型的节点的挂钩会采用 announcement_delete(...) 形式。这个挂钩允许您的定制模块删除您的模块在数据库中创建的而且在给定节点被删除时应该同时删除的任何信息。

另一个挂钩例子是查看同类型节点的挂钩 announcement_view(...),它允许模块根据当前用户的访问特权对内容进行过滤。在页面上显示内容的一个挂钩例子是 announcement_block(...)。这允许模块返回主题化的内容的一个小容器,可以用作任何 Web 页面上的区块。

下面要简短地描述用于节点访问、数据库交互和主题化的几个基本挂钩。在下一篇文章中描述我们的定制 announcement 模块时将更详细地进行讨论。

节点访问挂钩

在这一节中,我们将讨论需要为新的节点模块编写的几个典型挂钩。Drupal 的适当版本的 API 参考中提供了挂钩的所有文档。我们描述的挂钩取自我们的 announcement 模块示例,应该将它作为参考,而不是模块开发的严格方法。

<module_name>_perm
perm 挂钩定义可以分配给每个用户的访问权限类型。节点模块定义了几种标准类型:
清单 1. 实现节点模块的 perm 挂钩

function node_perm() {
return array('administer nodes', 'access content', 'view revisions', 'revert revisions');
}
节点模块对管理节点、访问内容、查看修订和恢复修订进行区分。在将访问特权分配给不同的用户角色时要使用这些字符串(见 图 4)。尽可能使用现有的类型,但是如果模块的语义很特殊的话,可以创建自己的类型。例如,如果 announcement 模块需要区分创建操作和编辑操作,就可以在挂钩的数组中提供 create announcement 和 edit announcement 值。

Drupal 函数 user_access() 可以针对这些字符串类型检查当前用户的特权。如果当前用户拥有 “access content” 特权(也就是,该用户有权查看 Web 站点上的一般性内容),函数 user_access('access content') 就会返回 TRUE。模块的 menu 挂钩中常常使用这个函数,但是每当需要在执行操作前对用户的权限进行评估时都可以使用它。

<module_name>_access
access 挂钩能够将对内容的访问限制为某些操作。传递节点操作(查看、创建、更新、删除等等)和节点来帮助确定访问特权。通过返回一个布尔值,可以启用或禁用节点上的某些操作。例如,您可能希望检查当前用户是否是节点的作者,以此确定该用户是否可以执行当前操作。为此,可以使用 清单 2 中的代码。
清单 2. access 挂钩的示例实现


function <module_name>_access($op, $node) {
if ($op == 'update' || $op == 'delete') {
if ($user->uid == $node->uid or user_access('edit <module_name>')) {
return true;
} else {
return false;
}
}
}
如果发出请求的用户是内容的所有者,或者他们已经被显式地授予编辑此类型内容的权限,那么这个 access 挂钩示例允许执行 update 或 delete 操作。