Jak programowo ustawić stan użytkownika na „aktywny”

8

Czy można programowo ustawić wszystkich użytkowników na aktywnych?

Ten problem powstaje, ponieważ próbuję wyświetlić moich użytkowników za pomocą Widoków, ale ponieważ migrowani użytkownicy są „zablokowani”, nie mogę ich wystawić na Widoki.

Czy ktoś może dostarczyć fragment kodu lub samouczek, jak ustawić status użytkownika na aktywny?

To jest kod, który muszę wykonać na początku.

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
źródło

Odpowiedzi:

7

Chciałbym użyć następującego kodu.

$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);
}
  • Kod ładuje tylko konta, które nie są włączone. Załadowanie kont już włączonych jest bezużyteczne.
  • Kod unika ładowania konta anonimowego użytkownika, które nie jest prawdziwym kontem.
  • Clive ma rację, gdy mówi, że za pomocą user_save () Drupal może wysłać wiadomość e-mail do włączonych użytkowników. Kod użyty z funkcji jest następujący.

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

    W przypadku mojego kodu warunek $account->status != $account->original->statusnie jest weryfikowany, a wiadomość e-mail nie jest wysyłana. Alternatywnie można ustawić wartość zmiennej Drupal „user_mail_status_activated_notify” na FALSEprzed wywołaniem user_save(), jak pokazano w kodzie. Zmiana wartości tej zmiennej Drupal miałaby globalny efekt i nie działałaby, gdy inny kod zmienia swoją wartość na TRUE. Ustawienie $user->originalkopii $userobiektu jest jedynym sposobem, aby upewnić się, że wywołanie do user_save()nie wysyła e-maili do użytkowników, ponieważ obiekty użytkowników są zapisywane z moim kodem.

kiamlaluno
źródło
@kiamlaluno, użyłem twojego kodu, ale dostaję również błędy. Zaktualizowałem swój post, czy masz jakieś pomysły na to, co może być nie tak?
chlong
@chlong Jeśli dobrze pamiętam, twoja sagebaza danych nie jest Drupalem, prawda? Jeśli tak, usuń połączenie, db_set_active()zanim uruchomisz kod
Clive
@chlong Nie dostaję żadnego wyjątku, kiedy używam mojego kodu. Upewnij się, że baza danych, której używasz (ten z zestawem db_set_active()), zawiera tabele zainstalowane z Drupala.
kiamlaluno
@kiamlaluno, moja baza danych 'sage' jest bazą danych drupal, zawiera wszystkie tabele drupal. Ale spróbuję uruchomić bez „db_set_active ()” - EDYCJA: bez „db_set_active ()” kod będzie działał poprawnie, ale użytkownicy w mojej bazie danych „sage” nie zostaną zmodyfikowani. - EDIT2: Twój kod rzeczywiście działa, ale zmienił tylko statusy użytkowników w mojej domyślnej witrynie, czego nie chcę :(
chlong
@chlong Jeśli „mędrzec” jest bazą danych Drupal powiązaną z witryną Drupal, spróbuj wykonać kod z tej witryny; jeśli wystąpi ten sam błąd, baza danych faktycznie nie zawiera wszystkich niezbędnych tabel. O ile wiem, użycie db_set_active()nie powoduje niepowodzenia żadnego zapytania.
kiamlaluno
7

Możesz użyć kombinacji user_load_multiple()i, user_save()aby zaktualizować statuswłaściwość użytkowników:

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

Warto pamiętać, że wszelkie powiadomienia pocztowe ustawione w celu informowania użytkowników o stanie ich konta będą wywoływane przy użyciu tej metody.

Jeśli nie chcesz, aby tak się stało, myślę, że musisz przejść bezpośrednio do {users}tabeli i ręcznie ustawić status (niezalecane):

db_update('users')
  ->fields(array('status' => 1))
  ->execute();
Clive
źródło
2

W ten sposób możesz ustawić status wszystkich użytkowników na aktywny.

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

entity_save()jest implementowany z modułu Entity API .

Shoaib Nawaz
źródło