web-dev-qa-db-ja.com

ルールでオーガニックグループに参加した後、ユーザーにロールを追加します

グループのメンバーになったユーザーにユーザーロールを追加しようとしています。ワークフローは次のとおりです。

  • ユーザーがグループへの参加をリクエストしています。
  • リクエストはグループ管理者によって承認されました。
  • ユーザーはグループのメンバーです。
  • ユーザーは追加の役割を取得します。

これを実行できるルールを作成しようとしましたが、グループに参加した後、すべての設定は正しいように見えますが、ユーザーは追加のロールを取得できません。以下の私のルール設定のスクリーンショットを参照してください:

Screenshot of my rule

8
rroose

これで、ユーザーがメンバーシップをリクエストした後にルールが実行されます。ただし、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" } } } }
    ]
  }
}

スクリーンショット: enter image description here

ヒント:ルールのデバッグを有効にできます(ページadmin/config/workflow/rules/settings)ルールがいつ実行されるかを確認します。

2
kalabro

私は同じ問題を抱えています(そのため、賞金を獲得しました)。

この方法で解決しました。

カスタムモジュールに関数を追加しました。/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_savecustom php codeで実行すると機能しないため、モジュールを追加する必要がありました。

だから、私はそれが非常に醜いことを知っていますが、私にとってはうまくいきます。

2
Green Black

どのバージョンのOGを実行していますか?

これは、Organic Group 2.4以降で修正された既知のバグです( バグページを参照 )。

OGの2.3以下のバージョンを既に実行している場合、更新は簡単です。 OG 1.xを実行している場合、 OG 1.5から2.4 + への更新プロセスの詳細を確認できます。

0
magdmartin