Ajouter un rôle à l'utilisateur après avoir rejoint un groupe organique avec des règles

8

J'essaie d'ajouter un rôle d'utilisateur à un utilisateur qui est devenu membre d'un groupe. Le flux de travail est comme ceci:

  • L'utilisateur demande à rejoindre le groupe.
  • La demande est approuvée par l'administrateur du groupe.
  • L'utilisateur est membre du groupe.
  • L'utilisateur obtient un rôle supplémentaire.

J'ai essayé de créer une règle qui pourrait le faire, mais bien que tous les paramètres semblent corrects après avoir rejoint le groupe, l'utilisateur n'obtient pas le rôle supplémentaire. Voir ci-dessous une capture d'écran de mes paramètres de règle:

Capture d'écran de ma règle

rroose
la source
J'ai exactement le même problème, alors j'ai commencé à en bénéficier.
Green Black
@John Avez-vous résolu vos problèmes?
kalabro

Réponses:

2

Maintenant, votre règle s'exécute après que l'utilisateur a demandé à devenir membre. Mais vous devez l'exécuter après l'approbation de l'adhésion à l'OG.
J'ai préparé une règle qui ajoute le rôle «membre» après l'approbation de l'adhésion ou s'il a été ajouté par l'administrateur (auto-approuvé). Voici l'export ( 4c'est l'id de mon rôle drupal de «membre»):

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

Capture d'écran: entrez la description de l'image ici

Astuce: vous pouvez activer le débogage des règles (page admin/config/workflow/rules/settings) pour voir quand vos règles sont exécutées.

kalabro
la source
Salut Kalabro. Merci pour votre avertissement! Je l'ai configuré de cette façon, mais l'utilisateur n'obtient pas le rôle. J'ai pu le corriger en ajoutant une fonction à un module personnalisé et en ajoutant le rôle à l'aide d'un code php personnalisé. Je posterai la sale solution ici.
Green Black
PS. J'ai posé ma question ici, plus détaillée que cette question: drupal.org/node/1866278 Si vous déboguez $ account, vous voyez que le rôle est ajouté, mais simplement pas enregistré, ou écrasé par quelque chose.
Green Black
@John J'ai commenté votre question sur Drupal.org. S'il vous plaît, regardez ceci: # 1
kalabro
2

J'ai le même problème (c'est pourquoi j'ai commencé une prime).

Je l'ai résolu de cette façon.

J'ai ajouté une fonction à un module personnalisé. Vous pouvez simplement créer votre propre module en créant un nouveau dossier dans / sites / all / modules avec deux fichiers:

votrenom_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

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

Accédez ensuite à vos modules et activez "Fonctions personnalisées".

Assurez-vous que le code php personnalisé du module est activé.

Ensuite, au lieu d'une action, ajoutez l'utilisateur au rôle dans les règles, ajoutez: exécutez un code php personnalisé et entrez:

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

Cela ajoute l'utilisateur au rôle et arrête le script. Si vous n'arrêtez pas le script, le rôle n'est pas enregistré. Et j'avais besoin d'ajouter un module car user_savecela ne fonctionne pas lors de son exécution custom php code.

Donc, je sais que c'est très moche, mais ça marche pour moi.

Vert noir
la source