Fügen Sie dem Benutzer eine Rolle hinzu, nachdem Sie einer organischen Gruppe mit Regeln beigetreten sind


8

Ich versuche, einem Benutzer, der Mitglied einer Gruppe geworden ist, eine Benutzerrolle hinzuzufügen. Der Workflow sieht folgendermaßen aus:

  • Benutzeranfragen zum Beitritt zur Gruppe.
  • Die Anforderung wird vom Gruppenadministrator genehmigt.
  • Der Benutzer ist Mitglied der Gruppe.
  • Benutzer erhält eine zusätzliche Rolle.

Ich habe versucht, eine Regel zu erstellen, die dies ermöglicht, aber obwohl alle Einstellungen nach dem Beitritt zur Gruppe korrekt erscheinen, erhält der Benutzer keine zusätzliche Rolle. Unten sehen Sie einen Screenshot meiner Regeleinstellungen:

Screenshot meiner Regel


Ich habe genau das gleiche Problem, also habe ich ein Kopfgeld dafür angefangen.
Grün Schwarz

@ John Hast du deine Probleme gelöst?
Kalabro

Antworten:


2

Jetzt wird Ihre Regel ausgeführt, nachdem der Benutzer die Mitgliedschaft angefordert hat. Sie sollten es jedoch ausführen, nachdem die OG-Mitgliedschaft genehmigt wurde.
Ich habe eine Regel vorbereitet, die die Rolle "Mitglied" hinzufügt, nachdem die Mitgliedschaft genehmigt wurde oder wenn sie vom Administrator hinzugefügt wurde (automatisch genehmigt). Hier ist der Export ( 4ist die ID meiner Drupal-Rolle "Mitglied"):

{ "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" } } } }
    ]
  }
}

Bildschirmfoto: Geben Sie hier die Bildbeschreibung ein

Tipp: Sie können das Debuggen von Regeln (Seite admin/config/workflow/rules/settings) aktivieren, um zu sehen, wann Ihre Regeln ausgeführt werden.


Hallo Kalabro. Vielen Dank für Ihre Antwort! Ich habe es so eingerichtet, aber der Benutzer bekommt die Rolle nicht. Ich konnte das Problem beheben, indem ich einem benutzerdefinierten Modul eine Funktion hinzufügte und die Rolle mithilfe eines benutzerdefinierten PHP-Codes hinzufügte. Ich werde die schmutzige Lösung hier posten.
Grün Schwarz

PS. Ich habe meine Frage hier ausführlicher gestellt als diese Frage: drupal.org/node/1866278 Wenn Sie $ account debuggen, sehen Sie, dass die Rolle hinzugefügt, aber einfach nicht gespeichert oder von etwas überschrieben wird.
Grün Schwarz

@ John Ich habe Ihre Frage auf Drupal.org kommentiert. Bitte schauen Sie sich das an: # 1
Kalabro

2

Ich habe das gleiche Problem (deshalb habe ich ein Kopfgeld gestartet).

Ich habe es so gelöst.

Ich habe einem benutzerdefinierten Modul eine Funktion hinzugefügt. Sie können einfach Ihr eigenes Modul erstellen, indem Sie in / sites / all / modules einen neuen Ordner mit zwei Dateien erstellen:

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>");
    }
}

Gehen Sie dann zu Ihren Modulen und aktivieren Sie "Benutzerdefinierte Funktionen".

Stellen Sie sicher, dass Sie den benutzerdefinierten PHP-Code des Moduls aktiviert haben.

Fügen Sie dann anstelle der Aktion Benutzer zur Rolle in Regeln hinzu, fügen Sie Folgendes hinzu: Führen Sie einen benutzerdefinierten PHP-Code aus und geben Sie Folgendes ein:

yourname_add_role_to_user($account->uid, "Members");
header("Location: /admin/people");
exit;

Dadurch wird der Benutzer zur Rolle hinzugefügt und das Skript gestoppt. Wenn Sie das Skript nicht stoppen, wird die Rolle nicht gespeichert. Und ich musste ein Modul hinzufügen, da user_savees bei der Ausführung in nicht funktioniert custom php code.

Ich weiß, dass es sehr hässlich ist, aber es funktioniert bei mir.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.