Добавить пользователя в группу в 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);
?>
3 ответа
Я работаю в той же проблеме с обратным вызовом оплаты. Я обнаружил, что группы пользователей сохраняются в базе данных правильно, но не обновляются в 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()
если ты коснулся этого. Если нет, вы должны установить Eclipse с XDebug и попытаться отладить, в чем именно заключается ваша проблема.