web-dev-qa-db-fra.com

Comment définir par programme l'état utilisateur sur "actif"

Est-il possible de définir par programme tous les utilisateurs sur actifs?

Ce problème se produit car j'essaie d'afficher mes utilisateurs à l'aide de vues, mais parce que mes utilisateurs migrés sont "bloqués", je ne peux pas les exposer à des vues.

Quelqu'un pourrait-il fournir un extrait de code ou un didacticiel sur la façon de définir le statut d'utilisateur sur actif?

C'est le code que je dois exécuter au début.

define('DRUPAL_ROOT', getcwd()); 
$_SERVER['REMOTE_ADDR'] = "localhost"; 
require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; 
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); 

// Set the active DB 
db_set_active('sage'); 
8
chlong

J'utiliserais le code suivant.

$query = new EntityFieldQuery();

$result = $query->entityCondition('entity_type', 'user')
  ->propertyCondition('status', 0)
  // Avoid loading the anonymous user.
  ->propertyCondition('uid', 0, '<>')
  // Comment out the next line if you need to enable also the super user.
  ->propertyCondition('uid', 1, '<>')
  ->execute();

if (isset($result['user'])) {
  // Disable the email sent when the user account is enabled.
  // Use this code if you don't use the code marked with (1).
  // $old_value = variable_get('user_mail_status_activated_notify', TRUE);
  // variable_set('user_mail_status_activated_notify', FALSE);

  $uids = array_keys($result['user']);
  $users = entity_load('user', $uids);

  foreach ($users as $uid => $user) {
    $user->status = 1;
    $original = clone $user;      // (1)
    $user->original = $original;  // (1)
    user_save($user);
  }
  // Restore the value of the Drupal variable.
  // Use this code if you don't use the code marked with (1).
  // variable_set('user_mail_status_activated_notify', $old_value);
}
  • Le code charge uniquement les comptes qui ne sont pas activés. Il est inutile de charger les comptes déjà activés.
  • Le code évite de charger le compte utilisateur anonyme, ce n'est pas un vrai compte.
  • Clive a raison quand il dit qu'en utilisant ser_save () Drupal pourrait envoyer un email aux utilisateurs activés. Le code utilisé à partir de la fonction est le suivant.

    // Send emails after we have the new user object.
    if ($account->status != $account->original->status) {
      // The user's status is changing; conditionally send notification email.
      $op = $account->status == 1 ? 'status_activated' : 'status_blocked';
      _user_mail_notify($op, $account);
    }
    

    Avec mon code, la condition $account->status != $account->original->status N'est pas vérifiée et l'e-mail n'est pas envoyé. Comme alternative, vous pouvez définir la valeur de la variable Drupal "user_mail_status_activated_notify" sur FALSE avant d'appeler user_save(), comme indiqué dans le code. Modification de la valeur de cette variable Drupal aurait un effet global et ne fonctionnerait pas si un autre code change sa valeur en TRUE. Définir $user->original sur une copie de la L'objet $user Est le seul moyen de s'assurer que l'appel à user_save() n'envoie pas de courrier électronique aux utilisateurs, pour les objets utilisateur enregistrés avec mon code.

7
kiamlaluno

Vous pouvez utiliser une combinaison de user_load_multiple() et user_save() pour mettre à jour la propriété status des utilisateurs:

$uids = db_query('SELECT uid FROM {users}')->fetchCol();
foreach (user_load_multiple($uids) as $account) {
  $account->status = 1;
  user_save($account);
}

Il convient de garder à l'esprit que toutes les notifications par courrier que vous avez définies pour informer les utilisateurs de l'état de leur compte seront invoquées à l'aide de cette méthode.

Si vous ne voulez pas que cela se produise, je pense que vous devrez aller directement dans le {users} table et définissez le statut manuellement (non recommandé):

db_update('users')
  ->fields(array('status' => 1))
  ->execute();
7
Clive

De cette façon, vous pouvez définir l'état de tous les utilisateurs sur actif.

$users = entity_load('user');
foreach ($users as $user) {
  if ($user->uid != 0) {
    $user->status = 1;
    entity_save('user', $user);
  }
}

entity_save() est implémentée à partir du module Entity API .

2
Shoaib Nawaz