質問
私は私が行うことができますどのように役割YのサブセットであることをロールXを望む、自動的つまり役割、役割のX、別々の役割を付与されているすべてのDrupalのユーザーに、役割のY.を適用する必要がありますこの?
解決
あなたはカスタムモジュールに hook_user()
を実装することができます。 「挿入」および/または「更新」アクションでは、あなたは$account->roles
配列の役割Yをチェックしたいです。存在する場合はいない既にある場合は、ロールXを追加します。これはあなたのルールは、ユーザーアカウントが作成され、および/または変更されるたびに適用されることを確実にするでしょう。
は、ブートストラップ/ 1時間動作させるには、 user_multiple_role_edit()
のを見てみましょう。これは、ユーザーIDの配列のための役割を追加または削除することができます。また、データベースに直接それを行うことができます:
INSERT INTO users_roles (uid, rid)
SELECT uid, [roleX_ID] AS rid FROM users_roles
WHERE uid IN
(SELECT uid FROM users_roles WHERE rid = [roleY_ID])
AND uid NOT IN
(SELECT uid FROM users_roles WHERE rid = [roleX_ID])
;
他のヒント
私は、ユーザーを維持し、彼らはすべての時間を最新の状態にあることを確認することですカスタムモジュールに良い解決策をhook_userを使用してヘンリク・オペルに同意します。
通常、私は似SQLまたは何かを書く気にしないだろうが、それは生産現場でだから、生のSQLを書くときに、何かを簡単に間違って行くことができる場合ので、この場合には、私は、別のルートを少しタイプミスをすることができます希望します大きなトラブルを引き起こします。もう一つの良い点は、あなたが文句を言わない、あなたのデータベース上で実行し、DrupalのAPIを介して物事を行うときに正常に動作していますいくつかのプロセス、フックおよびその他のプロセスと同期しなくなるかもしれないものを、生のSQLを意識するのDrupalなどの問題に実行することができるということです。
その代わりに、Drupalは、ユーザ管理インタフェースを使用することができます。私は実際にこのような場合には、それはあなたがやりたいの最も簡単なの方法だと思います。単に学生であるすべてのユーザーをフィルタリングします。すべてのユーザー]をクリックし、それらにメンバーの役割を与えます。これは時間がない中、数回のクリックで行われ、DrupalはあなたのためのすべてのSQLを処理しますので、非常に安全です。
LDAPモジュールを使用すると、動的DNに基づいて役割を割り当てることができます。私は実際にはそうでない場合、私はそれを共有するよりも幸せになり、私たちのシステムに特別に調整されて自分のモジュールを記述する必要がありました。