2013-10-31 72 views
1

在yii中建立一個站點,其中有3種類型的用戶。 在UserIdentity :: authenticate()中,我設置了像這樣的用戶類型。 $this->setState('role', $user->role->id);根據這種類型,我想重定向到屬於這種類型的用戶的模塊。更具體;如果Yii :: app() - > user-> role == 3我想重定向到名爲「tradesman」的模塊的默認頁面。 這是我在SiteController得到:: actionLogin():登錄後重定向到模塊Yii

/** 
* Displays the login page 
*/ 
public function actionLogin() 
{ 
    $model=new LoginForm; 
    // if it is ajax validation request 
    if(isset($_POST['ajax']) && $_POST['ajax']==='login-form') 
    { 
     echo CActiveForm::validate($model); 
     Yii::app()->end(); 
    } 

    // collect user input data 
    if(isset($_POST['LoginForm'])) 
    { 
     $model->attributes=$_POST['LoginForm']; 
     // validate user input and redirect to the previous page if valid 
     if($model->validate() && $model->login()){ 
      switch(Yii::app()->user->role){ 
       case 3: 
        $this->redirect(Yii::app()->controller->module->tradesman); 
        break; 
       default: 
        $this->redirect(Yii::app()->user->returnUrl); 
      } 
     } 
    } 
    // display the login form 
    $this->render('login',array('model'=>$model)); 
} 

重定向到一個模塊不以這種方式工作。我得到Php通知'嘗試獲取非對象的屬性'。然後我在TradesmanModule中創建了一個方法'defaultUrl,它返回Yii::app()->createUrl($this->getId() . '/default/index');。我試圖重定向到Yii::app()->controller->module->defaultUrl,但結果是一樣的。

我也試過$this->redirect('tradesman/default/index'); & $this->redirect('application.modules.tradesman');但後來我得到一個404錯誤,說'系統無法找到請求的操作'匠人'。'。

如果我以具有角色3的用戶身份登錄,並且我導航到模塊的默認url,它確實有效。但我如何重定向?

+0

顯示你的UrlManager規則配置 – CreatoR

+0

你真的想要嗎? – veelen

+0

如果你幫助我的答案 - 沒有:) – CreatoR

回答

2

嘗試$this->redirect('/tradesman/default/index'),並確保模塊存在DefaultController,它的作用actionIndex

更新:
@НиколайКонев是正確的,它只是重定向到URL /tradesman/default/index,沒有路線。對於由路線重定向:

$this->redirect(array('/tradesman/default/index')) 

它到模塊tradesman,控制器default和行動index絕對路徑。如果你想重定向在同一模塊中到控制器,你可以使用這個代碼:

$this->redirect(array('default/index')) 

如果你想重定向到應用程序主控制器,您需要使用:

$this->redirect(array('/default/index')) // with "/" at the beginning 

再次感謝@НиколайКонев

1

爲確保路線是w工作會有,你必須通過數組CController::redirect()

// for example 
    $this->redirect(['/route/starts/from/slash']); 
    // your case 
    $this->redirect(['/tradesman/default/index']); 

在其他情況下,你將有重定向URL上的規則改變打破。