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

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