Как программно установить состояние пользователя на «активный»

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'); 
chlong
источник

Ответы:

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);
}
  • Код загружает только те учетные записи, которые не включены. Бесполезно загружать уже включенные учетные записи.
  • Код избегает загрузки учетной записи анонимного пользователя, которая не является реальной учетной записью.
  • Клайв прав, когда говорит, что с помощью 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не проверяется, и электронное письмо не отправляется. В качестве альтернативы вы можете установить значение переменной Drupal «user_mail_status_activation_notify» FALSEперед вызовом user_save(), как показано в коде. Изменение значения этой переменной Drupal будет иметь глобальный эффект, и оно не будет работать, когда другой код меняет свое значение на TRUE. Установка $user->originalкопии $userобъекта - это единственный способ убедиться, что вызов user_save()не будет эффективно отправлять электронное письмо пользователям, поскольку пользовательские объекты сохраняются с моим кодом.

киамалуно
источник
@kiamlaluno, я использовал твой код, но я также получаю ошибки. Я обновил свой пост, у вас есть идеи, что может быть не так?
Члонг
@chlong Если я правильно помню, ваша sageбаза данных не Drupal, не так ли? Если это так, удалите вызов, db_set_active()прежде чем запустить код
Клайв
@chlong Я не получаю никаких исключений при использовании моего кода. Убедитесь, что база данных, которую вы используете (та, которая установлена db_set_active()), содержит таблицы, установленные из Drupal.
kiamlaluno
@kiamlaluno, моя база данных 'sage' - это база данных drupal, она содержит все таблицы drupal. Но я попробую запустить без 'db_set_active ()' - РЕДАКТИРОВАТЬ: без 'db_set_active ()' код будет работать нормально, но пользователи в моей базе данных 'sage' не изменятся. - EDIT2: ваш код действительно работает, но он только изменил статусы пользователей на моем сайте по умолчанию, а это не то, что я хочу :(
chlong
@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 .

Шоаиб Наваз
источник