前回までの成果物:
本章から読み始めるという人がいれば、前回までの成果物をこちらに置いてあるので、ダウンロードして使ってください。
htdocs-chap10.zip をxamppのhtdocs以下に展開してください。また2つのSQLのファイルをMySQLのyiiのデータベース上に展開してください。
各自の環境に合わせて設定を変更する必要があります。
protected/config/main.php に以下のような部分があります。
// chap7: メール送信ライブラリを追加 'mailer'=>array( 'class' => 'application.extensions.mailer.EMailer', 'From' => 'yii.juncheng@gmail.com', // 送信者のアドレス 'FromName' => 'yii-juncheng',// 名前 'CharSet' => 'iso-2022-jp', //文字コード 'Encoding' => '7bit', 'Mailer'=>'smtp', 'Port'=>'587', 'SMTPSecure'=>'tls', 'Host'=> 'smtp.gmail.com', 'SMTPAuth' => true, 'Username' => 'yii.juncheng@gmail.com', // gmailのメールアドレスがユーザ名となる 'Password' => 'unko9314', // ここにGmailのアドレスを入力する ),
最後のUsernameとPassword の部分をご自身のGmailの設定にあわせて変更してください。
またもし0章で、本サイトと異なった設定を行った場合(MySQLのデータベース名やパスワード)は、同様にmain.phpの中で、以下の部分を変更してください。
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=yii',// dbname=yiiに変更する
'emulatePrepare' => true,
'username' => 'root',
'password' => 'unko9314', // ここを0章で設定したmysqlのパスワードに変更する
'charset' => 'utf8',
),
dbname=の部分がデータベースの名称で、passwordの部分がMySQLのrootパスワードです。
本章の目的:
今まではすべて一般ユーザ向けの画面を作成してきましたが、本章では管理ユーザ向けの画面を作成するための準備を行っていきます。
ログイン時の処理変更:
一般ユーザと管理ユーザの区別はUserのデータベース上でroleという項目があり、その値は0の時は一般ユーザで、1の時は管理ユーザになるように、はじめの段階で決めていました。
いままではログインをするとhttp://localhost/user/ に遷移するように出来ていましたが、本章では管理ユーザの場合にはhttp://localhost/admin/ に遷移するように条件分岐を追加します。
SiteController.php を開いてください。actionLogin() のメソッドを以下のように変更します。
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()) {
// ログイン後に自動でページ遷移するように変更
if(Yii::app()->user->isUser) { // 一般ユーザであれば/userに遷移
$this->redirect('/user');
} elseif(Yii::app()->user->isAdmin) { // chap11: 管理者ユーザであれば/adminに遷移
$this->redirect('/admin');
} else {
$this->redirect(Yii::app()->user->returnUrl);
}
}
}
// display the login form
$this->render('login',array('model'=>$model));
}
差分は、以下の条件分岐が追加された点です。
} elseif(Yii::app()->user->isAdmin) { // chap10: 管理者ユーザであれば/adminに遷移
$this->redirect('/admin');
これで管理ユーザの場合、すなわちrole=1のユーザはログイン時にhttp://localhost/admin にジャンプします。
AdminController の追加:
protected/contollers の中に以下のソースコードのAdminController.php を追加してください。
<?php
// chap11: Admin機能追加
class AdminController extends Controller
{
// アクセス制限を利用する
public function filters()
{
return array('accessControl',);
}
// アクセスルール
public function accessRules()
{
return array(
// 一般ユーザに対して以下に列挙するactionの実行を許可する
array('allow',
'actions'=>array('index',),
'expression'=>'$user->isAdmin',
),
// 上記のルールに適合しないすべてのユーザを排除
array('deny',
'users'=>array('*'), // *: 全ユーザ ?: 匿名ユーザ @: 認証済みのユーザ
),
);
}
public function actionIndex()
{
$this->render('index');
}
}
- 現時点ではアクションはindex という先頭ページに対応したアクションだけが存在しています。
- accessRules() のメソッドでは、アクセスルールが定義されており、管理者ユーザのみが実行できるような仕組みになっています。
- 上記ではhttp://localhost/admin にアクセスした際に、actionIndex() が実行されます。ここでは単純にviews/admin/index.php を表示するだけのプログラムが実行されます。
そこでprotected/views/admin/の中にindex.php を追加します。内容はとりあえず以下の通りにします。
<?php $this->breadcrumbs=array( 'Admin', ); ?> <h1>管理者画面</h1> <p>現在、管理者としてログイン中です</p>
メニューの変更:
以上までの内容を反映して管理者ユーザがログインすると以下のような画面になります。
※ ただし現在は一人目の管理者ユーザを作ることはできないので、phpmyadminなどを利用して、ユーザのroleの値を0から1に書き換えてください。
一般ユーザ向けのメニューが表示されて邪魔なので、表示されないように変更をします。
その原因として前回まで用いていたソースコードで一部問題のある部分がありましたので以下のように修正をお願いします。protected/components/WebUser.php を開いて頂いて、以下のように少し変更を加えてください。(何も値を返さないようなケースが生まれてしまうためです)
<?php
class WebUser extends CWebUser
{
// 通常のユーザかどうか
public function getIsUser()
{
// ログインしていない場合
if($this->isGuest)
return false;
// 自分のUserデータを取得
$user = User::model()->findByPk($this->id);
// 空の場合
if(!isset($user))
return false;
// ユーザかどうか
if($user->role == 0)
return true;
else
return false; // chap11 修正
}
// 管理者かどうか
public function getIsAdmin()
{
// ログインしていない場合
if($this->isGuest)
return false;
// 自分のUserデータを取得
$user = User::model()->findByPk($this->id);
// 空の場合
if(!isset($user))
return false;
// 管理者かどうか
if($user->role == 1)
return true;
else
return false; // chap11 修正
}
}
?>
この変更を反映すると、以下のように邪魔なメニューが表示されなくなりました。
ただしプロフィールの編集は、現在管理者ユーザに権限が与えられていないので、管理者ユーザもプロフィール編集できるように、UserController.php の処理を少し変更します。以下のようにaccessRules() に許可の項目を増やしてください。
// アクセスルール
public function accessRules()
{
return array(
// 一般ユーザに対して以下に列挙するactionの実行を許可する
array('allow',
'actions'=>array('index',
'test',
'bbs', // chap8 : メッセージ機能
'profile', // chap9: プロフィール編集機能
),
'expression'=>'$user->isUser',
),
// chap11: 管理者もプロフィール編集できるように
array('allow',
'actions'=>array('profile'),
'expression'=>'$user->isAdmin',
),
// 上記のルールに適合しないすべてのユーザを排除
array('deny',
'users'=>array('*'), // *: 全ユーザ ?: 匿名ユーザ @: 認証済みのユーザ
),
);
}
これで管理ユーザもプロフィールの編集ができるようになりました。もし管理者にもメッセージボードの投稿を許可する場合は、必要に応じて、アクセスルールを編集すればよいでしょう。なおメニューの表示処理は protected/views/layouts/main.php を編集すれば、管理者ユーザで表示するメニュー、一般ユーザで表示するメニューなど調整することができます。
今回は簡単でしたが、以上で終了します。具体的な管理機能は次回から追加していきます。
今回の成果物:
今回の成果物は以下にリンクを用意しています。
- htdocs-chap11.zip : ソースコード
- bbs.sql , user.sql : データベースのダンプファイル

