Як програмно встановити стан користувача на "активний"


8

Чи можливо програмно налаштувати всіх користувачів на активних?

Ця проблема виникає через те, що я намагаюся відображати своїх користувачів за допомогою 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'); 

Відповіді:


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_activate_notify" до FALSEвиклику user_save(), як показано в коді. Зміна значення цієї змінної Drupal матиме глобальний ефект, і вона не працюватиме, коли інший код змінює своє значення на TRUE. Налаштування $user->originalна копію $userоб'єкта - це єдиний спосіб переконатися, що дзвінок user_save()не надсилає користувачам жодного електронного листа, оскільки об’єкти користувачів зберігаються за допомогою мого коду.


@kiamlaluno, я використовував ваш код, але я також отримую помилки. Я оновив свій пост, чи є у вас якісь ідеї щодо того, що може бути не так?
chlong

@chlong Якщо я правильно пам’ятаю, ваша sageбаза даних не є друпальською, чи не так? Якщо так, видаліть дзвінок до db_set_active()того, як запустити код
Clive

@chlong Я не отримую жодного винятку, коли використовую свій код. Переконайтеся, що база даних, яку ви використовуєте (той самий комплект db_set_active()) містить таблиці, встановлені від Drupal
kiamlaluno

@kiamlaluno, моя "мудрець" база даних - це друпальська база даних, вона містить усі таблиці друпалів. Але я спробую запустити без 'db_set_active ()' - EDIT: без 'db_set_active ()' код буде спрацьовувати нормально, але користувачі в моїй базі даних 'мудрець' не змінюються. - 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()реалізується з модуля API Entity .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.