Добавить пользователя в группу в Joomla не работает

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

<?php

define('_JEXEC', 1);
define('JPATH_BASE', realpath(dirname(__FILE__)));
require_once ( JPATH_BASE .'/includes/defines.php' );
require_once ( JPATH_BASE .'/includes/framework.php' );
require_once ( JPATH_BASE .'/libraries/joomla/factory.php' );

$userId = 358;
$groupId = 11;

echo JUserHelper::addUserToGroup($userId, $groupId);

?>

3 ответа

Я работаю в той же проблеме с обратным вызовом оплаты. Я обнаружил, что группы пользователей сохраняются в базе данных правильно, но не обновляются в Juser объект (потому что вы добавляете пользователя в группу в другом сеансе). При взаимодействии пользователя на странице группы восстанавливаются.

Еще одна мысль, которую я обнаружил, заключается в том, что смена групп в панели администратора работает так же, если пользователь вошел в систему.

Чтобы справиться с этим я сделал системный плагин и в onAfterInitialise Функция, которую я выполняю:

//get user
$me = JFactory::getUser();
//check if user is logged in
if($me->id){
    //get groups
    $groups = JUserHelper::getUserGroups($me->id);
    //check if current user object has right groups
    if($me->groups != $groups){
        //if not update groups and clear session access levels
        $me->groups = $groups;
        $me->set('_authLevels', null);
    }
}

Надеюсь, это поможет.

Возможное "простое" решение:

Код правильный, и он должен поставить ваш $userId а также $groupId в БД, если быть точным в #__user_usergroup_map,

Кстати, считают, что этот метод вызывает ошибку, если вы используете неправильный groupId но это не вызывает никакой ошибки, если вы вставите неправильный $userId и я ошибаюсь, что не существует.

Таким образом, есть канчи, которые пользователь с $userId = 358; не существует

Обновление - Жесткая отладка:

Хорошо, в этом случае я предлагаю вам покопаться в коде помощника.

Файл:

libraries/joomla/user/helper.php

На линии 33 у вас есть JUserHelper::addUserToGroup,

Это код:

    public static function addUserToGroup($userId, $groupId)
    {
        // Get the user object.
        $user = new JUser((int) $userId);

        // Add the user to the group if necessary.
        if (!in_array($groupId, $user->groups))
        {
            // Get the title of the group.
            $db = JFactory::getDbo();
            $query = $db->getQuery(true)
                ->select($db->quoteName('title'))
                ->from($db->quoteName('#__usergroups'))
                ->where($db->quoteName('id') . ' = ' . (int) $groupId);
            $db->setQuery($query);
            $title = $db->loadResult();

            // If the group does not exist, return an exception.
            if (!$title)
            {
                throw new RuntimeException('Access Usergroup Invalid');
            }

            // Add the group data to the user object.
            $user->groups[$title] = $groupId;

        // Store the user object.
        $user->save();
    }

    if (session_id())
    {
        // Set the group data for any preloaded user objects.
        $temp = JFactory::getUser((int) $userId);
        $temp->groups = $user->groups;

        // Set the group data for the user object in the session.
        $temp = JFactory::getUser();

        if ($temp->id == $userId)
        {
            $temp->groups = $user->groups;
        }
    }

    return true;
}

Бит, который спасает группу, $user->save();,
Пробовать var_dump() пока там и посмотрим, где проблема.

Автор уже наполовину решил эту проблему, поэтому этот ответ может помочь другим. Мне потребовались часы отладки с Eclipse и XDebug, чтобы найти проблему. Эта ошибка была очень хитрой, потому что addUserToGroup() возвращался true для меня и пользователя объект был также с удачными изменениями, но они не были сохранены в базе данных. Проблема заключалась в том, что onUserBeforeSave() Метод в моем плагине выбрасывал исключение всякий раз, когда addUserToGroup() пытался спасти пользователя. Так что проверьте свою реализацию onUserBeforeSave() если ты коснулся этого. Если нет, вы должны установить Eclipse с XDebug и попытаться отладить, в чем именно заключается ваша проблема.

Другие вопросы по тегам