CWebUser проблема с раширением

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

CWebUser проблема с раширением

Сообщение ikarushka »

Расширил CWebUser по рецепту http://yiiframework.ru/doc/cookbook/ru/access.rbac.file

Код: Выделить всё


class WebUser extends CWebUser {
    private $_model = null;

    function getRole() {
        if($user = $this->getModel()){
            // в таблице User есть поле role
            return $user->role;
        }
    }

     function getUsername() {
           if($user = $this->getModel()){
            return $user->username;
        }
        
 }



    private function getModel(){
        if (!$this->isGuest && $this->_model === null){
            $criteria = new CDbCriteria;
                $criteria->with=array('sellerShopSettingGenerals');
                $criteria->select='`t`.id, `t`.role,`t`.username';
                $criteria->condition='`t`.id=:id AND `t`.status=:status AND `sellerShopSettingGenerals`.subdomain=:subdomain';
                $criteria->params=array(':id'=>$this->id,'status'=>'confirm', 'subdomain'=>$_GET['domain']);

                $this->_model = User::model()->find($criteria);
               
        }
        return $this->_model;
    }
}
 
В пердставлении

Код: Выделить всё

echo Yii::app()->user->role;
echo Yii::app()->user->username;
 
работают.

А в экшене контроллера

Код: Выделить всё

echo Yii::app()->user->role;
echo Yii::app()->user->username;
 
тишина!!

Сломал всю голову уже. Так и должно быть?

ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

Re: CWebUser проблема с раширением

Сообщение ikarushka »

Вот похоже таже проблема viewtopic.php?f=3&t=1007&hilit=CWebUser&start=30
Так она и осталась не решенной?

mrix
Сообщения: 125
Зарегистрирован: 2010.08.30, 11:48
Откуда: Россия, Новосибирск

Re: CWebUser проблема с раширением

Сообщение mrix »

Должно работать также. Попробуй в лог записать. Может, там стоит ob_start

Код: Выделить всё

Yii::log(Yii::app()->user->username, CLogger::LEVEL_ERROR); 

Johnatan
Сообщения: 167
Зарегистрирован: 2010.10.27, 13:06
Откуда: Reino de España

Re: CWebUser проблема с раширением

Сообщение Johnatan »

Код: Выделить всё

$criteria->params=array(':id'=>$this->id,'status'=>'confirm', 'subdomain'=>$_GET['domain']); 
Двоеточия нигде не потеряли?
Конференция: yii@conference.jabber.ru

ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

Re: CWebUser проблема с раширением

Сообщение ikarushka »

Ребята, спасибо за помощь
mrix
В лог пишет:
2011/04/14 14:45:55 [error] [application]
in /home/artem/webwork/shopband/protected/modules/admin/controllers/CatalogController.php (174)
174 строка это : Yii::log(Yii::app()->user->username, CLogger::LEVEL_ERROR);

johnatanb
двоеточия действительно потерял. Но видимо когда сто раз переписыва и пробывал всякие способы. Сейчас исправил - ситуация прежняя. Копаю

ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

Re: CWebUser проблема с раширением

Сообщение ikarushka »

Вызов в коетроллере:
CVarDumper::dump(Yii::app()->user->role, 10, true);
возвращает null
А в представлении тотже вызов дает верное значение

rak
Сообщения: 2040
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: CWebUser проблема с раширением

Сообщение rak »

ну тут нужно дебажить.
И желательно не вар дампом ;)

ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

Re: CWebUser проблема с раширением

Сообщение ikarushka »

Стыдно, но спрошу. А чем? ))

rak
Сообщения: 2040
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: CWebUser проблема с раширением

Сообщение rak »

ну лично я пользуюсь netbeans + xdebug, облегчает жизнь на 1000% :)

ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

Re: CWebUser проблема с раширением

Сообщение ikarushka »

Спасибо пошел втыкать ))

ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

Re: CWebUser проблема с раширением

Сообщение ikarushka »

Фуффф. Ну вроде начало проясняться на горизонте. Чего я только не делал, чтобы понять в чем дело, как только я не переписывал WebUser ничего не помогало.
В акшене: echo Yii::app()->user->role - пусто
В представлении: echo Yii::app()->user->role - верное значение.
Битва была жаркая )) В какой-то момент я решил проверить, а в других экшенах этого контроллера такая же проблема? И о ужос - в них echo Yii::app()->user->role отрабытывало верно.
Оказалась следующая история. Тот экшен, который проблемный дергался с сайта через CHtml::ajaxLink и ответ сервера я смотрел через FireBug (страница не перезагружалась), и в FireBug в POST на CVarDumper::dump(Yii::app()->user->role, 10, true); всегда приходило null. Но если к экшену обратится через адресную строку браузера, то все все ok - CVarDumper::dump(Yii::app()->user->role, 10, true); возвращает то что надо! При этом в проблемном экшене у меня ни какого кода кроме CVarDumper::dump(Yii::app()->user->role, 10, true); нет.
То есть сейчас вопрос можно переформулировать. Почему при расширении СWebUser вызов в экшене Yii::app()->user->role не работает, если обращаться к экшену асинхронно? Кто-то сталкивался с подобной проблемой?

ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

