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?

Nicola Peluchetti
quelle
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);
Nebojsa
quelle
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 = '[email protected]';
$account->init = '[email protected]';
$account->status = TRUE;
$account->roles = array(DRUPAL_AUTHENTICATED_RID => TRUE);
$account->timezone = variable_get('date_default_timezone', '');
user_save($account);
SMTF
quelle
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' => '[email protected]',
  '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

Batigolix
quelle
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));
}
tyler.frankenstein
quelle
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);
houmem
quelle