วิธีการตั้งค่าสถานะผู้ใช้โดยทางโปรแกรมให้เป็น "active"


8

เป็นไปได้หรือไม่ที่จะตั้งผู้ใช้ทั้งหมดโดยใช้โปรแกรม

ปัญหานี้เกิดขึ้นเนื่องจากฉันพยายามแสดงผู้ใช้ของฉันโดยใช้ Views แต่เนื่องจากผู้ใช้ที่ถูกโยกย้ายของฉันนั้นถูก "ถูกบล็อค" ฉันจึงไม่สามารถเปิดเผยให้ Views ได้

ใครบางคนสามารถให้ข้อมูลโค้ดหรือบทช่วยสอนเกี่ยวกับวิธีตั้งค่าสถานะผู้ใช้ให้ทำงานได้หรือไม่

นี่คือรหัสที่ฉันต้องใช้ในการเริ่มต้น

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

คำตอบ:


7

ฉันจะใช้รหัสต่อไปนี้

$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);
}
  • รหัสจะโหลดเฉพาะบัญชีที่ไม่ได้เปิดใช้งาน การโหลดบัญชีที่เปิดใช้งานนั้นไม่มีประโยชน์
  • รหัสหลีกเลี่ยงการโหลดบัญชีผู้ใช้ที่ไม่ระบุชื่อนั่นไม่ใช่บัญชีจริง
  • ไคลฟ์นั้นถูกต้องเมื่อเขาบอกว่าการใช้user_save () Drupal สามารถส่งอีเมลไปยังผู้ใช้ที่เปิดใช้งานได้ รหัสที่ใช้จากฟังก์ชั่นดังต่อไปนี้

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

    ด้วยรหัสของฉันเงื่อนไข$account->status != $account->original->statusจะไม่ถูกตรวจสอบและอีเมลจะไม่ถูกส่ง คุณสามารถตั้งค่าตัวแปร Drupal "user_mail_status_activated_notify" เป็นFALSEก่อนเรียกได้user_save()ดังที่แสดงในรหัส การเปลี่ยนค่าของตัวแปร Drupal ว่าจะมีผลทั่วโลกและมันจะไม่ทำงานเมื่อรหัสอื่น ๆ TRUEที่มีการเปลี่ยนแปลงค่าในการ การตั้งค่า$user->originalเป็นสำเนาของ$userวัตถุเป็นวิธีเดียวที่จะมั่นใจได้ว่าการโทรไปuser_save()ยังไม่ส่งอีเมลใด ๆ ไปยังผู้ใช้อย่างมีประสิทธิภาพสำหรับวัตถุผู้ใช้ที่ถูกบันทึกด้วยรหัสของฉัน


@kiamlaluno ฉันใช้รหัสของคุณ แต่ฉันก็พบข้อผิดพลาดเช่นกัน ฉันได้อัปเดตโพสต์แล้วคุณมีความคิดใด ๆ เกี่ยวกับสิ่งที่อาจผิดหรือเปล่า?
chlong

@chlong ถ้าฉันจำได้ถูกต้องว่าsageฐานข้อมูลของคุณไม่ใช่ Drupal ใช่มั้ย หากเป็นเช่นนั้นให้ลบการเรียกไปยังdb_set_active()ก่อนที่คุณจะเรียกใช้รหัส
Clive

@ ยาวฉันไม่ได้รับการยกเว้นเมื่อใช้รหัสของฉัน ตรวจสอบให้แน่ใจว่าฐานข้อมูลที่คุณกำลังใช้ (ชุดที่มีdb_set_active()) ประกอบด้วยตารางที่ติดตั้งจาก Drupal
kiamlaluno

@ kiamlaluno ฐานข้อมูล 'sage' ของฉันเป็นฐานข้อมูล drupal ซึ่งมีตาราง drupal ทั้งหมด แต่ฉันจะลองใช้โดยไม่มี 'db_set_active ()' - แก้ไข: ไม่มี 'db_set_active ()' รหัสจะทำงานได้ดี แต่ผู้ใช้ในฐานข้อมูล 'sage' ของฉันจะไม่ถูกแก้ไข - แก้ไข 2: รหัสของคุณใช้งานได้จริง แต่มันเปลี่ยนสถานะของผู้ใช้ในเว็บไซต์เริ่มต้นของฉันเท่านั้นซึ่งไม่ใช่สิ่งที่ฉันต้องการ :(
chlong

@chlong หาก "sage" เป็นฐานข้อมูลของ Drupal ที่เชื่อมโยงกับไซต์ Drupal ให้ลองเรียกใช้งานโค้ดจากไซต์นั้น หากคุณได้รับข้อผิดพลาดเดียวกันฐานข้อมูลจะไม่มีตารางที่จำเป็นทั้งหมดอย่างมีประสิทธิภาพ เท่าที่ฉันทราบการใช้db_set_active()ไม่ทำให้แบบสอบถามใด ๆ ล้มเหลว
kiamlaluno

7

คุณสามารถใช้การรวมกันของuser_load_multiple()และuser_save()เพื่อปรับปรุงstatusคุณสมบัติของผู้ใช้:

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

โปรดทราบว่าการแจ้งเตือนทางอีเมลใด ๆ ที่คุณตั้งไว้เพื่อแจ้งให้ผู้ใช้ทราบถึงสถานะบัญชีของพวกเขาจะถูกเรียกใช้โดยใช้วิธีนี้

หากคุณไม่ต้องการให้เกิดขึ้นฉันคิดว่าคุณจะต้องเข้าไปที่{users}ตารางโดยตรงและตั้งค่าสถานะด้วยตนเอง (ไม่แนะนำ):

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

2

วิธีนี้คุณสามารถกำหนดสถานะของผู้ใช้ทั้งหมดให้ทำงานได้

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

entity_save()ถูกนำไปใช้จากโมดูลเอ็นติตี้ API

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.