Tworzenie użytkownika i logowanie za pomocą kodu w Drupalu

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