Cómo establecer programáticamente el estado del usuario en "activo"

8

¿Es posible configurar programáticamente a todos los usuarios para que estén activos?

Este problema surge porque estoy tratando de mostrar a mis usuarios usando Vistas, pero debido a que mis usuarios migrados están "bloqueados", no puedo exponerlos a Vistas.

¿Podría alguien proporcionar un fragmento de código o un tutorial sobre cómo configurar el estado del usuario como activo?

Este es el código que necesito ejecutar al principio.

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
fuente

Respuestas:

7

Yo usaría el siguiente 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);
}
  • El código carga solo las cuentas que no están habilitadas. Es inútil cargar las cuentas ya habilitadas.
  • El código evita cargar la cuenta de usuario anónimo, que no es una cuenta real.
  • Clive tiene razón cuando dice que usando user_save () Drupal podría enviar un correo electrónico a los usuarios habilitados. El código utilizado desde la función es el siguiente.

    // 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 mi código, la condición $account->status != $account->original->statusno se verifica y el correo electrónico no se envía. Como alternativa, puede establecer el valor de la variable Drupal "user_mail_status_activated_notify" FALSEantes de llamar user_save(), como se muestra en el código. Cambiar el valor de esa variable Drupal tendría un efecto global y no funcionaría cuando otro código cambie su valor a TRUE. Establecer $user->originaluna copia del $userobjeto es la única forma de asegurarse de que la llamada user_save()no envíe de manera efectiva ningún correo electrónico a los usuarios, ya que los objetos de usuario se guardan con mi código.

kiamlaluno
fuente
@kiamlaluno, usé tu código, pero también recibo errores. He actualizado mi publicación, ¿tendrían alguna idea sobre lo que podría estar mal?
chlong
@chlong Si recuerdo correctamente, su sagebase de datos no es Drupal, ¿no es así? Si es así, elimine la llamada db_set_active()antes de ejecutar el código
Clive
@chlong No obtengo ninguna excepción cuando uso mi código. Asegúrese de que la base de datos que está utilizando (la que está configurada con db_set_active()) contiene las tablas instaladas desde Drupal.
kiamlaluno
@kiamlaluno, mi base de datos 'sage' es una base de datos drupal, contiene todas las tablas de drupal. Pero intentaré ejecutar sin 'db_set_active ()' - EDITAR: sin 'db_set_active ()' el código funcionará bien, pero los usuarios en mi base de datos 'sage' no se modifican. - EDIT2: su código funciona, pero solo cambió los estados de los usuarios en mi sitio predeterminado, que no es lo que quiero :(
chlong
@chlong Si "sage" es una base de datos de Drupal asociada con un sitio de Drupal, intente ejecutar el código desde ese sitio; Si obtiene el mismo error, la base de datos no contiene todas las tablas necesarias. Hasta donde yo sé, el uso db_set_active()no hace que ninguna consulta falle.
kiamlaluno
7

Puede usar una combinación de user_load_multiple()y user_save()para actualizar la statuspropiedad de los usuarios:

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

Vale la pena tener en cuenta que cualquier notificación de correo que haya configurado para informar a los usuarios sobre el estado de su cuenta se invocará utilizando este método.

Si no desea que eso suceda, creo que tendrá que ir directamente a la {users}tabla y establecer el estado manualmente (no recomendado):

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

De esta manera, puede establecer el estado de todos los usuarios como activos.

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

entity_save()se implementa desde el módulo Entity API .

Shoaib Nawaz
fuente