Como definir programaticamente o estado do usuário como "ativo"

8

É possível definir programaticamente todos os usuários para ativos?

Esse problema surge porque estou tentando exibir meus usuários usando o Views, mas como meus usuários migrados estão "bloqueados", não posso expô-los ao Views.

Alguém poderia fornecer um trecho de código ou um tutorial sobre como definir o status do usuário para ativo?

Este é o código que eu preciso executar no começo.

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
fonte

Respostas:

7

Eu usaria o seguinte código.

$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);
}
  • O código carrega apenas as contas que não estão ativadas. É inútil carregar as contas já ativadas.
  • O código evita carregar a conta de usuário anônimo, que não é uma conta real.
  • Clive está certo quando diz que usar user_save () Drupal pode enviar um email para os usuários habilitados. O código usado a partir da função é o seguinte.

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

    Com o meu código, a condição $account->status != $account->original->statusnão é verificada e o email não é enviado. Como alternativa, você pode definir o valor da variável Drupal "user_mail_status_activated_notify" para FALSEantes de chamar user_save(), conforme mostrado no código. Alterar o valor dessa variável Drupal teria um efeito global e não funcionaria quando outro código alterasse seu valor para TRUE. Definir $user->originaluma cópia do $userobjeto é a única maneira de garantir que a chamada user_save()não envie efetivamente nenhum email para os usuários, para os objetos de usuário que estão sendo salvos com o meu código.

kiamlaluno
fonte
@kiamlaluno, usei seu código, mas também estou recebendo erros. Atualizei minha postagem. Você tem alguma idéia do que pode estar errado?
chlong 31/05
@ chlong Se bem me lembro, seu sagebanco de dados não é Drupal, não é? Nesse caso, remova a chamada para db_set_active()antes de executar o código
Clive
@ chlong Não recebo nenhuma exceção ao usar meu código. Certifique-se de que o banco de dados que você está usando (o único conjunto db_set_active()) contenha as tabelas instaladas no Drupal.
Kiamlaluno
@kiamlaluno, meu banco de dados 'sage' é um banco de dados drupal, contém todas as tabelas drupal. Mas tentarei executar sem 'db_set_active ()' - EDIT: sem 'db_set_active ()' o código funcionará bem, mas os usuários no meu banco de dados 'sage' não são modificados. - EDIT2: seu código realmente funciona, mas apenas mudou os status dos usuários no meu site padrão, o que não é o que eu quero :(
chlong
@chlong Se "sage" for um banco de dados Drupal associado a um site Drupal, tente executar o código nesse site; se você receber o mesmo erro, o banco de dados efetivamente não conterá todas as tabelas necessárias. Até onde eu sei, o uso db_set_active()não causa nenhuma falha na consulta.
kiamlaluno
7

Você pode usar uma combinação de user_load_multiple()e user_save()atualizar a statuspropriedade dos usuários:

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

Vale lembrar que todas as notificações de e-mail que você configurou para informar os usuários sobre o status da conta serão invocadas usando esse método.

Se você não quer que isso aconteça, acho que você terá que ir diretamente para a {users}tabela e definir o status manualmente (não recomendado):

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

Dessa forma, você pode definir o status de todos os usuários como ativos.

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

entity_save()é implementado a partir do módulo API da entidade .

Shoaib Nawaz
fonte