Cree un usuario mediante programación y dele un rol

46

Estoy creando un usuario programáticamente como este:

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

Tengo un rol con el ID de rol igual a cinco; cuando creo el usuario, en la tabla "users_roles" solo hay una fila con el valor 0 para el ID de rol, pero si imprimo el objeto de usuario con var_dump(), parece que los roles están creados.

¿Qué estoy haciendo mal?

Nicola Peluchetti
fuente
Solo verifica la veracidad del valor, la clave es lo que importa. array($role_id => 'anything')
RaisinBranCrunch

Respuestas:

46

Este código funcionó para mí:

$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
fuente
¿Debo escribir la contraseña, una contraseña como "abc12345" y user_save () se convertirá en md5?
xstean
1
user_savese encargará de eso
Gulok
Mientras la contraseña esté en user_save()el segundo argumento, se convertirá en hash. Si no tiene user_save($account)el $editargumento, la conversión de md5 no ocurre. La respuesta de @SMTF a continuación lo demuestra.
alec
Gracias me salvó el día
Rishab
13

Este es un ejemplo que encontré en un sitio.

$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
fuente
Lo sentimos, creo que DRUPAL_AUTHENTICATED_RID => TRUE parece incorrecto, y no creo que se necesite user_hash_password.
stefgosselin
user_hash_password('bar');está mal
Joel James
Hay algunos casos en los que user_save()no se pueden generar contraseñas hash antes de guardarlas (en mi propia experiencia y veo que otras personas en la web también lo experimentan ocasionalmente). No sé por qué (¡pero me gustaría!). En estos casos, las llamadas user_hash_password()parecen necesarias.
alec
El código en esta respuesta no requiere user_hash_password()ser llamado de forma manual. Esto se debe a que no está pasando $edita la user_save(). Si el código incluye $edit = array('pass' => 'bar');(que esta respuesta no incluye ), en lugar de hacerlo $account->pass = user_hash..., puede hacer user_save($account, $edit);y user_save()hará el hashing por usted.
alec
13

Para crear un usuario mediante programación con roles y valores de campo personalizados (como, por ejemplo, Nombre y Apellido) puede usar el siguiente código:

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

Consulte esta publicación de blog y los comentarios para obtener más detalles: http://codekarate.com/blog/create-user-account-drupal-7-programmatic

batigolix
fuente
Te perdiste un paréntesis en el conjunto de roles
SeanJA
2

Para crear un usuario mediante programación desde una dirección de correo electrónico, intente esto:

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

Para crear un usuario mediante programación:

$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
fuente