Добавить роль пользователю после присоединения к органической группе с правилами

8

Я пытаюсь добавить роль пользователя для пользователя, который стал членом группы. Рабочий процесс выглядит так:

  • Пользователь просит присоединиться к группе.
  • Запрос утвержден администратором группы.
  • Пользователь является участником группы.
  • Пользователь получает дополнительную роль.

Я пытался создать правило, которое могло бы сделать это, но, хотя все настройки кажутся правильными после присоединения к группе, пользователь не получает дополнительную роль. Ниже приведен скриншот настроек моего правила:

Скриншот моего правила

rroose
источник
У меня точно такая же проблема, поэтому началось вознаграждение за нее.
Зеленый Черный
@ Джон Ты решил свои проблемы?
Калабро

Ответы:

2

Теперь ваше правило запускается после того, как пользователь запрашивает членство. Но вы должны запустить его после одобрения членства в OG.
Я подготовил Правило, которое добавляет роль «участник» после того, как членство было утверждено или если оно было добавлено администратором (автоматически утверждено). Вот экспорт ( 4это идентификатор моей друпал роли «член»):

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

Скриншот: введите описание изображения здесь

Совет: вы можете включить правила отладки (страницы admin/config/workflow/rules/settings), чтобы увидеть, когда ваши правила выполняются.

kalabro
источник
Привет Калабро. Спасибо за ваш awnser! Я настроил это таким образом, но пользователь не получает роль. Я смог исправить это, добавив функцию в пользовательский модуль и добавив роль с помощью пользовательского php-кода. Я опубликую грязное решение здесь.
Зеленый Черный
PS. Я задал свой вопрос здесь, более подробно, чем этот вопрос: drupal.org/node/1866278 Если вы отлаживаете $ account, вы видите, что роль добавлена, но просто не сохранена или перезаписана чем-то.
Зеленый Черный
@ Джон Я прокомментировал твой вопрос на Drupal.org. Пожалуйста, посмотрите на это: # 1
Калабро
2

У меня та же проблема (вот почему я начал щедрость).

Я решил это таким образом.

Я добавил функцию в пользовательский модуль. Вы можете просто создать свой собственный модуль, создав новую папку в / sites / all / modules с двумя файлами:

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

Затем перейдите к своим модулям и включите «Пользовательские функции».

Убедитесь, что у вас включен пользовательский php код модуля.

Затем вместо действия добавьте пользователя к роли в правилах, добавьте: запустите пользовательский код php и введите:

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

Это добавляет пользователя к роли и останавливает сценарий. Если вы не остановите сценарий, роль не будет сохранена. И мне нужно было добавить модуль, потому user_saveчто не работает, когда выполняется в custom php code.

Итак, я знаю, что это очень некрасиво, но это работает для меня.

Зеленый черный
источник
0

Какую версию OG вы используете?

Это известная ошибка, которая была исправлена ​​в Organic Group 2.4+ ( см. Страницу ошибки ).

Если вы уже используете версию OG 2.3 или ниже, обновление должно быть простым. Если вы используете OG 1.x, вы можете найти более подробную информацию о процессе обновления с OG 1.5 до 2.4+

magdmartin
источник