Yii User + Rights: Не работает редактирование пользователем (не админом!) данных своего профиля

Yii User + Rights: Не работает редактирование пользователем (не админом!) данных своего профиля Пользователь приложения, в которором установлены модули yii-user вместе с rights, не может изменив свои данные, сохранить их.

Если в нашем приложении на Yii одновременно установлены модули Yii User и Rights, то сталкиваемся с проблемой, что пользователь не может сохранить свои данные после их редактирования (/user/profile/edit). Редактирование под админом работает хорошо (user/admin/edit). 

При этом всё работает хорошо, когда установлен модуль Yii User (yii-user) без Rights.

Когда же установили Rights, то при нажатии пользователем кнопки "Сохранить" после редактирования своих данных (своего профиля), получаем ошибку:

CException
RWebUser and its behaviors do not have a method or closure named "updateSession". 

/Users/macbook/Sites/YiiRoot/framework/base/CComponent.php(266)

254     public function __call($name,$parameters)
255     {
256         if($this->_m!==null)
257         {
258             foreach($this->_m as $object)
259             {
260                 if($object->getEnabled() && method_exists($object,$name))
261                     return call_user_func_array(array($object,$name),$parameters);
262             }
263         }
264         if(class_exists('Closure', false) && $this->canGetProperty($name) && $this->$name instanceof Closure)
265             return call_user_func_array($this->$name, $parameters);
266         throw new CException(Yii::t('yii','{class} and its behaviors do not have a method or closure named "{name}".',
267             array('{class}'=>get_class($this), '{name}'=>$name)));
268     }
269 
270     /**
271      * Returns the named behavior object.
272      * The name 'asa' stands for 'as a'.
273      * @param string $behavior the behavior name
274      * @return IBehavior the behavior object, or null if the behavior does not exist
275      */
276     public function asa($behavior)
277     {
278         return isset($this->_m[$behavior]) ? $this->_m[$behavior] : null;

Скрин экрана:

ошибка yii-user вместе с Rights: RWebUser and its behaviors do not have a method or closure named updateSession

или по русски:

CException
В классе RWebUser и его поведениях не найден метод или замыкание с именем "updateSession".

В чём дело? Разбираемся.

При установке модуля Rights мы заменяли настройку в конфиге, относящуюся к 'user' (WebUser на RWebUser):

'components'=>array(
   'user'=>array(
   'class'=>'RWebUser',
   'allowAutoLogin'=>true,
   'loginUrl' => array('/user/login'),
),

И теперь получаем ошибку, что в классе RWebUser не найден метод "updateSession". Понимаем, что он необходим для модуля yii-user и, должно быть, присутствовал в классе WebUser.

Так и есть.

Возможных выхода – два:

1. Добавить функцию updateSession() из /modules/user/components/WebUser.php в компонент /modules/rights/components/RWebUser.php

public function updateSession() {
        $user = Yii::app()->getModule('user')->user($this->id);
        $userAttributes = CMap::mergeArray(array(
                                                'email'=>$user->email,
                                                'username'=>$user->username,
                                                'create_at'=>$user->create_at,
                                                'lastvisit_at'=>$user->lastvisit_at,
                                           ),$user->profile->getAttributes());
        foreach ($userAttributes as $attrName=>$attrValue) {
            $this->setState($attrName,$attrValue);
        }
    }
2. Сделать, чтобы RWebUser расширял не CWebUser, а WebUser из модуля yii_user (в котором и присутствует эта функция updateSession, и который в свою очередь расширяет CWebUser). Делается это простой заменой в /modules/rights/components/RWebUser.php:
class RWebUser extends CWebUser

на:

class RWebUser extends WebUser
Теперь авторизованный пользователь может редактировать свой профиль и сохранять его.

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (3)     Подпишитесь на RSS комментариев к этой статье.

3 комментариев

#684
red_ogurez говорит:
October 18, 2012 at 09:51 am
Спасибо. пригодилось
#686
vmr говорит:
October 18, 2012 at 05:35 pm
спасибо 
#727
Николай говорит:
December 19, 2012 at 03:14 pm
Спасибо за статью! Помогло решить проблему!