Agregar rol al usuario después de unirse al grupo orgánico con reglas


8

Estoy tratando de agregar un rol de usuario a un usuario que se ha convertido en miembro de un grupo. El flujo de trabajo es así:

  • Solicitudes de usuario para unirse al grupo.
  • La solicitud es aprobada por el administrador del grupo.
  • El usuario es un miembro del grupo.
  • El usuario obtiene un rol adicional.

Intenté hacer una regla que pudiera hacer esto, pero aunque todas las configuraciones parecen correctas después de unirse al grupo, el usuario no obtiene el rol adicional. Vea a continuación una captura de pantalla de la configuración de mi regla:

Captura de pantalla de mi regla


Tengo exactamente el mismo problema, así que comencé una recompensa.
Verde Negro

@John ¿Has resuelto tus problemas?
kalabro

Respuestas:


2

Ahora su regla se ejecuta después de que el usuario solicite membresía. Pero debe ejecutarlo después de que se aprobó la membresía de OG.
Preparé la regla que agrega el rol "miembro" después de que la membresía fue aprobada o si fue agregada por el administrador (auto-aprobado). Aquí está exportar ( 4es el id de mi rol drupal "miembro"):

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

Captura de pantalla: ingrese la descripción de la imagen aquí

Consejo: puede habilitar la depuración de reglas (página admin/config/workflow/rules/settings) para ver cuándo se ejecutan sus reglas.


Hola kalabro ¡Gracias por tu bocina! Lo configuré de esa manera, pero el usuario no obtiene el rol. Pude solucionarlo agregando una función a un módulo personalizado y agregué el rol usando un código php personalizado. Publicaré la solución sucia aquí.
Verde Negro

PD. Hice mi pregunta aquí, más detallada que esta pregunta: drupal.org/node/1866278 Si depura $ account, verá que el rol se agrega, pero simplemente no se guarda o se sobrescribe por algo.
Verde Negro

@John He comentado tu pregunta en Drupal.org. Por favor, mira esto: # 1
kalabro

2

Tengo el mismo problema (por eso comencé una recompensa).

Lo resolví de esta manera.

Agregué una función a un módulo personalizado. Simplemente puede crear su propio módulo creando una nueva carpeta en / sites / all / modules con dos archivos:

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

Luego pase a sus módulos y active "Funciones personalizadas".

Asegúrese de tener habilitado el código php personalizado del módulo.

Luego, en lugar de acción, agregue el usuario al rol en las reglas, agregue: ejecute el código php personalizado e ingrese:

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

Esto agrega al usuario al rol y detiene el script. Si no detiene el script, el rol no se guarda. Y necesitaba agregar un módulo porque user_saveno funciona cuando se ejecuta en custom php code.

Entonces, sé que es muy feo, pero funciona para mí.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.