Erstellen Sie einen Benutzer programmgesteuert und geben Sie ihm eine Rolle


46

Ich erstelle einen Benutzer programmgesteuert wie folgt:

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

Ich habe eine Rolle mit einer Rollen-ID von fünf. Wenn ich den Benutzer erstelle, gibt es in der Tabelle "users_roles" nur eine Zeile mit dem Wert 0 für die Rollen-ID, aber wenn ich das Benutzerobjekt mit drucke var_dump(), sieht es so aus, als würden die Rollen erstellt.

Was mache ich falsch?


Es überprüft nur den Wert auf Richtigkeit, der Schlüssel ist das Entscheidende. array($role_id => 'anything')
RaisinBranCrunch

Antworten:


46

Dieser Code hat bei mir funktioniert:

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

Soll ich das Passwort schreiben, wird ein Passwort wie "abc12345" und user_save () in md5 konvertiert?
Xstean

1
user_savekümmert sich darum
Gulok

Solange das Passwort im user_save()zweiten Argument steht, wird es gehasht. Wenn Sie user_save($account)ohne das $editArgument auskommen, findet keine MD5-Konvertierung statt. Die Antwort von @SMTF unten zeigt dies.
Alec

Dank rettete meinen Tag
Rishab

13

Dies ist ein Beispiel, das ich auf einer Website gefunden habe.

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

Entschuldigung, ich denke, DRUPAL_AUTHENTICATED_RID => TRUE scheint falsch zu sein, und ich denke nicht, dass user_hash_password benötigt wird.
Stefgosselin

user_hash_password('bar');ist falsch
Joel James

Es gibt einige Fälle, in denen das user_save()Hashing von Passwörtern vor dem Speichern fehlschlägt (nach meiner eigenen Erfahrung und wenn ich andere im Internet sehe, tritt dies gelegentlich auch auf). Ich weiß nicht warum (aber ich würde gerne!). In diesen Fällen erscheint ein Anruf user_hash_password()notwendig.
Alec

Der Code in dieser Antwort nicht erforderlich user_hash_password()manuell aufgerufen werden. Dies liegt daran, dass es nicht $editan die user_save(). Wenn der Code enthält $edit = array('pass' => 'bar');(was diese Antwort nicht tut) $account->pass = user_hash..., können user_save($account, $edit);und user_save()werden Sie stattdessen das Hashing für Sie durchführen.
Alec

13

Um einen Benutzer mit Rollen und benutzerdefinierten Feldwerten (wie z. B. Vorname und Nachname) programmgesteuert zu erstellen, können Sie den folgenden Code verwenden:

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

Weitere Informationen finden Sie in diesem Blogeintrag und in den Kommentaren: http://codekarate.com/blog/create-user-account-drupal-7-programmatically


Sie haben eine Klammer im Rollen-Array verpasst
SeanJA

2

Gehen Sie folgendermaßen vor, um einen Benutzer programmgesteuert von einer E-Mail-Adresse aus zu erstellen:

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

So erstellen Sie einen Benutzer programmgesteuert:

$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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.