スキャフォールディングで出力されたログイン処理の入り口は、site コントローラの login (site/login)アクションにあるのでソースを眺めて見る。Definitive Guide を見たおかげで、ようやく何をしているか推測できるようになってきた。
このログイン処理へは、サイト表示上部の Login の他、コントローラで定義された accessRules で、アクションが「admin」に指定されているとリダイレクトされる。これは、フレームワーク動作の中心となるアプリケーションコンポーネントの中の CWebUser が持つパラメータ 「loginUrl」によって、デフォルトが「/site/login」に定められているからのようだ。
コアアプリケーションコンポーネントのプロパティは、config/main.php の中で初期設定できる。Core Application Components をみると、「user: CWebUser」とあるので、config/main.php の componets 指定で、
return array( 'components'=>array( 'user'=>array( 'loginUrl'=>'controller/action', ),
を設定すれば、ログイン処理は site/login 以外のアクションに変更できそうだ。
ログイン表示のビューは views/site/lgoin.php に置かれているので、タイトルなど日本語に変更する。入力フィールドのタイトルは、モデル(model/LoginForm.php)に定義された attributeLabels() メソッドからアトリビュート名(モデル内のテーブルカラム名など定義)をキーとした配列で渡されるので、次のようにオーバーライドした。
public function attributeLabels() { return array( 'username'=>'ログイン名', 'password'=>'パスワード', 'rememberMe'=>'次回ログインを省略', ); }
さて、認証処理をする components/UserIdentity.php の authenticate() メソッドへは、
SiteController.php の actionLogin() 内 $model->validate() により
model/LoginForm.php の rules 定義で authenticate() が実行され
authenticate() 内 $identity->authenticate() により
components/UserIdentity.php の authenticate() が実行される
順番で進む。チュートリアルでは UserIdentity.php の authenticate() で、入力データとDB上のユーザテーブルを照合し認証結果を戻す。
ここで、今後のサイト作りでログインした人の名前を表示したいので、次のような仕掛けを作ってみる。
セッションデータに名前を登録し、ログイン時にその名前をナビゲーションに表示するようにする。
user テーブルに dispname カラムを追加し、それを読み込んで表示するようにする。
先ずはUserIdentity クラスに $_dispname プロパティを追加し、getDispname()で読み取れるように準備する。次にLoginForm.php の authenticate()で、ユーザ認証でエラーがなかった際、Yii:app()->user->login() を実行してセッションに登録しているようなので、その下に
Yii::app()->user->setState(‘dispname’, $identity->dispname);
UserIdentity.php の authenticate()でユーザー認証が正常に行なわれた場合、下のように
$this->setState('dispname', $model->dispname);
として名前を登録する。
ナビゲーションの表示は、レイアウトビュー views/layouts/main.php で行なわれている。
Yii::app()->user->name
を
Yii::app()->user->getState(‘dispname’)
に変更して、名前を表示するようになった。
最後に、ログイン画面のエラー表示を変更してみる。Yii のエラー表示は、入力項目別に行なう方法とページの一か所にまとめて表示する方法を用意している。両方同時表示も可能。エラーメッセージを日本語表示したい場合は、Yii デフォルトコントローラ/アクションの変更を参照して下さい。
エラーが発生した場合 LoginForm.php の authenticate()内で、addError() を利用して CHtml ヘルパーで属性とエラーメッセージを表示している。スキャフォールドで作成された認証エラーは、ご丁寧にログイン名とパスワードのどちらで発生したものか知らせてくれるので、これを止めて、一か所のエラー表示でログインデータの誤りを表示するようにしたい。
そこでエラーを case 処理せず、そして属性を指定しないで登録してみた。
switch($identity->errorCode) { case UserIdentity::ERROR_NONE: : default: $this->addError('', 'ログイン名、パスワードが誤りです。'); break; }
これで、views/site/login.php にある CHtml::errorSummary()で、登録したエラーが表示されるようになった。各項目別にエラーを表示したい場合は、CHtml::error()を利用すればよい。
(yii-1.1.0.r1700)