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?


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

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 = '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);

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' => '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);

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


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

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);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.