将用户添加到Joomla中的组无法正常工作

时间:2015-04-11 17:07:32

标签: joomla joomla3.4

我正在尝试将用户添加到群组中。我可以运行这个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 个答案:

答案 0 :(得分:1)

可能的“简单”解决方案:

代码是正确的,它应该将您的$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()直到那里,看看问题在哪里。

答案 1 :(得分:1)

我在付款回调中遇到了同样的问题。我发现用户组正确保存在数据库中,但未在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);
    }
}

希望它会有所帮助。

答案 2 :(得分:0)

作者已经半已经解决了这个问题,所以这个答案可能对其他人有所帮助。我花了几个小时的时间用Eclipse和XDebug调试才发现问题。这个错误非常棘手,因为addUserToGroup()为我返回true,用户对象也是成功更改的,但它们没有保存在数据库中。问题是我的插件中的onUserBeforeSave()方法在addUserToGroup()试图保存用户时抛出异常。如果您触摸它,请检查onUserBeforeSave()的实施情况。如果不是,您必须使用XDebug安装Eclipse并尝试调试您的确切问题。