将用户添加到 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);
?>

我在付款回调中遇到了同样的问题。我发现用户组正确保存在数据库中,但没有刷新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(),请检查您的实现。如果没有,您必须使用 XDebug 安装 Eclipse,并尝试调试您的确切问题。

相关内容

  • 没有找到相关文章