Re: CWebUser проблема с раширением

Сообщение ikarushka »

Ага! Все дело в GET параметрах которые присутсвуют в ajaxLink.
Короче, код проблемной ссылки у меня следующий:

Код: Выделить всё

echo CHtml::ajaxLink('X',
                            Yii::app()->controller->createUrl('catalog/delete', array('id'=>$oneCat->id, 'ajax'=>'yes')),
                            array(type=>'POST', 'success'=>'js:function(a) {$("#'.$oneCat->id.'").hide("slow").remove();  }',),
                            array('confirm'=>Yii::t("AdminModule.msCatalogAndGoods","catalog_deleteAtantion"), 'id'=>'gb-message-delete-'.$oneCategory->id)
                            ); 
в этом случае actionDelete c CVarDumper::dump(Yii::app()->user->role, 10, true); возвращаеь null.

Если GET параметры убрать

Код: Выделить всё

echo CHtml::ajaxLink('X',
                            Yii::app()->controller->createUrl('catalog/delete'),
                            array(type=>'POST', 'success'=>'js:function(a) {$("#'.$oneCat->id.'").hide("slow").remove();  }',),
                            array('confirm'=>Yii::t("AdminModule.msCatalogAndGoods","catalog_deleteAtantion"), 'id'=>'gb-message-delete-'.$oneCategory->id)
                            ); 
то все работает корректно. С чем может быть связано такое поведение???

ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

Re: CWebUser проблема с раширением

Сообщение ikarushka »

Не ну мистика же!?

Или запрос такой: catalog/delete/id/32/ajax/yes.html и тогда Yii::app()->user->role null

Или такой catalog/delete.html и тогда Yii::app()->user->role нужное значение.

А передавать параметры в экшен, не смотря на это, как-то надо

ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

Re: CWebUser проблема с раширением

Сообщение ikarushka »

Все ребята, разобрался!!!
Это была только моя заруба. Постараюсь объяснить. (Не уверен, что это кому-то нужно, но вдруг кому-нибудь пригодится).

Делаю модулем админку с доступом к ней многих пользователей. Но каждый пользователь у меня имеет свой субдомен. Какому пользователю, какой субдомен принадлежит - это соответствие хранится в бд в настройках аккаунта пользователя. Логинеться и работать в админке пользователь должен через свой субдомен: http://subdomain.site.ru/admin/controller/action.html
В WebUser в getModel у меня идет проверка на субдомен (на самом деле она и не нужна там совсем - но это я только сейчас понял):

Код: Выделить всё

$criteria->condition='`t`.id=:id AND `t`.status=:status AND `sellerShopSettingGenerals`.subdomain=:subdomain';
$criteria->params=array(':id'=>$this->id,':status'=>'confirm', ':subdomain'=>$_GET['subdomain']);

 
$_GET['subdomain'] значение попадает из адресной строки, для этого в конфигурации прописано правило:

Код: Выделить всё

'http://www.<subdomain:\w+>.shopband.ru/admin/<controller:\w+>/<action:\w+>'=>'/admin/<controller>/<action>' 
Ну и дальше все просто. Кода я обращаюсь к экшену через ajaxLink c GET параметрами

Код: Выделить всё

echo CHtml::ajaxLink('X',
                            Yii::app()->controller->createUrl('catalog/delete', array('id'=>$oneCat->id, 'ajax'=>'yes')),
                            ....
                            );  
В $_GET не попадает значение subdomain из адресной строки (Почему так происходит, пока не разобрался), там есть только $_GET['id'] и $_GET['ajax'].
Cледовательно, когда я в экшене дергаю Yii->app()->user->role WebUser получает пустую модель так как $_GET['subdomain'] == null.

Когда я убираю GET параметры из ajaxLink то $_GET['subdomain'] получает значение из адресной строки и Yii->app()->user->role в экшене работает корректно.

Лечится:
1) Или убрать условие `sellerShopSettingGenerals`.subdomain=:subdomain'
2) Или передать параметры ajaxLink с помощью 'data' => array( 'id' => $oneCat->id, 'ajax'=>'yes')
Вопчем хеппи энд - прошу извинить, если кого сильно отвлек ))

Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

Re: CWebUser проблема с раширением

Сообщение because »

летопись событий :)
RTFM !

Ответить