Cách lập trình trạng thái người dùng thành lập trình


8

Có thể lập trình tất cả người dùng hoạt động không?

Vấn đề này phát sinh do tôi đang cố gắng hiển thị người dùng của mình bằng Chế độ xem, nhưng vì người dùng đã di chuyển của tôi bị "chặn", tôi không thể hiển thị họ cho Chế độ xem.

Ai đó có thể cung cấp một đoạn mã hoặc hướng dẫn về cách đặt trạng thái người dùng thành hoạt động không?

Đây là mã mà tôi cần phải thực thi lúc đầu.

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

Câu trả lời:


7

Tôi sẽ sử dụng mã sau đây.

$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);
}
  • Mã chỉ tải các tài khoản không được kích hoạt. Việc tải các tài khoản đã được kích hoạt là vô ích.
  • Mã này tránh tải tài khoản người dùng ẩn danh, đó không phải là tài khoản thực.
  • Clive đã đúng khi anh ta nói rằng sử dụng user_save () Drupal có thể gửi email đến những người dùng được kích hoạt. Mã được sử dụng từ hàm là một trong những sau đây.

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

    Với mã của tôi, điều kiện $account->status != $account->original->statuskhông được xác minh và email không được gửi. Thay vào đó, bạn có thể đặt giá trị của biến Drupal "user_mail_status_activated_notify" FALSEtrước khi gọi user_save(), như được hiển thị trong mã. Thay đổi giá trị của biến Drupal đó sẽ có tác động toàn cầu và nó sẽ không hoạt động khi mã khác thay đổi giá trị của nó thành TRUE. Đặt $user->originalthành một bản sao của $userđối tượng là cách duy nhất để đảm bảo cuộc gọi user_save()không gửi bất kỳ email nào đến người dùng một cách hiệu quả, cho các đối tượng người dùng được lưu bằng mã của tôi.


@kiamlaluno, tôi đã sử dụng mã của bạn, nhưng tôi cũng đang gặp lỗi. Tôi đã cập nhật bài viết của mình, bạn có ý tưởng gì về những gì có thể sai không?
chlong

@chlong Nếu tôi nhớ không nhầm thì sagecơ sở dữ liệu của bạn không phải là Drupal phải không? Nếu vậy, hãy xóa cuộc gọi đến db_set_active()trước khi bạn chạy mã
Clive

@chlong Tôi không nhận được bất kỳ ngoại lệ nào, khi sử dụng mã của mình. Hãy chắc chắn rằng cơ sở dữ liệu bạn đang sử dụng (bộ được đặt db_set_active()) chứa các bảng được cài đặt từ Drupal.
kiamlaluno

@kiamlaluno, cơ sở dữ liệu 'sage' của tôi là một cơ sở dữ liệu drupal, nó chứa tất cả các bảng drupal. Nhưng tôi sẽ thử chạy mà không có 'db_set_active ()' - EDIT: không có 'db_set_active ()', mã sẽ chạy tốt, nhưng người dùng trong cơ sở dữ liệu 'sage' của tôi không bị sửa đổi. - EDIT2: Mã của bạn thực sự hoạt động, nhưng nó chỉ thay đổi trạng thái của người dùng trong trang web mặc định của tôi, đó không phải là điều tôi muốn :(
chlong

@chlong Nếu "sage" là một cơ sở dữ liệu Drupal liên kết với một trang web Drupal, thì hãy thử thực thi mã từ trang web đó; nếu bạn gặp cùng một lỗi, thì cơ sở dữ liệu thực sự không chứa tất cả các bảng cần thiết. Theo tôi biết, việc sử dụng db_set_active()không gây ra bất kỳ truy vấn nào.
kiamlaluno

7

Bạn có thể sử dụng kết hợp user_load_multiple()user_save()để cập nhật statustài sản của người dùng:

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

Điều đáng ghi nhớ là mọi thông báo thư bạn đã đặt để thông báo cho người dùng về trạng thái tài khoản của họ sẽ được gọi bằng phương thức này.

Nếu bạn không muốn điều đó xảy ra, tôi nghĩ bạn sẽ phải truy cập trực tiếp vào {users}bảng và đặt trạng thái theo cách thủ công (không được đề xuất):

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

2

Bằng cách này, bạn có thể đặt trạng thái của tất cả người dùng thành hoạt động.

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

entity_save()được triển khai từ mô đun API thực thể .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.