プログラムでユーザー状態を「アクティブ」に設定する方法


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、私の 'sage'データベースはdrupalデータベースで、すべてのdrupalテーブルが含まれています。しかし、私は 'db_set_active()'なしで実行してみます-編集: 'db_set_active()'なしでコードは正常に実行されますが、私の 'sage'データベースのユーザーは変更されません。-EDIT2:あなたのコードは実際に機能しますが、デフォルトサイトのユーザーのステータスのみを変更しました。これは私が望んでいるものではありません:(
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()Entity APIモジュールから実装されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.