我正在尝试将用户添加到组中。我可以运行此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,并尝试调试您的确切问题。