Dodaj rolę do użytkownika po dołączeniu do grupy organicznej za pomocą reguł

8

Próbuję dodać rolę użytkownika do użytkownika, który stał się członkiem grupy. Przepływ pracy wygląda następująco:

  • Prośby użytkownika o dołączenie do grupy.
  • Żądanie jest zatwierdzane przez administratora grupy.
  • Użytkownik jest członkiem grupy.
  • Użytkownik otrzymuje dodatkową rolę.

Próbowałem stworzyć regułę, która byłaby w stanie to zrobić, ale chociaż wszystkie ustawienia wydają się prawidłowe po dołączeniu do grupy, użytkownik nie otrzymuje dodatkowej roli. Zobacz zrzut ekranu moich ustawień reguł:

Zrzut ekranu mojej reguły

różyczka
źródło
Mam dokładnie ten sam problem, więc rozpocząłem nagrodę za to.
Zielony Czarny,
@John Czy rozwiązałeś swoje problemy?
kalabro

Odpowiedzi:

2

Teraz twoja reguła działa, gdy użytkownik poprosi o członkostwo. Ale powinieneś uruchomić go po zatwierdzeniu członkostwa w OG.
Przygotowałem Regułę, która dodaje rolę „członek” po zatwierdzeniu członkostwa lub jeśli został dodany przez administratora (automatycznie zatwierdzony). Oto eksport ( 4jest to identyfikator mojej drupalnej roli „członka”):

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

Zrzut ekranu: wprowadź opis zdjęcia tutaj

Wskazówka: możesz włączyć debugowanie reguł (stronę admin/config/workflow/rules/settings), aby zobaczyć, kiedy reguły są wykonywane.

kalabro
źródło
Cześć Kalabro. Dziękuję za twój awnser! Skonfigurowałem to w ten sposób, ale użytkownik nie otrzymuje roli. Udało mi się to naprawić, dodając funkcję do niestandardowego modułu i dodając rolę za pomocą niestandardowego kodu php. Złożę tutaj brudne rozwiązanie.
Zielony Czarny,
PS. Zadałem tutaj moje pytanie, bardziej szczegółowe niż to: drupal.org/node/1866278 Jeśli debugujesz konto $, zobaczysz, że rola została dodana, ale po prostu nie została zapisana ani nadpisana przez coś.
Zielony Czarny,
@John Skomentowałem twoje pytanie na Drupal.org. Proszę spojrzeć na to: # 1
kalabro
2

Mam ten sam problem (dlatego zacząłem nagrodę).

Rozwiązałem to w ten sposób.

Dodałem funkcję do niestandardowego modułu. Możesz w prosty sposób utworzyć własny moduł, tworząc nowy folder w / sites / all / modules z dwoma plikami:

twój_moduł.info - >>

name = "Custom Functions"
description = "Allows execution of custom code for the website"
core = 7.x
package = "yourname_customs"
version = 7.x-1.x

nazwa_modułu

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

Następnie przejdź do modułów i włącz „Funkcje niestandardowe”.

Upewnij się, że masz włączony moduł niestandardowego kodu php.

Następnie zamiast akcji dodaj użytkownika do roli w regułach, dodaj: uruchom niestandardowy kod php i wpisz:

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

To dodaje użytkownika do roli i zatrzymuje skrypt. Jeśli nie zatrzymasz skryptu, rola nie zostanie zapisana. I musiałem dodać moduł, ponieważ user_savenie działa po uruchomieniu custom php code.

Wiem, że to jest bardzo brzydkie, ale działa dla mnie.

Zielony czarny
źródło
0

Którą wersję OG prowadzisz?

Jest to znany błąd, który został naprawiony w Organic Group 2.4+ ( patrz strona błędu ).

Jeśli korzystasz już z wersji OG 2.3 lub nowszej, aktualizacja powinna być prosta. Jeśli korzystasz z OG 1.x, możesz znaleźć więcej szczegółów na temat procesu aktualizacji z OG 1.5 do 2.4+

magdmartin
źródło