Bagaimana secara pemrograman mengatur status pengguna ke "aktif"

8

Apakah mungkin untuk secara terprogram mengatur semua pengguna agar aktif?

Masalah ini muncul karena saya mencoba untuk menampilkan pengguna saya menggunakan Tampilan, tetapi karena pengguna saya yang dimigrasi "diblokir", saya tidak dapat mengekspos mereka ke Tampilan.

Bisakah seseorang memberikan potongan kode atau tutorial tentang cara mengatur status pengguna agar aktif?

Ini adalah kode yang perlu saya jalankan di awal.

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
sumber

Jawaban:

7

Saya akan menggunakan kode berikut.

$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);
}
  • Kode hanya memuat akun yang tidak diaktifkan. Percuma memuat akun yang sudah diaktifkan.
  • Kode ini menghindari pemuatan akun pengguna anonim, itu bukan akun nyata.
  • Clive benar ketika ia mengatakan bahwa menggunakan user_save () Drupal dapat mengirim email ke pengguna yang diaktifkan. Kode yang digunakan dari fungsi adalah yang berikut.

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

    Dengan kode saya, kondisinya $account->status != $account->original->statustidak diverifikasi, dan email tidak terkirim. Sebagai alternatif, Anda dapat mengatur nilai variabel Drupal "user_mail_status_activated_notify" FALSEsebelum memanggil user_save(), seperti yang ditunjukkan dalam kode. Mengubah nilai variabel Drupal itu akan memiliki efek global, dan itu tidak akan berfungsi ketika kode lain mengubah nilainya menjadi TRUE. Menyetel $user->originalsalinan $userobjek adalah satu-satunya cara untuk memastikan panggilan user_save()tidak secara efektif mengirim email kepada pengguna, karena objek pengguna disimpan dengan kode saya.

kiamlaluno
sumber
@kiamlaluno, saya menggunakan kode Anda, tetapi saya juga mendapatkan kesalahan. Saya telah memperbarui posting saya, apakah Anda punya ide tentang apa yang salah?
chlong
@ chlong Jika saya ingat benar sagedatabase Anda bukan yang Drupal bukan? Jika demikian, hapus panggilan ke db_set_active()sebelum Anda menjalankan kode
Clive
@ Long Saya tidak mendapatkan pengecualian, saat menggunakan kode saya. Pastikan database yang Anda gunakan (satu set dengan db_set_active()) berisi tabel yang diinstal dari Drupal.
kiamlaluno
@kiamlaluno, database 'sage' saya adalah database drupal, berisi semua tabel drupal. Tapi saya akan mencoba menjalankan tanpa 'db_set_active ()' - EDIT: tanpa 'db_set_active ()' kode akan berjalan dengan baik, tetapi pengguna dalam database 'sage' saya tidak dimodifikasi. - EDIT2: Kode Anda memang berfungsi, tetapi hanya mengubah status pengguna di situs default saya, yang bukan yang saya inginkan :(
chlong
@ chlong Jika "sage" adalah asosiasi database Drupal dengan situs Drupal, maka coba jalankan kode dari situs itu; jika Anda mendapatkan kesalahan yang sama, maka basis data secara efektif tidak mengandung semua tabel yang diperlukan. Sejauh yang saya tahu, menggunakan db_set_active()tidak menyebabkan permintaan gagal.
kiamlaluno
7

Anda dapat menggunakan kombinasi user_load_multiple()dan user_save()untuk memperbarui statusproperti pengguna:

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

Perlu diingat bahwa pemberitahuan email yang telah Anda tetapkan untuk memberi tahu pengguna tentang status akun mereka akan diminta menggunakan metode ini.

Jika Anda tidak ingin itu terjadi, saya pikir Anda harus langsung masuk ke {users}tabel dan mengatur status secara manual (tidak disarankan):

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

Dengan cara ini Anda dapat mengatur status semua pengguna agar aktif.

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

entity_save()diimplementasikan dari modul Entity API .

Shoaib Nawaz
sumber