Drupal采用钩子系统删除用户实例详解

所属分类: CMS教程 / drupal 阅读数: 1894
收藏 0 赞 0 分享

本文实例讲述了Drupal采用钩子系统删除用户的方法,分享给大家供大家参考。具体实现方法如下:

钩子(hook)系统是Drupal的一大特色,它通过回调一系统应用某钩子的函数来实现系统的灵活性和可扩展性

本文以“删除用户”这一行为为示例,讲述Drupal钩子系统的执行机制。

“删除用户”的行为,很容易能够想到Drupal所使用的函数是 user_delete();是通过 Drupal API 网站(http://api.drupal.org)搜索到 user_delete() 的源代码。(为方便讲解,在源代码中添加了一些注释)


复制代码
代码如下:
<?php
function user_delete($edit, $uid) {
$account = user_load(array('uid' => $uid)); // 加载用户
sess_destroy_uid($uid); // 销毁用户会话(session)
_user_mail_notify('status_deleted', $account); // 为删除用户发送邮件通知
db_query('DELETE FROM {users} WHERE uid = %d', $uid); // 删除 users 表中的记录
db_query('DELETE FROM {users_roles} WHERE uid = %d', $uid); // 删除 users_roles 表中的记录
db_query('DELETE FROM {authmap} WHERE uid = %d', $uid); // 删除 authmap 表中的记录
$variables = array(
'%name' => $account->name,
'%email' => '<' . $account->mail . '>',
);
watchdog('user', 'Deleted user: %name %email.', $variables, WATCHDOG_NOTICE); // 记录日志
user_module_invoke('delete', $edit, $account); // 调用所有应用了 hook_user() 的模块
}
?>

此函数分别做了几件事,加载用户、销毁会话、用户删除邮件通知、清理User模块相关表的条目。直到代码的最后,我们没有看到与 node 相关的内容,但并不能这样就认为 Drupal 就只处理了User模块相关的表。:D

在这里,我们要注意最后一个函数 user_module_invoke(); Drupal 正是使用这个函数,调用所有应用了 hook_user 钩子的函数,优雅地处理所有与用户删除相关的信息,这正是 Drupal 的美丽之处。

同样,使用 Drupal API 查找 user_module_invoke(), 得到如下源代码:


复制代码
代码如下:
<?php
function user_module_invoke($type, &$array, &$user, $category = NULL) {
foreach (module_list() as $module) { // 取得所有模块列表,并轮循模块是否应用了 hook_user() 钩子
$function = $module . '_user';
if (function_exists($function)) { // 对于应用了钩子的模块,调用其钩子函数实例
$function($type, $array, $user, $category);
}
}
}
?>

这段代码即是说,从所有模块中查找出应用了 hook_user() 钩子的函数,并调用此函数。

我们想想,在执行“删除用户”这个操作时,由该用户所创建的节点内容会怎么样?因为节点模块名为 node,所以我们其对应的钩子,即 node_user();

还是使用 Drupal API,查找 node_user() 函数,得以下源代码


复制代码
代码如下:
<?php
function node_user($op, &$edit, &$user) {
if ($op == 'delete') { // 如果操作为“删除”
db_query('UPDATE {node} SET uid = 0 WHERE uid = %d', $user->uid); // 将此用户创建的节点的作者ID改为0,即匿名用户
db_query('UPDATE {node_revisions} SET uid = 0 WHERE uid = %d', $user->uid); // 将此用户创建的节点修订版本的作者也改为匿名用户
}
}
?>

从上述代码中可以看出,当 $op == 'delete' 时,函数会执行一个表更新的操作,将节点的用户ID(即uid)更新为 0 (即匿名用户)。

因此,当在删除用户时,此用户所创建的节点和节点修订版本全都会被改为匿名用户所创建,因此删除用户不只执行删除用户的操作,Drupal 通过钩子系统调用所有与删除用户相关的操作,从而保证系统的稳健、强壮、灵活和可扩展性。

希望本文所述对大家的PHP程序设计有所帮助。

更多精彩内容其他人还在看

drupal模块开发分析

drupal模块开发分析,方便想要drupal模块开发的朋友
收藏 0 赞 0 分享

Drupal7之drupal_static函数用法解析

这篇文章主要为大家介绍了Drupal7之drupal_static函数用法,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal常用到的几种过滤函数小结

这篇文章主要为大家介绍了drupal常用到的几种过滤函数,总结了常见过滤函数的具体用法,非常实用,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal使用hook_form_alter()修改表单实例

这篇文章主要为大家介绍了drupal使用hook_form_alter()修改表单的实现方法,包括了修改多个表单与修改特定的表单,非常实用,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal开启pathauto模块后得到路径参数的方法

这篇文章主要为大家介绍了drupal开启pathauto模块后得到路径参数的方法,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal之hook_link和hook_link_alter钩子函数解析

这篇文章主要为大家介绍了drupal中hook_link和hook_link_alter钩子函数,实例分析了钩子函数的具体用法,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal按分类进行文章排序的实现方法

这篇文章主要为大家介绍了drupal按分类进行文章排序的实现方法,较为详细的分析了drupal文件组织结构与实现文章排序的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal模板(page.tpl)中的tabs无用户与密码的解决方法

这篇文章主要为大家介绍了drupal模板(page.tpl)中的tabs无用户与密码的解决方法,在drupal模板开发中具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal文件系统概述

这篇文章主要为大家介绍了drupal文件系统,讲述了drupal文件系统的分类,重点讲述了钩子函数的用法,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal实现输出可点击表头排序表格的方法

这篇文章主要为大家介绍了drupal实现输出可点击表头排序表格的方法,包括了表的定义、SQL语句、表内容及生成HTML文件等,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多