文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-06-12 02:23

关注

本文实例讲述了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程序设计有所帮助。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-开源
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