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');
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);
}
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.
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();
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 .