我想更改控制器的默认操作取决于登录的用户。 防爆。我的网站中有两个用户:发布者和作者,我希望在发布者登录时将发布者操作设置为默认操作,对作者也是如此。
我该怎么办?我什么时候可以查看我的角色并设置相关的行动?
答案 0 :(得分:6)
另一种方法是在控制器defaultAction
property中设置init()
method。有点像这样:
<?php
class MyAwesomeController extends Controller{ // or extends CController depending on your code
public function init(){
parent::init(); // no need for this call if you don't have anything in your parent init()
if(array_key_exists('RolePublisher', Yii::app()->authManager->getRoles(Yii::app()->user->id)))
$this->defaultAction='publisher'; // name of your action
else if (array_key_exists('RoleAuthor', Yii::app()->authManager->getRoles(Yii::app()->user->id)))
$this->defaultAction='author'; // name of your action
}
// ... rest of your code
}
?>
结帐CAuthManager's getRoles()
,看看返回的数组格式为'role'=>CAuthItem object
,这就是我使用array_key_exists()
查看的原因。
如果您不知道,操作名称将只是没有操作部分的名称,例如,如果您有public function actionPublisher(){...}
,则操作名称应为:publisher
。
答案 1 :(得分:1)
您可以做的另一个更简单的事情是保持默认操作相同,但默认操作只是根据登录的用户类型调用其他操作函数。例如,您有indexAction函数有条件地调用{ {1}}或this->userAction
取决于对登录者的检查。
答案 2 :(得分:0)
我认为你可以保存&#34;第一个用户页面&#34;在用户表中。当用户通过身份验证时,您可以从数据库加载此页面。你可以在哪里做到这一点?我认为最好的地方是UserIdentity类。之后,您可以在SiteController :: actionLogin();
中获取此值您可以获取或设置&#34;第一页&#34;值:
if (null === $user->first_page) {
$firstPage = 'site/index';
} else {
$firstPage = $user->first_page;
}
这是一个完整的课程:
class UserIdentity extends CUserIdentity
{
private $_id;
public function authenticate()
{
$user = User::model()->findByAttributes(array('username' => $this->username));
if ($user === null) {
$this->errorCode = self::ERROR_USERNAME_INVALID;
} else if ($user->password !== $user->encrypt($this->password)) {
$this->errorCode = self::ERROR_PASSWORD_INVALID;
} else {
$this->_id = $user->id;
if (null === $user->first_page) {
$firstPage = 'site/index';
} else {
$firstPage = $user->first_page;
}
$this->errorCode = self::ERROR_NONE;
}
return !$this->errorCode;
}
public function getId()
{
return $this->_id;
}
}
/**
* 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())
$this->redirect(Yii::app()->user->first_page);
}
// display the login form
$this->render('login', array('model' => $model));
}
此外,您只能在此文件中编写正确的代码。在SiteController文件中。