初めてPHPのフレームワーク（Yii）を使ってみる　その２

手探り状態ですが、なんとかここまで進みました。ここから、実際にコードを触ったりしていきます
今回は、ユーザテーブルにアクセスして、ログイン（ユーザ認証）するところまでを作ってみます

***

#UserモデルとUserProfileモデルの作成
~~元々作られているUserクラスを削除して、新たに~~データベースに合わせたUserクラスを作成する
~~`htdocs/ec_site/protected/models/User.php`を削除~~
次にブラウザから`http://www.example.com/ec_site/index.php?r=gii`にアクセス
（パスワードは「その１」で最後に設定したGiiのパスワード）
Model Generatorリンクをクリックして、Model Generatorページへ
Table Nameフィールドにec_user（ユーザテーブル名）、Table Prefixフィールドにec_と入力し、Previewボタンを押す
下に作成されるコード一覧（models/User.php）が表示されるので、Generateボタンを押すと、`htdocs/ec_site/protected/models/User.php`が生成される
同様にして、UserProfileモデルも作成する

#日本語化
loginForm.phpとlogin.phpははじめに生成されるものをほとんどそのまま使える。
ただし、usernameにあたる部分をメールアドレスにしたので、わかりやすいようにusernameをmailaddrに変える。また、ブラウザでの表示を日本語に変える。

##LoginForm.phpの編集
`htdocs/ec_site/protected/models/LoginForm.php`の中のusernameをmailaddrに置換し、英語表示を日本語に変える。

```php:htdocs/ec_site/protected/models/LoginForm.php.php
<?php
...
	public $mailaddr;
	public $password;
	public $rememberMe;

	private $_identity;
...
	public function attributeLabels()
	{
		// 日本語のラベルに書き換える
		return array(
			'mailaddr' => 'メールアドレス',
			'password' => 'パスワード',
			'rememberMe' => 'ログイン状態を保存する',
		);
	}

	/**
	 * Authenticates the password.
	 * This is the 'authenticate' validator as declared in rules().
	 */
	public function authenticate($attribute,$params)
	{
		if(!$this->hasErrors())
		{
			$this->_identity=new UserIdentity($this->mailaddr,$this->password);
			if(!$this->_identity->authenticate())
				$this->addError('password','メールアドレスかパスワードが正しくありません');
		}
	}
...
```

##login.phpを編集
`login.php`の中のusernameをmailaddrに置換し、英語表示を日本語に変える

```php:htdocs/ec_site/protected/views/site/login.php
...
<h1>ログイン</h1>

<p>メールアドレスとパスワードを入力してください:</p>

<div class="form">
...
	<p class="note"><span class="required">*</span>は必須事項です</p>

	<div class="row">
		<?php echo $form->labelEx($model,'mailaddr'); ?>
		<?php echo $form->textField($model,'mailaddr'); ?>
		<?php echo $form->error($model,'mailaddr'); ?>
	</div>
...
	<div class="row buttons">
		<?php echo CHtml::submitButton('ログイン'); ?>
	</div>

<?php $this->endWidget(); ?>
</div><!-- form -->
```

#認証部分を作る
##UserIdentuty.phpを編集
`htdocs/ec_site/protected/components/UserIdentity.php`を編集

```php:htdocs/ec_site/protected/components/UseeIdentity.php
<?php

/**
 * UserIdentity represents the data needed to identity a user.
 * It contains the authentication method that checks if the provided
 * data can identity the user.
 */
class UserIdentity extends CUserIdentity
{
	private $_id;

	public function authenticate()
	{
		$username=$this->username;
		$user=User::model()->find('mailaddr=?',array($username));
		if($user===null)
			$this->errorCode=self::ERROR_USERNAME_INVALID;
		else if(!$user->validatePassword($this->password))
			$this->errorCode=self::ERROR_PASSWORD_INVALID;
		else
		{
			$this->_id=$user->id;
			$this->username=$user->mailaddr;
			$this->errorCode=self::ERROR_NONE;
		}
		return $this->errorCode==self::ERROR_NONE;
	}

	public function getId()
	{
		return $this->_id;
	}
}
```

~~##CUserIdentity.phpを編集
usernameをmailaddrに替えたために、継承元ファイルも変えなければならなくなった。`yii/framework/web/auth/CUserIdentity.php`の中のusernameをmailaddrに置換する~~


##パスワードのチェックをするメソッドを追加する
パスワードのバリデーションチェック、ハッシュと検証をするメソッドを`htdocs/ec_site/protected/models/User.php`に追加する。ついでにラベルを日本語化しておく

```php:htdocs/ec_site/protected/models/User.php
...
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'mailaddr' => 'メールアドレス',
			'password' => 'パスワード',
			'auth' => 'Auth',
		);
	}
...
	public function validatePassword($password)
	{
		return CPasswordHelper::verifyPassword($password,$this->password);
	}
 
	public function hashPassword($password)
	{
		return CPasswordHelper::hashPassword($password);
	}
...
```

#テスト
MySQLAdminでec_userに適当なデータを1行ぶん作り（パスワードはハッシュがかかっているので、`/htdocs/ec_site/protected/date/schema.mysql.sql`のINSERT文からdemoまたはadminをハッシュした文字列をコピーするといい）、サイトの「Login」タブからログインしてみる

***

どうでしょうか。うまくいきましたか？
次はデータの更新作業をしてみます。