Créer un utilisateur par programme et lui donner un rôle

46

Je crée un utilisateur par programme comme ceci:

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

J'ai un rôle avec l'ID de rôle égal à cinq; lorsque je crée l'utilisateur, dans la table "users_roles", il n'y a qu'une ligne avec la valeur 0 pour l'ID de rôle, mais si j'imprime l'objet utilisateur avec var_dump(), les rôles sont créés.

Qu'est-ce que je fais mal?

Nicola Peluchetti
la source
Il vérifie uniquement la véracité de la valeur, la clé est ce qui compte. array($role_id => 'anything')
RaisinBranCrunch le

Réponses:

46

Ce code a fonctionné pour moi:

$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
la source
Devrais-je écrire le mot de passe un mot de passe comme "abc12345" et user_save () va convertir en md5?
xstean
1
user_saveva s'en occuper
Gulok
Tant que le mot de passe est dans user_save()le deuxième argument, il sera haché. Si vous le faites user_save($account)sans l' $editargument puis la conversion md5 ne se produit pas. La réponse de @SMTF ci-dessous montre cela.
Alec
Merci a sauvé ma journée
Rishab
13

Ceci est un exemple que j'ai trouvé sur un site.

$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
la source
Désolé, je pense que DRUPAL_AUTHENTICATED_RID => TRUE semble faux, et je ne pense pas que user_hash_password soit nécessaire.
stefgosselin
user_hash_password('bar');a tort
Joel James
Dans certains cas, user_save()les mots de passe ne parviennent pas à être hachés avant d'être enregistrés (ce que je sais personnellement et d'autres utilisateurs du Web peuvent également le rencontrer de temps en temps). Je ne sais pas pourquoi (mais j'aimerais bien!). Dans ces cas, l'appel user_hash_password()semble nécessaire.
Alec
Le code de cette réponse ne nécessite user_hash_password()d'être appelé manuellement. C'est parce que ça ne passe pas $edità la user_save(). Si le code comprend $edit = array('pass' => 'bar');(ce que cette réponse ne contient pas), au lieu de le faire, $account->pass = user_hash...vous pouvez le faire user_save($account, $edit);et vous user_save()ferez le hachage à votre place.
Alec
13

Pour créer par programme un utilisateur avec des rôles et des valeurs de champs personnalisés (par exemple, Prénom et Nom), vous pouvez utiliser le code suivant:

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

Voir cet article de blog et les commentaires pour plus de détails: http://codekarate.com/blog/create-user-account-drupal-7-programmatically

batigolix
la source
Vous avez manqué un crochet sur le tableau de rôles
SeanJA
2

Pour créer un utilisateur par programme à partir d'une adresse de messagerie, essayez ceci:

// 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
la source
0

Pour créer un utilisateur par programme:

$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
la source