So setzen Sie den Benutzerstatus programmgesteuert auf "aktiv"

8

Ist es möglich, alle Benutzer programmgesteuert auf aktiv zu setzen?

Dieses Problem tritt auf, weil ich versuche, meine Benutzer mithilfe von Ansichten anzuzeigen. Da meine migrierten Benutzer jedoch "blockiert" sind, kann ich sie nicht für Ansichten verfügbar machen.

Könnte jemand einen Codeausschnitt oder ein Tutorial zum Setzen des Benutzerstatus auf Aktiv bereitstellen?

Dies ist der Code, den ich am Anfang ausführen muss.

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
quelle

Antworten:

7

Ich würde den folgenden Code verwenden.

$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);
}
  • Der Code lädt nur die Konten, die nicht aktiviert sind. Es ist sinnlos, die bereits aktivierten Konten zu laden.
  • Der Code vermeidet das Laden des anonymen Benutzerkontos, das kein echtes Konto ist.
  • Clive hat Recht, wenn er sagt, dass die Verwendung von user_save () Drupal eine E-Mail an die aktivierten Benutzer senden könnte. Der von der Funktion verwendete Code ist der folgende.

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

    Mit meinem Code wird der Zustand $account->status != $account->original->statusnicht überprüft und die E-Mail wird nicht gesendet. Alternativ können Sie den Wert der Drupal-Variablen "user_mail_status_activated_notify" FALSEvor dem Aufruf auf festlegen user_save(), wie im Code gezeigt. Das Ändern des Werts dieser Drupal-Variablen hätte globale Auswirkungen und würde nicht funktionieren, wenn anderer Code seinen Wert in ändert TRUE. Das Festlegen $user->originaleiner Kopie des $userObjekts ist die einzige Möglichkeit, um sicherzustellen, dass der Aufruf zum user_save()Senden von E-Mails an die Benutzer nicht effektiv ist, da die Benutzerobjekte mit meinem Code gespeichert werden.

kiamlaluno
quelle
@kiamlaluno, ich habe Ihren Code verwendet, aber ich erhalte auch Fehler. Ich habe meinen Beitrag aktualisiert. Haben Sie Ideen, was falsch sein könnte?
Chlong
@chlong Wenn ich mich recht erinnere, ist Ihre sageDatenbank eine Nicht-Drupal-Datenbank, nicht wahr ? Wenn ja, entfernen Sie den Aufruf von, db_set_active()bevor Sie den Code ausführen
Clive
@chlong Ich bekomme keine Ausnahme, wenn ich meinen Code verwende. Stellen Sie sicher, dass die von Ihnen verwendete Datenbank (die mit db_set_active()) die von Drupal installierten Tabellen enthält.
Kiamlaluno
@kiamlaluno, meine 'sage'-Datenbank ist eine Drupal-Datenbank, die alle Drupal-Tabellen enthält. Aber ich werde versuchen, ohne 'db_set_active ()' auszuführen - BEARBEITEN: Ohne 'db_set_active ()' läuft der Code einwandfrei, aber die Benutzer in meiner 'sage'-Datenbank werden nicht geändert. - EDIT2: Ihr Code funktioniert zwar, aber er hat nur den Status der Benutzer auf meiner Standard-Site geändert, was ich nicht möchte :(
chlong
@chlong Wenn "sage" eine Drupal-Datenbank ist, die einer Drupal-Site zugeordnet ist, versuchen Sie, den Code von dieser Site auszuführen. Wenn Sie denselben Fehler erhalten, enthält die Datenbank effektiv nicht alle erforderlichen Tabellen. Soweit ich weiß, db_set_active()schlägt die Verwendung bei keiner Abfrage fehl.
Kiamlaluno
7

Sie können eine Kombination von user_load_multiple()und verwenden user_save(), um die statusEigenschaften der Benutzer zu aktualisieren :

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

Beachten Sie, dass alle E-Mail-Benachrichtigungen, die Sie festgelegt haben, um Benutzer über ihren Kontostatus zu informieren, mit dieser Methode aufgerufen werden.

Wenn Sie nicht möchten, dass dies geschieht, müssen Sie direkt in die {users}Tabelle gehen und den Status manuell festlegen (nicht empfohlen):

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

Auf diese Weise können Sie den Status aller Benutzer auf aktiv setzen.

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

entity_save()wird aus dem Entity API- Modul implementiert .

Shoaib Nawaz
quelle