Aggiungi ruolo all'utente dopo aver aderito al gruppo organico con le regole


8

Sto cercando di aggiungere un ruolo utente a un utente che è diventato membro di un gruppo. Il flusso di lavoro è così:

  • L'utente richiede di unirsi al gruppo.
  • La richiesta è stata approvata dall'amministratore del gruppo.
  • L'utente è un membro del gruppo.
  • L'utente ottiene un ruolo aggiuntivo.

Ho provato a stabilire una regola che sarebbe in grado di farlo, ma sebbene tutte le impostazioni sembrino corrette dopo essersi unite al gruppo, l'utente non ottiene il ruolo aggiuntivo. Vedi sotto uno screenshot delle mie impostazioni delle regole:

Schermata della mia regola


Ho esattamente lo stesso problema, quindi ho iniziato una taglia su di esso.
Green Black,

@John Hai risolto i tuoi problemi?
Kalabro,

Risposte:


2

Ora la tua regola viene eseguita dopo che l'utente ha richiesto l'appartenenza. Ma dovresti eseguirlo dopo l'approvazione dell'abbonamento OG.
Ho preparato la regola che aggiunge il ruolo "membro" dopo l'approvazione dell'appartenenza o se è stata aggiunta dall'amministratore (autoapprovazione). Ecco export ( 4è l'id del mio ruolo drupal "membro"):

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

Immagine dello schermo: inserisci qui la descrizione dell'immagine

Suggerimento: è possibile abilitare il debug delle regole (pagina admin/config/workflow/rules/settings) per vedere quando vengono eseguite le regole.


Ciao Kalabro. Grazie per il tuo tendalino! L'ho impostato in questo modo, ma l'utente non ottiene il ruolo. Sono stato in grado di risolverlo aggiungendo una funzione a un modulo personalizzato e aggiungendo il ruolo usando il codice php personalizzato. Ill post qui la soluzione sporca.
Green Black

PS. Ho posto la mia domanda qui, più dettagliata di questa domanda: drupal.org/node/1866278 Se esegui il debug di $ account, vedi che il ruolo viene aggiunto, ma semplicemente non salvato o sovrascritto da qualcosa.
Green Black,

@John Ho commentato la tua domanda su Drupal.org. Per favore, guarda questo: # 1
Kalabro

2

Ho lo stesso problema (quello per cui ho iniziato una taglia).

L'ho risolto in questo modo.

Ho aggiunto una funzione a un modulo personalizzato. Puoi semplicemente creare il tuo modulo creando una nuova cartella in / sites / all / modules con due file:

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

Quindi vai ai tuoi moduli e abilita "Funzioni personalizzate".

Assicurati di avere il codice php personalizzato del modulo abilitato.

Quindi invece di aggiungere un utente al ruolo nelle regole, aggiungi: esegui il codice php personalizzato e inserisci:

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

Ciò aggiunge l'utente al ruolo e arresta lo script. Se non si interrompe lo script, il ruolo non viene salvato. E avevo bisogno di aggiungere un modulo perché user_savenon funziona quando eseguito custom php code.

Quindi, so che è molto brutto, ma funziona per me.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.