如何以编程方式将用户状态设置为“活动”


8

是否可以通过编程将所有用户设置为活动状态?

出现此问题是因为我试图使用Views显示用户,但是由于迁移的用户被“阻止”,因此我无法将其公开给Views。

有人可以提供一段代码或有关如何将用户状态设置为活动的教程吗?

这是我一开始需要执行的代码。

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

Answers:


7

我将使用以下代码。

$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)说对了,说使用user_save() Drupal可以向启用的用户发送电子邮件是正确的。该函数使用的代码如下。

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

    使用我的代码,条件$account->status != $account->original->status未得到验证,并且电子邮件也未发送。或者,您可以FALSE在调用之前将Drupal变量“ user_mail_status_activated_notify”的值设置为user_save(),如代码中所示。更改该Drupal变量的值将具有全局作用,并且当其他代码将其值更改为时,它将不起作用TRUE。设置$user->original$user对象的副本是确保调用user_save()不会有效地向用户发送任何电子邮件的唯一方法,因为用户对象已与我的代码一起保存。


@kiamlaluno,我使用了您的代码,但我也遇到错误。我更新了我的帖子,您对可能出什么问题有任何想法吗?
chlong

@chlong如果我没记错的话,您的sage数据库不是Drupal,不是吗?如果是这样,请db_set_active()在运行代码之前删除对
Clive

@chlong在使用我的代码时,我没有任何异常。确保您使用的数据库(带有的一组数据库db_set_active())包含从Drupal安装的表。
kiamlaluno

@kiamlaluno,我的“ sage”数据库是一个drupal数据库,它包含所有drupal表。但是,我将尝试在没有'db_set_active()'的情况下运行-编辑:如果没有'db_set_active()',代码将正常运行,但是我的'sage'数据库中的用户未修改。-EDIT2:您的代码确实有效,但是它只更改了我默认站点中用户的状态,这不是我想要的:(
chlong 2012年

@chlong如果“ sage”是与Drupal站点关联的Drupal数据库,则尝试从该站点执行代码;如果您遇到相同的错误,则数据库实际上不会包含所有必需的表。据我所知,使用db_set_active()不会导致任何查询失败。
kiamlaluno

7

您可以结合使用user_load_multiple()user_save()更新status用户的属性:

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

值得牢记的是,使用此方法将调用您为通知用户帐户状态而设置的任何邮件通知。

如果您不希望发生这种情况,我认为您必须直接进入{users}表格并手动设置状态(不建议):

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

2

这样,您可以将所有用户的状态设置为活动。

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

entity_save()是通过Entity API模块实现的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.