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


8

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

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

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

私のルールのスクリーンショット


私はまったく同じ問題を抱えているので、それに恵みを始めました。
グリーンブラック

@ジョン問題を解決しましたか?
kalabro

回答:


2

これで、ユーザーがメンバーシップをリクエストした後にルールが実行されます。ただし、OGメンバーシップが承認された後で実行する必要があります。
メンバーシップが承認された後、または管理者によって追加された場合(自動承認)に、ロール「メンバー」を追加するルールを準備しました。ここにエクスポートがあります(4私のdrupalロールの「メンバー」の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)を有効にして、ルールがいつ実行されるかを確認できます。


こんにちはカラブロ。日よけをありがとう!そのように設定しましたが、ユーザーはロールを取得しません。カスタムモジュールに関数を追加し、カスタムphpコードを使用してロールを追加することで修正できました。ここにダーティソリューションを投稿します。
グリーンブラック

PS。:私はもっとこの質問より詳細に、ここで私の質問をdrupal.org/node/1866278あなたは$アカウントをデバッグする場合は、役割を追加しましたが、単純に保存された、または何かによって上書きされていない参照してください。
グリーンブラック

@John Drupal.orgであなたの質問にコメントしました。これを見てください:#1
kalabro '19

2

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

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

カスタムモジュールに関数を追加しました。/ 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

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


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