我正在尝试将用户添加到群组中。我可以运行这个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);
?>
答案 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并尝试调试您的确切问题。