สร้างผู้ใช้โดยทางโปรแกรมและให้บทบาทแก่พวกเขา


46

ฉันกำลังสร้างผู้ใช้โดยทางโปรแกรมเช่นนี้:

$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);

ฉันมีบทบาทกับ ID บทบาทเท่ากับห้า; เมื่อฉันสร้างผู้ใช้ในตาราง "users_roles" มีเพียงแถวที่มีค่า 0 สำหรับ ID บทบาท แต่ถ้าฉันพิมพ์วัตถุผู้ใช้ด้วยvar_dump()ดูเหมือนว่าบทบาทจะถูกสร้างขึ้น

ผมทำอะไรผิดหรือเปล่า?


เพียงตรวจสอบความจริงเกี่ยวกับคุณค่ากุญแจสำคัญคือสิ่งที่สำคัญ array($role_id => 'anything')
RaisinBranCrunch

คำตอบ:


46

รหัสนี้เหมาะกับฉัน:

$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);

ฉันควรเขียนรหัสผ่านรหัสผ่านเช่น "abc12345" และ user_save () จะแปลงเป็น md5 หรือไม่
xstean

1
user_saveจะดูแลมัน
Gulok

ตราบใดที่รหัสผ่านอยู่ในuser_save()อาร์กิวเมนต์ที่สองมันจะถูกแฮช หากคุณuser_save($account)ไม่มี$editอาร์กิวเมนต์การแปลง md5 จะไม่เกิดขึ้น คำตอบของ @SMTF ด้านล่างนี้แสดงให้เห็นถึงสิ่งนี้
อเล็กซ์

ขอบคุณบันทึกวันของฉัน
Rishab

13

นี่คือตัวอย่างที่ฉันพบในไซต์

$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);

ขออภัยฉันคิดว่า DRUPAL_AUTHENTICATED_RID => TRUE ดูเหมือนจะผิดและฉันไม่คิดว่าจำเป็นต้องใช้ user_hash_password
stefgosselin

user_hash_password('bar');เป็นสิ่งที่ผิด
โจเอลเจมส์

มีบางกรณีที่user_save()ล้มเหลวในการแฮรหัสผ่านก่อนที่จะบันทึกพวกเขา (ในประสบการณ์ของฉันเองและฉันเห็นคนอื่น ๆ ในเว็บยังประสบมันเป็นครั้งคราว) ฉันไม่รู้ว่าทำไม (แต่ฉันต้องการ!) ในกรณีเหล่านี้การโทรuser_hash_password()ดูเหมือนจำเป็น
อเล็กซ์

รหัสในคำตอบนี้ไม่จำเป็นต้องuser_hash_password()เรียกด้วยตนเอง นี้เป็นเพราะไม่ได้ผ่านไป$edit user_save()หากรหัสรวมถึง$edit = array('pass' => 'bar');(ซึ่งคำตอบนี้ไม่ได้) แล้วแทนที่จะทำ$account->pass = user_hash...คุณสามารถทำได้user_save($account, $edit);และuser_save()จะทำ hashing ให้คุณ
อเล็กซ์

13

ในการสร้างผู้ใช้ด้วยบทบาทและค่าฟิลด์ที่กำหนดเอง (เช่นชื่อและนามสกุล) โดยทางโปรแกรมคุณสามารถใช้รหัสต่อไปนี้:

$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);

ดูโพสต์บล็อกนี้และความคิดเห็นสำหรับรายละเอียดเพิ่มเติม: http://codekarate.com/blog/create-user-account-drupal-7-programmatically


คุณพลาดวงเล็บในอาร์เรย์บทบาท
SeanJA

2

หากต้องการสร้างผู้ใช้โดยทางโปรแกรมจากที่อยู่อีเมลให้ลองสิ่งนี้:

// 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

ในการสร้างผู้ใช้โดยทางโปรแกรม:

$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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.