web-dev-qa-db-ja.com

Drupal 6のユーザーをプログラムで削除するにはどうすればよいですか?

私はDrupal開発に不慣れで、これについて頭を悩ませています。私の会社は、企業に市場調査を提供するサブスクリプションベースのサイトを運営しています。会社はサブスクリプションの料金を支払い、特定の数のユーザー。プライマリユーザーとして指定されたユーザーは、残りのユーザーを自分で追加できます。次に、会社に存在しないユーザーを削除できるようにする機能を追加する必要があります。これを行うには、起こるために続く:

  1. 「ユーザー」データベーステーブルからレコードを削除する
  2. 削除されたユーザーによって作成されたノードの作成者を「匿名」に変更します
  3. ユーザーを接続されていない他のシステムから削除する必要があることを通知するメールを社内サポートアドレスに送信します

以前の開発者は、いくつかの異なる状況でユーザーを追加できるアカウント管理用のカスタムモジュールを作成しました。たとえば、ユーザーはそれを追加する会社にとってまったく新しいものです。つまり、すでに接続されているユーザーにDrupalアカウントを提供するのではなく、他の接続されていないシステムにも追加する必要があります。他のシステムでは。
現在、JavaScriptで_Drupal.parseJson_を使用して、クリックされたURLのセグメントに基づいてリクエストを処理するために多くのことが行われています。これは、完全に更新せずにユーザーリストでページを更新できるという唯一の理由で行われました。私は個人的に、この新しい機能がそのように機能するのか、それともサーバーにアクセスしてページを更新する必要があるのか​​は気にしません。上記のリストのすべてをワンクリックで実行する方法を見つける必要があります。

私はAPIを調べて_user_delete_を見つけましたが、これには_$edit_と_$uid_の2つのパラメーターが必要です。 uidは問題ありませんが、_$edit_について私が見つけることができるのは、それが「送信されたフォーム値の配列」であることだけです。ただし、フォームは使用していません。ユーザーリストは静的テキストであり、アクションはすべて(この時点で)hrefのクリック時に発生します。何も提出されていません。 _$edit_の値を偽造できる方法はありますか?またはこれを行う別の方法はありますか?私はhook_user()について読んでいて、実際の削除を行うためにuser_delete()をどこかで呼び出すと思います。その後、私のhook_user()実装は、 _$op = delete_パラメータ。しかし、他のことを行う方法について心配する前に、user_delete()を呼び出す方法についてのガイダンスが必要です。

user_delete()を使用する価値さえありますか?ユーザーレコードを削除してコンテンツレコードを「匿名」に変更する独自のクエリを作成する方が簡単でしょうか?

6
EmmyS

これはそれほど難しくありません。D6の場合、次のようになります。

  1. Drupalデータベースユーザーテーブルからレコードを削除します;

    user_delete(array(), $uid);
    
  2. 削除されたユーザーが作成したコンテンツの作成者を匿名に変更します。

    ノードモジュールによって処理されます。

  3. ユーザーを他の接続されていないシステムから削除する必要があることを知らせるために、内部サポートアドレスにメールを送信します

    drupal_mail(...);
    

    見る - hook_mail 詳細については。

6
googletorp

User_delete()を使用する価値さえありますか?ユーザーレコードを削除してコンテンツレコードを「匿名」に変更する独自のクエリを作成する方が簡単でしょうか?

ユーザーアカウントを削除し、ユーザーが作成したすべてのノードを匿名ユーザーに割り当てるには、ユーザーオブジェクトがあるかどうかに応じて、user_delete(array(), $account->uid)またはuser_delete(array(), $uid)を呼び出すだけです。ユーザーID。

削除されるユーザーアカウントで作成されたノードの割り当てに関しては、user_delete()hook_user()のすべての実装を呼び出し、「delete」を_$op_の値として渡します。 Nodeモジュールは、次のコードを使用してフックを実装します。

_function node_user($op, &$edit, &$user) {
  if ($op == 'delete') {
    db_query('UPDATE {node} SET uid = 0 WHERE uid = %d', $user->uid);
    db_query('UPDATE {node_revisions} SET uid = 0 WHERE uid = %d', $user->uid);
  }
}
_

ご覧のとおり、この関数は、削除されるユーザーアカウントによって作成されたノードと、そのユーザーアカウントに関連付けられているノードリビジョンを既に更新しています。

_$op_パラメータが "delete"に設定されている場合、user_delete()に必要な最初のパラメータは、hook_user()の実装では通常使用されません。ほとんどの場合、モジュールは_$account->uid_を使用して、独自のデータベーステーブルに書き込んだユーザーデータを識別します。モジュールがユーザーアカウントを識別するために別の値を使用してデータを保存したとしても、それはユーザーオブジェクトに含まれる値です。

ユーザーアカウントを削除するために独自のクエリを作成する場合、ユーザーアカウントが削除されたときに通知する必要があるモジュールがあり、通常はそのアカウントに関連付けられているモジュールのデータを削除するため、それを行うことはお勧めしません。この特定の目的のための関数が既に存在する場合にコードを書き換えると、新しいDrupalバージョンに渡すときにコードを更新することもできます。コードは、Drupalですでに使用されているコードほど一般的ではありません。 。

4
kiamlaluno

非コーディング方法:

必要なモジュール:トリガー(コアの一部)

手順1:トリガーモジュールを有効にする

ステップ2:メール送信アクションを作成する

  • goto admin/settings/actions
  • 「メールを送信...」アクションを作成する
  • フォームに記入する

create send email... action

ステップ3:トリガーを作成する

  • goto admin/build/trigger/user
  • トリガー:ユーザーが削除された後作成したアクションを選択

create trigger

これで完了です。デフォルトでは、ユーザーを削除すると、すべての投稿がanonymousになります。

改訂:

ユーザーを今すぐ削除する場所を選択できます。

  • /admin/user/userにアクセスすると、ユーザーを一括削​​除できます
  • ユーザープロファイルページに移動して削除
  • 独自のカスタムモジュールと、user_delete(array()、$ uid)を呼び出す関数を作成します。

これらの方法はすべて、削除されたすべてのユーザーに自動的にメールを送信します。コードを編集せずにメールの本文と受信者を変更できるため、この方法の方が柔軟性があると思います。

0
iStryker