Tạo người dùng theo chương trình và cung cấp cho họ vai trò


46

Tôi đang tạo một người dùng lập trình như thế này:

$newUser = array(
  'name' => $mail, 
  'pass' => 'password',  // note: do not md5 the password
  'mail' => $mail, 
  'status' => 1, 
  'init' => $mail,
  'roles' => array(5)
);
$user = user_save(null, $newUser);

Tôi đã có một vai trò với ID vai trò bằng năm; Khi tôi tạo người dùng, trong bảng "users_roles" chỉ có một hàng có giá trị 0 cho ID vai trò, nhưng nếu tôi in đối tượng người dùng var_dump(), có vẻ như các vai trò được tạo.

Tôi đang làm gì sai?


Nó chỉ kiểm tra tính trung thực về giá trị, quan trọng là điều quan trọng. array($role_id => 'anything')
RaisinBranCrunch

Câu trả lời:


46

Mã này làm việc cho tôi:

$new_user = array(
  'name' => $name,
  'pass' => $sifra, // note: do not md5 the password
  'mail' => $email,
  'status' => 1,
  'init' => $email,
  'roles' => array(
    DRUPAL_AUTHENTICATED_RID => 'authenticated user',
    3 => 'custom role',
  ),
);

// The first parameter is sent blank so a new user is created.
user_save('', $new_user);

Tôi có nên viết mật khẩu một mật khẩu như "abc12345" và user_save () sẽ chuyển đổi thành md5 không?
xstean

1
user_savesẽ chăm sóc nó
Gulok

Miễn là mật khẩu nằm trong user_save()đối số thứ hai, nó sẽ được băm. Nếu bạn làm user_save($account)mà không có $editđối số, thì chuyển đổi md5 sẽ không xảy ra. Câu trả lời của @SMTF dưới đây minh chứng điều này.
alec

Cảm ơn đã cứu ngày của tôi
Rishab

13

Đây là một ví dụ tôi tìm thấy trên một trang web.

$account = new stdClass;
$account->is_new = TRUE;
$account->name = 'foo';
$account->pass = user_hash_password('bar');
$account->mail = 'foo@example.com';
$account->init = 'foo@example.com';
$account->status = TRUE;
$account->roles = array(DRUPAL_AUTHENTICATED_RID => TRUE);
$account->timezone = variable_get('date_default_timezone', '');
user_save($account);

Xin lỗi, tôi nghĩ DRUPAL_AUTHENTICATED_RID => TRUE có vẻ sai và tôi không nghĩ user_hash_password là cần thiết.
stefgosselin

user_hash_password('bar');là sai
Joel James

Có một số trường hợp user_save()không thể băm mật khẩu trước khi lưu chúng (theo kinh nghiệm của riêng tôi và tôi thấy những người khác trên web cũng thỉnh thoảng gặp phải nó). Tôi không biết tại sao (nhưng tôi muốn!). Trong những trường hợp này, cuộc gọi user_hash_password()dường như là cần thiết.
Alec

Mã trong câu trả lời này không yêu cầu user_hash_password()phải được gọi thủ công. Điều này là do nó không chuyển $editđến user_save(). Nếu mã bao gồm $edit = array('pass' => 'bar');(mà câu trả lời này không có) thì thay vì làm $account->pass = user_hash...bạn có thể làm user_save($account, $edit);user_save()sẽ thực hiện băm cho bạn.
alec

13

Để lập trình người dùng có vai trò và giá trị trường tùy chỉnh (ví dụ: Tên và Họ), bạn có thể sử dụng mã sau:

$new_user = array(
  'name' => 'xgramp',
  'pass' => 'idontwantnoonebutyoutoloveme',
  'mail' => 'xgparsons@flyingburritobrothers.la',
  'signature_format' => 'full_html',
  'status' => 1,
  'language' => 'en',
  'timezone' => 'America/Los_Angeles',
  'init' => 'Email',
  'roles' => array(
    DRUPAL_AUTHENTICATED_RID => 'authenticated user',
    6 => 'member', // role id for custom roles varies per website
  ),
  'field_first_name' => array(
    'und' => array(
      0 => array(
        'value' => 'Gram',
      ),
    ),
  ),
  'field_last_name' => array(
    'und' => array(
      0 => array(
        'value' => 'Parsons',
      ),
    ),
  ),
);

$account = user_save(NULL, $new_user);

Xem bài đăng trên blog này và các ý kiến ​​để biết thêm chi tiết: http://codekarate.com/blog/create-user-account-drupal-7-programmatically


Bạn đã bỏ lỡ một dấu ngoặc trên mảng vai trò
SeanJA

2

Để tạo người dùng theo chương trình từ một địa chỉ email, hãy thử điều này:

// Use the e-mail address prefix as a user name.
$name = substr($mail, 0, strpos($mail, '@'));

// Make sure the user name isn't already taken.
$query = db_select('users', 'u')
  ->fields('u', array('uid'))
  ->condition('u.name', $name)
  ->execute();
$result = $query->fetch();

// If the user name is taken, append a random string to the end of it.
if ($result->uid) { $name .= '-' . user_password(); }

// Build the user account object and then save it.
$account = new stdClass();
$account->name = $name;
$account->mail = $mail;
$account->init = $mail;
$account->pass = user_password();
$account->status = 1;
user_save($account);
if ($account->uid) {
  drupal_set_message('Created new user with id %uid', array('%uid' => $account->uid));
}

0

Để tạo người dùng theo chương trình:

$newUser = array(
      'name' => 'theUserName,
      'pass' => 'thePassWord',
      'mail' => 'the@mail.com',
      'status' => 1,
      'roles' => array(DRUPAL_AUTHENTICATED_RID => 'authenticated user'),
      'init' =>  'the@mail.com',
  );
user_save(null, $newUser);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.