手探り状態ですが、なんとかここまで進みました。ここから、実際にコードを触ったりしていきます
今回は、ユーザテーブルにアクセスして、ログイン(ユーザ認証)するところまでを作ってみます
#UserモデルとUserProfileモデルの作成
元々作られているUserクラスを削除して、新たにデータベースに合わせたUserクラスを作成する
htdocs/ec_site/protected/models/User.php
を削除
次にブラウザからhttp://www.example.com/ec_site/index.php?r=gii
にアクセス
(パスワードは「その1」で最後に設定した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
...
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に置換し、英語表示を日本語に変える
...
<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
/**
* 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
に追加する。ついでにラベルを日本語化しておく
...
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」タブからログインしてみる
どうでしょうか。うまくいきましたか?
次はデータの更新作業をしてみます。