コントローラーのデフォルトのアクションを変更したいのは、ログインしているユーザーによって異なります。例:私のサイトには、発行者と作成者の2人のユーザーがいます。発行者がログインしたときのデフォルトのアクションとして発行者のアクションを設定し、作成者についても同じです。
私は何をすべきか?いつ自分の役割を確認し、関連するアクションを設定できますか?
これを行う別の方法は、コントローラーのメソッドでdefaultAction
プロパティを設定することです。ややこのように:init()
<?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のgetRoles()
をチェックして、返される配列の形式が'role'=>CAuthItem object
、であることを確認します。これが、でチェックしている理由ですarray_key_exists()
。
わからない場合、アクション名はアクション部分のない名前のみになります。たとえば、public function actionPublisher(){...}
アクション名がある場合は、次のようになりますpublisher
。
もう1つの簡単な方法は、デフォルトアクションを同じに保つことですが、そのデフォルトアクションは、ログインしているユーザーの種類に応じて追加のアクション関数を呼び出すだけです。たとえば、indexAction関数を条件付きで呼び出すthis->userAction
か this->publisherAction
、ログインしているユーザーを確認します。
「最初のユーザーページ」をユーザーテーブルに保存できると思います。また、ユーザーが認証されると、データベースからこのページを読み込むことができます。どこでこれを行うことができますか?最高の場所はUserIdentityクラスだと思います。その後、SiteController :: actionLogin();でこの値を取得できます。
「最初のページ」の値を取得または設定できます。
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ファイル内。