Come impostare programmaticamente lo stato utente su "attivo"


8

È possibile impostare programmaticamente tutti gli utenti su attivi?

Questo problema sorge perché sto cercando di visualizzare i miei utenti utilizzando Views, ma poiché i miei utenti migrati sono "bloccati", non riesco a esporli a Views.

Qualcuno potrebbe fornire uno snippet di codice o un tutorial su come impostare lo stato dell'utente su attivo?

Questo è il codice che devo eseguire all'inizio.

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

Risposte:


7

Vorrei usare il seguente codice.

$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);
}
  • Il codice carica solo gli account che non sono abilitati. È inutile caricare gli account già abilitati.
  • Il codice evita di caricare l'account utente anonimo, che non è un account reale.
  • Clive ha ragione quando afferma che l'utilizzo di user_save () Drupal potrebbe inviare un'e-mail agli utenti abilitati. Il codice utilizzato dalla funzione è il seguente.

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

    Con il mio codice, la condizione $account->status != $account->original->statusnon è verificata e l'e-mail non viene inviata. In alternativa, è possibile impostare il valore della variabile Drupal "user_mail_status_activated_notify" su FALSEprima di chiamare user_save(), come mostrato nel codice. La modifica del valore di quella variabile Drupal avrebbe un effetto globale e non funzionerebbe quando un altro codice cambia il suo valore in TRUE. L'impostazione $user->originalsu una copia $userdell'oggetto è l'unico modo per essere sicuri che la chiamata user_save()non invii effettivamente alcuna e-mail agli utenti, poiché gli oggetti utente vengono salvati con il mio codice.


@kiamlaluno, ho usato il tuo codice, ma ricevo anche errori. Ho aggiornato il mio post, avresti qualche idea su cosa potrebbe essere sbagliato?
Chlong,

@chlong Se ricordo bene che il tuo sagedatabase non è Drupal, non è vero? In tal caso, rimuovi la chiamata a db_set_active()prima di eseguire il codice
Clive

@chlong Non ottengo alcuna eccezione quando utilizzo il mio codice. Assicurati che il database che stai utilizzando (quello impostato con db_set_active()) contenga le tabelle installate da Drupal.
kiamlaluno

@kiamlaluno, il mio database 'sage' è un database drupal, contiene tutte le tabelle drupal. Ma proverò a correre senza 'db_set_active ()' - EDIT: senza 'db_set_active ()' il codice funzionerà bene, ma gli utenti nel mio database 'sage' non vengono modificati. - EDIT2: il tuo codice funziona davvero, ma ha cambiato solo gli stati degli utenti nel mio sito predefinito, che non è quello che voglio :(
chlong

@chlong Se "sage" è un database Drupal associato a un sito Drupal, prova a eseguire il codice da quel sito; se si ottiene lo stesso errore, il database effettivamente non contiene tutte le tabelle necessarie. Per quanto ne so, l'utilizzo db_set_active()non causa l'interruzione di alcuna query.
kiamlaluno

7

È possibile utilizzare una combinazione di user_load_multiple()e user_save()per aggiornare la statusproprietà degli utenti:

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

Vale la pena ricordare che tutte le notifiche di posta impostate per informare gli utenti sullo stato del proprio account verranno invocate con questo metodo.

Se non vuoi che ciò accada, penso che dovrai andare direttamente nella {users}tabella e impostare lo stato manualmente (non consigliato):

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

2

In questo modo è possibile impostare lo stato di tutti gli utenti su attivo.

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

entity_save()è implementato dal modulo API Entity .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.