将用户添加到Joomla中的组不工作

将用户添加到Joomla中的组不工作,joomla,joomla3.4,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 (

我正在尝试向组中添加用户。我可以运行这段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);

?>
可能的简单解决方案:

代码是正确的,它应该将$userId和$groupId放在数据库中,以便在uu user\u usergroup\u映射中精确地显示出来

BTW认为如果使用一个错误的GyPID,这个方法会出现错误,但是如果插入错误的$UERID,并且错误的意思是它不存在,它不会引起任何错误。 因此,用户$userId=358;不存在

更新-硬调试:

好的,在这种情况下,我建议您插入助手的代码

该文件是:

libraries/joomla/user/helper.php
在第33行,您有JUserHelper::addUserToGroup

代码如下:

公共静态函数addUserToGroup$userId,$groupId { //获取用户对象。 $user=new JUserint$userId; //如有必要,将用户添加到组中。 如果!在数组$groupId中,$user->groups { //获取组的标题。 $db=JFactory::getDbo; $query=$db->getQuerytrue ->选择$db->quoteName'title' ->从$db->quoteName“用户组” ->其中$db->quoteName'id'.='.int$groupId; $db->setQuery$query; $title=$db->loadResult; //如果组不存在,则返回异常。 如果!$title { 抛出新的运行时异常“访问用户组无效”; } //将组数据添加到用户对象。 $user->groups[$title]=$groupId; //存储用户对象。 $user->save; } 如果会话\u id { //为任何预加载的用户对象设置组数据。 $temp=JFactory::getUserint$userId; $temp->groups=$user->groups; //设置会话中用户对象的组数据。 $temp=JFactory::getUser; 如果$temp->id==$userId { $temp->groups=$user->groups; } } 返回true; } 保存组的位是$user->save;。
尝试将var_转储到那里,看看问题出在哪里。

我在同一个问题中运行了付款回调。我发现用户组正确地保存在数据库中,但不会在Juser对象中刷新,因为您在不同的会话中将用户添加到组中。当用户在页面上进行交互时,将恢复组

我发现的另一个想法是,如果用户登录,在管理员面板中更改组的方式是相同的

为了解决这个问题,我制作了系统插件,在OnAfterInitialize函数中,我做了:

//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);
    }
}

希望它能有所帮助。

作者已经半途而废地解决了这个问题,所以这个答案可能会对其他人有所帮助。我用Eclipse和XDebug调试了几个小时才发现问题。这个错误非常棘手,因为addUserToGroup对我来说返回true,并且用户对象在成功更改后也返回true,但它们并没有保存在数据库中。问题是,每当addUserToGroup试图保存用户时,插件中的OnUserForesSave方法就会引发异常。因此,如果您触碰了OnUserPreSave,请检查它的实现。如果没有,您必须使用XDebug安装Eclipse,并尝试调试您的确切问题

我还在想办法。不是用户id吗?你查过我告诉你的那张桌子了吗?是的,我查过了,每件事都完全正确。数据库中没有任何内容,用户和组ID都是正确的。我将更新答案以帮助您进行调试。试试看,让我知道:所以在添加组之前和之后转储$user变量,在之前,它说我在注册组和来宾组中。之后,我加入了这些人和我想加入的团体。因此,出于某种原因,它没有正确地保存它。需要注意的一点是,当这个脚本运行时,用户没有登录,这是来自PayPal的回调,用于处理他们的购买。是的,我现在的问题是处理登录用户。它在数据库中正确更新,但当前登录的用户必须重新登录才能应用更改。我创建了你建议的插件,可惜它不起作用。你介意在某处发布插件的完整下载,看看我是否做错了什么吗?如果您使用的是Joomla 3.0,我也在使用它。我在onAfterInitialise函数中添加了一个echo,它会被调用。问题仍然是用户组没有更新。很抱歉我的回复太晚,我是stackoverflow帐户的新手,我想当有人评论我的答案时我会收到一封电子邮件,但我没有。你有没有检查插件在$me->groups中是否有任何变化?插件检查$groups时出错了吗?