Adicionar função ao usuário após ingressar no grupo orgânico com regras

8

Estou tentando adicionar uma função de usuário a um usuário que se tornou membro de um grupo. O fluxo de trabalho é assim:

  • Solicitações do usuário para ingressar no grupo.
  • A solicitação é aprovada pelo administrador do grupo.
  • Usuário é um membro do grupo.
  • O usuário recebe uma função adicional.

Tentei fazer uma regra que seria capaz de fazer isso, mas embora todas as configurações pareçam corretas depois de ingressar no grupo, o usuário não recebe a função adicional. Veja abaixo uma captura de tela das minhas configurações de regra:

Captura de tela da minha regra

rroose
fonte
Eu tenho exatamente o mesmo problema, então comecei uma recompensa nele.
Verde Preto
@ John Você resolveu seus problemas?
Kalabro

Respostas:

2

Agora sua regra é executada depois que o usuário solicita a associação. Mas você deve executá-lo após a associação ao OG ter sido aprovada.
Eu preparei a regra que adiciona a função “membro” após a aprovação da associação ou se foi adicionada pelo administrador (aprovação automática). Aqui está a exportação ( 4é o ID da minha função 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" } } } }
    ]
  }
}

Captura de tela: insira a descrição da imagem aqui

Dica: você pode ativar a depuração de regras (página admin/config/workflow/rules/settings) para ver quando suas regras são executadas.

kalabro
fonte
Oi Kalabro. Obrigado pelo seu awnser! Configurei dessa maneira, mas o usuário não consegue o papel. Consegui corrigi-lo adicionando uma função a um módulo personalizado e adicionando a função usando o código php personalizado. Vou postar a solução suja aqui.
Preto Verde
PS. Fiz minha pergunta aqui, mais detalhada que esta: drupal.org/node/1866278 Se você depurar a conta $, verá que a função foi adicionada, mas simplesmente não foi salva ou substituída por algo.
Preto Verde
@ John Comentei sua pergunta no Drupal.org. Por favor, veja o seguinte: # 1
kalabro
2

Eu tenho o mesmo problema (foi por isso que comecei uma recompensa).

Eu resolvi assim.

Eu adicionei uma função a um módulo personalizado. Você pode simplesmente criar seu próprio módulo criando uma nova pasta em / sites / all / modules com dois arquivos:

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

Em seguida, vá para seus módulos e ative "Funções personalizadas".

Verifique se o código php personalizado do módulo está ativado.

Em vez de ação, adicione o usuário à função de regras, adicione: execute o código php personalizado e digite:

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

Isso adiciona o usuário à função e interrompe o script. Se você não parar o script, a função não será salva. E eu precisava adicionar um módulo porque user_savenão funciona quando executado custom php code.

Então, eu sei que é muito feio, mas funciona para mim.

Verde Preto
fonte