Drupal采用鉤子系統(tǒng)刪除用戶實(shí)例詳解

本文實(shí)例講述了Drupal采用鉤子系統(tǒng)刪除用戶的方法,分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:
鉤子(hook)系統(tǒng)是Drupal的一大特色,它通過(guò)回調(diào)一系統(tǒng)應(yīng)用某鉤子的函數(shù)來(lái)實(shí)現(xiàn)系統(tǒng)的靈活性和可擴(kuò)展性
本文以“刪除用戶”這一行為為示例,講述Drupal鉤子系統(tǒng)的執(zhí)行機(jī)制。
“刪除用戶”的行為,很容易能夠想到Drupal所使用的函數(shù)是 user_delete();是通過(guò) Drupal API 網(wǎng)站(http://api.drupal.org)搜索到 user_delete() 的源代碼。(為方便講解,在源代碼中添加了一些注釋)
function user_delete($edit, $uid) {
$account = user_load(array('uid' => $uid)); // 加載用戶
sess_destroy_uid($uid); // 銷毀用戶會(huì)話(session)
_user_mail_notify('status_deleted', $account); // 為刪除用戶發(fā)送郵件通知
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); // 調(diào)用所有應(yīng)用了 hook_user() 的模塊
}
?>
此函數(shù)分別做了幾件事,加載用戶、銷毀會(huì)話、用戶刪除郵件通知、清理User模塊相關(guān)表的條目。直到代碼的最后,我們沒(méi)有看到與 node 相關(guān)的內(nèi)容,但并不能這樣就認(rèn)為 Drupal 就只處理了User模塊相關(guān)的表。:D
在這里,我們要注意最后一個(gè)函數(shù) user_module_invoke(); Drupal 正是使用這個(gè)函數(shù),調(diào)用所有應(yīng)用了 hook_user 鉤子的函數(shù),優(yōu)雅地處理所有與用戶刪除相關(guān)的信息,這正是 Drupal 的美麗之處。
同樣,使用 Drupal API 查找 user_module_invoke(), 得到如下源代碼:
function user_module_invoke($type, &$array, &$user, $category = NULL) {
foreach (module_list() as $module) { // 取得所有模塊列表,并輪循模塊是否應(yīng)用了 hook_user() 鉤子
$function = $module . '_user';
if (function_exists($function)) { // 對(duì)于應(yīng)用了鉤子的模塊,調(diào)用其鉤子函數(shù)實(shí)例
$function($type, $array, $user, $category);
}
}
}
?>
這段代碼即是說(shuō),從所有模塊中查找出應(yīng)用了 hook_user() 鉤子的函數(shù),并調(diào)用此函數(shù)。
我們想想,在執(zhí)行“刪除用戶”這個(gè)操作時(shí),由該用戶所創(chuàng)建的節(jié)點(diǎn)內(nèi)容會(huì)怎么樣?因?yàn)楣?jié)點(diǎn)模塊名為 node,所以我們其對(duì)應(yīng)的鉤子,即 node_user();
還是使用 Drupal API,查找 node_user() 函數(shù),得以下源代碼
function node_user($op, &$edit, &$user) {
if ($op == 'delete') { // 如果操作為“刪除”
db_query('UPDATE {node} SET uid = 0 WHERE uid = %d', $user->uid); // 將此用戶創(chuàng)建的節(jié)點(diǎn)的作者ID改為0,即匿名用戶
db_query('UPDATE {node_revisions} SET uid = 0 WHERE uid = %d', $user->uid); // 將此用戶創(chuàng)建的節(jié)點(diǎn)修訂版本的作者也改為匿名用戶
}
}
?>
從上述代碼中可以看出,當(dāng) $op == 'delete' 時(shí),函數(shù)會(huì)執(zhí)行一個(gè)表更新的操作,將節(jié)點(diǎn)的用戶ID(即uid)更新為 0 (即匿名用戶)。
因此,當(dāng)在刪除用戶時(shí),此用戶所創(chuàng)建的節(jié)點(diǎn)和節(jié)點(diǎn)修訂版本全都會(huì)被改為匿名用戶所創(chuàng)建,因此刪除用戶不只執(zhí)行刪除用戶的操作,Drupal 通過(guò)鉤子系統(tǒng)調(diào)用所有與刪除用戶相關(guān)的操作,從而保證系統(tǒng)的穩(wěn)健、強(qiáng)壯、靈活和可擴(kuò)展性。
希望本文所述對(duì)大家的PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
drupal之hook_link和hook_link_alter鉤子函數(shù)解析
這篇文章主要為大家介紹了drupal中hook_link和hook_link_alter鉤子函數(shù),實(shí)例分析了鉤子函數(shù)的具體用法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-03- 真是不看不知道,Drupal 真奇妙。很多使用CMS內(nèi)容管理系統(tǒng)的人可能都會(huì)知道一款國(guó)外的CMS系統(tǒng):Drupal 。在我們傳統(tǒng)的想象中CMS除了能做內(nèi)容文章站外,其他還有圖片站,分2010-01-24
- 對(duì)頁(yè)面和靜態(tài)資源的啟用緩存和Gzip壓縮傳輸.2010-01-24
- drupal模塊開發(fā)分析,方便想要drupal模塊開發(fā)的朋友2012-12-06
drupal 自定義表單調(diào)用autocomplete主標(biāo)簽實(shí)現(xiàn)代碼
drupal 自定義表單調(diào)用autocomplete主標(biāo)簽實(shí)現(xiàn)代碼,需要的朋友可以參考下2012-12-06drupal導(dǎo)入數(shù)據(jù)的實(shí)現(xiàn)方法
這篇文章主要為大家介紹了drupal導(dǎo)入數(shù)據(jù)的實(shí)現(xiàn)方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-03drupal導(dǎo)入圖片的實(shí)現(xiàn)方法
這篇文章主要為大家介紹了drupal導(dǎo)入圖片的實(shí)現(xiàn)方法,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-03drupal實(shí)現(xiàn)在node節(jié)點(diǎn)的評(píng)論下面添加內(nèi)容的方法
這篇文章主要為大家介紹了drupal實(shí)現(xiàn)在node節(jié)點(diǎn)的評(píng)論下面添加內(nèi)容的方法,涉及相關(guān)函數(shù)的修改與hook函數(shù)的使用,具有一定的借鑒價(jià)值,需要的朋友可以參考下2014-11-04- 這篇文章主要為大家介紹了定制Drupal首頁(yè)的方法,以實(shí)例形式講述了幾種常見(jiàn)的實(shí)現(xiàn)方法,非常實(shí)用,需要的朋友可以參考下2014-11-05
drupal實(shí)現(xiàn)輸出可點(diǎn)擊表頭排序表格的方法
這篇文章主要為大家介紹了drupal實(shí)現(xiàn)輸出可點(diǎn)擊表頭排序表格的方法,包括了表的定義、SQL語(yǔ)句、表內(nèi)容及生成HTML文件等,需要的朋友可以參考下2014-11-03