Задача: добавить функцию добавления и удаления аватара в профиль.
Для добавления аватара использовал SWFUpload, который для изменения данный в БД вызывает метод в models/profile.php компонента
public function setAvatar($src) {
$user = JFactory::getUser();
$db = &JFactory::getDBO();
$query = "UPDATE `#__users` SET `avatar` = '{$src}' WHERE `username` = '{$user->username}'";
$db->setQuery($query);
return $db->query();
}
После по надобности аватар вытаскивается из этой же модели models/profile.php через
public function getAvatar() {
$user = JFactory::getUser();
if ($user->avatar == 'none') {
return JURI::root(). 'images/default/avatar_default.jpeg';
}
return JURI::root(). $user->avatar;
}
Если мы просто загружаем аватар, то данные текущего пользователя после вызова
$user = JFactory::getUser();
изменяются, а именно поле avatar, которое я добавил в таблицу #__users.
Так же нужно кроме добавления аватара реализовать функцию удаления аватара. Было решено сделать через AJAX, который вызывает метод удаления в controllers/profile.php
public function delete() {
$user = JFactory::getUser();
if ($user->guest) {
$this->setRedirect(JRoute::_('index.php?option=com_users&view=login', false));
return;
}
if ($user->avatar == 'none') {
return false;
}
$model = $this->getModel('Profile');
if (!$model->deleteAvatar()) {
JError::raiseError(500, JText::_('COM_USERS_ERROR_DELETE_AVATAR'));
return false;
}
}
и который вызывает метод из models/profile.php
public function deleteAvatar() {
$user = JFactory::getUser();
$db = &JFactory::getDBO();
$query = "UPDATE `#__users` SET `avatar` = 'none' WHERE `username` = '{$user->username}'";
$db->setQuery($query);
return $db->query();
}
А сам код AJAXа вот
$deleteAvatarAjax = '
jQuery(window).load(function(){
jQuery("#profile-delete-avatar").click(function(){
jQuery.ajax({
type: "POST",
url: "index.php?option=com_users&task=profile.delete",
success: function(){
alert("Аватар успешно удалён");
},
error: function() {
alert("Операция завершилась с ошибкой. Попробуйте повторить позднее");
}
});
});
});
';
$document->addScriptDeclaration($deleteAvatarAjax);
После вызова AJAX значение в поле avatar таблицы #__users изменяется, но при получении данный текущего пользователя через JFactory::gerUser() - нет. И самое интересное, после залогивания если добавлять аватар, то в JUser данные изменяются, т.е. свойство avatar, но стоит вызвать метод удаления AJAXом, как после этого ничего не работает через полчения данный черезе JUser, но в самой БД всё прекрасно изменяется.