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

8

Est-il possible de programmer tous les utilisateurs comme 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'); 
chlong
la source

Réponses:

7

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 que l'utilisation de user_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->statusn'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 FALSEavant d'appeler user_save(), comme indiqué dans le code. Changer la valeur de cette variable Drupal aurait un effet global, et cela ne fonctionnerait pas quand un autre code change sa valeur en TRUE. La définition $user->originald'une copie de l' $userobjet est le seul moyen de s'assurer que l'appel à user_save()n'envoie aucun e-mail aux utilisateurs, pour les objets utilisateur enregistrés avec mon code.

kiamlaluno
la source
@kiamlaluno, j'ai utilisé votre code, mais je reçois également des erreurs. J'ai mis à jour mon message, auriez-vous des idées sur ce qui pourrait mal se passer?
chlong
@chlong Si je me souviens bien, votre sagebase de données n'est pas Drupal, n'est-ce pas? Si tel est le cas, supprimez l'appel à db_set_active()avant d'exécuter le code
Clive
@chlong Je ne reçois aucune exception lorsque j'utilise mon code. Assurez-vous que la base de données que vous utilisez (celle définie avec db_set_active()) contient les tables installées à partir de Drupal.
kiamlaluno
@kiamlaluno, ma base de données 'sage' est une base de données drupal, elle contient toutes les tables drupal. Mais j'essaierai de courir sans 'db_set_active ()' - EDIT: sans 'db_set_active ()' le code fonctionnera bien, mais les utilisateurs de ma base de données 'sage' ne sont pas modifiés. - EDIT2: Votre code fonctionne bien, mais il n'a changé que les statuts des utilisateurs de mon site par défaut, ce qui n'est pas ce que je veux :(
chlong
@chlong Si "sage" est une base de données Drupal associée à un site Drupal, essayez d'exécuter le code à partir de ce site; si vous obtenez la même erreur, la base de données ne contient en fait pas toutes les tables nécessaires. Pour autant que je sache, l'utilisation db_set_active()n'entraîne l'échec d'aucune requête.
kiamlaluno
7

Vous pouvez utiliser une combinaison de user_load_multiple()et user_save()pour mettre à jour la statuspropriété 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}tableau et définir le statut manuellement (non recommandé):

db_update('users')
  ->fields(array('status' => 1))
  ->execute();
Clive
la source
2

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é à partir du module Entity API .

Shoaib Nawaz
la source