Logowanie za pomocą kodu w Drupalu
Zdarza się, że w serwisie opartym o CMS Drupal programiści potrzebują utworzyć użytkownika nie za pomocą interfejsu użytkownika a za pomocą kodu PHP. W takim przypadku możemy wykorzystać drupalowe funkcje wchodzące głównie w skład modułu User. Nie musimy tego robić wstawiając informacji o nowym użytkowniku bezpośrednio do bazy danych.
params = array(
'name' => 'JanNowak',
'mail' => '[email protected]',
'password' => user_password(),
);
$new_user = user_save(NULL, $params);
_user_mail_notify('register_admin_created', $new_user);
Powyższy kod utworzy użytkownika o nazwie JanNowak. Hasło zostanie wygenerowane losowo, możemy także podać własne hasło, jeśli jest taka potrzeba. Funkcja user_password() domyślnie generuje hasło o długości 10 znaków, jeśli chcemy wygenerować dłuższe lub krótsze hasło podajemy długość hasła jako parametr funkcji, np user_password(5) - wygeneruje hasło o długości 5 znaków. Więcej o funkcji user_password na stronie dokumentacji: http://api.drupal.org/api/drupal/modules--user--user.module/function/use...
Funkcja _user_mail_notify jest tu wykorzystana do wysyłania powiadomień do użytkownika, że zostało utworzone dla niego konto w systemie. Wiadomość będzie miała treść identyczną jak wiadomość wysłana gdy konto użytkownika zostanie utworzone przez administratora za pomocą interfejsu Drupala.
W wywołaniu funkcji user_save() jako pierwszy parametr wpisana jest wartość NULL. W tym przypadku zostanie utworzony nowy użytkownik. Jeśli chcemy zaktualizować istniejącego już w systemie użytkownika to jako pierwszy parametr podajemy obiekt zawierający identyfikator użytkownika, którego chcemy zaktualizować, np:
$account = new stdClass();
$account->uid = 46;
$params = array(
'name' => 'JanNowak',
'mail' => '[email protected]',
'password' => user_password(),
);
$new_user = user_save($account, $params);
Za pomocą tego kodu zostaną zmienione dane użytkownika o identyfikatorze 46. Obiekt $account nie musi zawierać wszystkich informacji o użytkowniku, wystarczy, że będzie tam atrybut UID.
Mając utworzonego użytkownika może być potrzeba aby go automatycznie zalogować. W takim przypadku także skorzystamy z funkcji drupalowych. Najlepiej do tego celu napisać sobie funkcję, której kod wygląda następująco:
/**
* Log in user.
*
* @param $uid
* User ID.
*/
function modulename_user_login($uid) {
$userObj = user_load(array('uid' => $uid));
global $user;
$user = $userObj;
//Log in user
$userObj->login = time();
db_unlock_tables();
db_query("UPDATE {users} SET login = %d WHERE uid = %d", $userObj->login, $userObj->uid);
// Regenerate the session ID to prevent against session fixation attacks.
sess_regenerate();
user_module_invoke('login', $edit, $userObj);
}
Jeśli mamy przygotowaną taką funkcję to możemy zalogować dowolnego użytkownika przez wywołanie funkcji:
modulename_user_login(46); // Zaloguj użytkownika o identyfikatorze 46