欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

  發(fā)布時(shí)間:2014-11-06 10:16:53   作者:佚名   我要評(píng)論
這篇文章主要為大家介紹了Drupal采用鉤子系統(tǒng)刪除用戶的實(shí)現(xiàn)方法,對(duì)鉤子系統(tǒng)的運(yùn)行機(jī)制做了較為詳細(xì)的敘述,具有很好的參考借鑒價(jià)值,需要的朋友可以參考下

本文實(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() 的源代碼。(為方便講解,在源代碼中添加了一些注釋)


復(fù)制代碼
代碼如下:
<?php
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(), 得到如下源代碼:


復(fù)制代碼
代碼如下:
<?php
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ù),得以下源代碼


復(fù)制代碼
代碼如下:
<?php
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)文章

最新評(píng)論