프로그래밍 방식으로 사용자 상태를 "활성"으로 설정하는 방법


8

프로그래밍 방식으로 모든 사용자를 활성으로 설정할 수 있습니까?

이 문제는 뷰를 사용하여 사용자를 표시하려고하기 때문에 발생하지만 마이그레이션 된 사용자가 "차단"되어 뷰에 표시 할 수 없습니다.

사용자 상태를 활성으로 설정하는 방법에 대한 코드 스 니펫이나 자습서를 제공 할 수 있습니까?

이것은 처음에 실행해야하는 코드입니다.

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);
}
  • 이 코드는 활성화되지 않은 계정 만로드합니다. 이미 활성화 된 계정을로드하는 것은 쓸모가 없습니다.
  • 이 코드는 익명 사용자 계정 (실제 계정이 아님)을로드하지 않도록합니다.
  • Clive는 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이 확인되지 않고 이메일이 전송되지 않습니다. 또는 코드에 표시된 대로을 FALSE호출 하기 전에 Drupal 변수 "user_mail_status_activated_notify"의 값을 설정할 수 user_save()있습니다. 해당 Drupal 변수의 값을 변경하면 전역 적으로 영향을 미치며 다른 코드가 값을로 변경하면 작동하지 않습니다 TRUE. 내 코드와 함께 저장되는 사용자 개체에 대해 호출 이 사용자에게 전자 메일을 효과적으로 보내지 않도록 $user->original하려면 $user개체 의 복사본으로 설정 하는 것이 유일한 방법 user_save()입니다.


@kiamlaluno, 코드를 사용했지만 오류가 발생합니다. 내 게시물을 업데이트했습니다. 무엇이 잘못 될 수 있는지에 대한 아이디어가 있습니까?
chlong

@chlong 내가 올바르게 기억한다면 sage데이터베이스가 Drupal이 아닌 것입니까? 그렇다면 db_set_active()코드를 실행하기 전에 호출을 제거하십시오.
Clive

@chlong 내 코드를 사용할 때 예외가 없습니다. 사용중인 데이터베이스 (로 설정된 데이터베이스 db_set_active())에 Drupal에서 설치된 테이블이 포함되어 있는지 확인하십시오 .
kiamlaluno

@kiamlaluno, 내 '세이지'데이터베이스는 drupal 데이터베이스이며 모든 drupal 테이블을 포함합니다. 그러나 'db_set_active ()'없이 실행하려고합니다-편집 : 'db_set_active ()'없이 코드가 제대로 실행되지만 내 '세이지'데이터베이스의 사용자는 수정되지 않습니다. -EDIT2 : 귀하의 코드는 실제로 작동하지만 기본 사이트의 사용자 상태 만 변경
되었으므로

@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()Entity API 모듈 에서 구현됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.