グループのメンバーになったユーザーにユーザーロールを追加しようとしています。ワークフローは次のとおりです。
これを実行できるルールを作成しようとしましたが、グループに参加した後、すべての設定は正しいように見えますが、ユーザーは追加のロールを取得できません。以下の私のルール設定のスクリーンショットを参照してください:
これで、ユーザーがメンバーシップをリクエストした後にルールが実行されます。ただし、OGメンバーシップが承認された後で実行する必要があります。
メンバーシップが承認された後、または管理者によって追加された場合(自動承認)にロール「メンバー」を追加するルールを準備しました。これがエクスポート(4
はmy drupal role“ member”)のIDです:
{ "rules_after_add_user_to_group" : {
"LABEL" : "After add user to group",
"PLUGIN" : "reaction rule",
"TAGS" : [ "test" ],
"REQUIRES" : [ "rules", "og" ],
"ON" : [ "og_user_insert", "og_user_approved" ],
"IF" : [ { "data_is" : { "data" : [ "og-membership:state" ], "value" : "1" } } ],
"DO" : [
{ "user_add_role" : { "account" : [ "account" ], "roles" : { "value" : { "4" : "4" } } } }
]
}
}
スクリーンショット:
ヒント:ルールのデバッグを有効にできます(ページadmin/config/workflow/rules/settings
)ルールがいつ実行されるかを確認します。
私は同じ問題を抱えています(そのため、賞金を獲得しました)。
この方法で解決しました。
カスタムモジュールに関数を追加しました。/sites/all/modulesに2つのファイルを含む新しいフォルダーを作成することで、独自のモジュールを簡単に作成できます。
yourname_module.info->>
name = "Custom Functions"
description = "Allows execution of custom code for the website"
core = 7.x
package = "yourname_customs"
version = 7.x-1.x
yourname.module
<?php
function yourname_add_role_to_user($uid, $role_name) {
$user = user_load($uid);
if ($user === false || !isset($user->uid) || !is_array($user->roles)) {
//Display an ugly error when user is not set correctly
exit('$user is not set correctly <pre>' . print_r($user, true) . "</pre>");
}
//Get the user roles
$roles = user_roles(TRUE);
$rid = array_search($role_name, $roles);
if ($rid != FALSE) {
$new_role[$rid] = $role_name;
// Add new role to existing roles.
$all_roles = $user->roles + $new_role;
//Delete all user roles from DB
db_delete('users_roles')
->condition('uid', $user->uid)
->execute();
//Insert all user roles in DB
$query = db_insert('users_roles')->fields(array('uid', 'rid'));
foreach (array_keys($all_roles) as $rid) {
if (!in_array($rid, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID))) {
$query->values(array(
'uid' => $user->uid,
'rid' => $rid,
));
}
}
$query->execute();
} else {
//Display an ugly error wen role not found
exit("Could not find role " . htmlspecialchars($role_name) . "<br/>
Vald roles: <pre>" . print_r($roles, true) . "</pre>");
}
}
次に、モジュールに移動して「カスタム関数」を有効にします。
モジュールのカスタムphpコードが有効になっていることを確認してください。
次に、アクションの代わりに、ルールでユーザーをロールに追加します。追加:カスタムphpコードを実行して、次のように入力します。
yourname_add_role_to_user($account->uid, "Members");
header("Location: /admin/people");
exit;
これにより、ユーザーがロールに追加され、スクリプトが停止します。スクリプトを停止しないと、ロールは保存されません。また、user_save
をcustom php code
で実行すると機能しないため、モジュールを追加する必要がありました。
だから、私はそれが非常に醜いことを知っていますが、私にとってはうまくいきます。
どのバージョンのOGを実行していますか?
これは、Organic Group 2.4以降で修正された既知のバグです( バグページを参照 )。
OGの2.3以下のバージョンを既に実行している場合、更新は簡単です。 OG 1.xを実行している場合、 OG 1.5から2.4 + への更新プロセスの詳細を確認できます。