PHPのRuby on Railsクローンのフレームワーク Akelos PHPをいじってみた出来事のメモ。

Akelosをいじってみるメモ帳

Akelos PHP Blogチュートリアル一覧(全18記事)
Akelos PHP ユーザ認証チュートリアル一覧(全19記事)

2008年09月02日

Akelosユーザ認証チュートリアル 11.Accountコントローラ アクション実装2

アクション実装の続きです

ユーザ登録削除 deleteアクション
削除は、実際にはデータを消すわけではなくis_enableフラグをfalseに設定し、無効なユーザとしています。実際のコードを示します。
function delete()
{
//ユーザ情報を書き戻す
$u = unserialize($_SESSION['user']);

if(!empty($u->id) && $this->Request->isPost()){
//is_enableフラグをfalseで上書き
$this->user = $this->User->find($u->id);

if($this->user->updateAttribute('is_enable',false)){
$this->flash['notice'] = $this->t('deleted user account');
$this->redirectTo(array('action' => 'index'));
}
}

}

ここではupdateAttributeメソッドにより上書きを指示しています。
似た名前のものとして、 updateAttributesというのもあるので注意です。
どっちも機能は基本手kに同じですが、updateAttributesは複数を、updateAttributeはひとつだけを修正する場合に利用します。
どちらも、呼び出すと上書きとsaveを自動でしてくれます。(内部的には setAttributeして、そのあとsave()しているだけです)

updateAttributeメソッドは、
updateAttribute( '修正したい属性名', '上書きする値','validateによるチェックをするかどうか')
という呼び出しになります。3つめのvalidateチェックのフラグは省略可能です。標準でtrue。つまり確認します。


ユーザ登録情報修正 modifyアクション
登録情報修正は、editアクションに作られたものが流用出来そうですが、修正をユーザに委ねる関係上、結構異なりますので注意。具体的にはid情報を引き回さなくてもSESSIONから取り出しています。
ですが、書き換えを行う時には一回findで取り出す必要がありますので注意。
以下にコードを示します。
//ユーザ登録情報修正
function modify()
{
//ユーザ情報を書き戻す
$u = unserialize($_SESSION['user']);

if(!empty($u->id) && !empty($this->params['user'])){
$this->user =& $this->User->find($u->id);
}else{
$this->user = $u;
$this->user->set('passwd','');
}
//入力された情報で更新を行う
if(!empty($this->params['user'])){
$this->user->setAttributes($this->params['user']);
if($this->Request->isPost() && $this->user->save() ){
$_SESSION['user'] = serialize($this->user);
$this->flash['notice'] = $this->t('updated user profile');
$this->redirectTo(array('action' => 'modify'));
}
}
}

ここではsetAttributesとsaveを別々に利用しています(updateAttributesではなく)。
$this->params['user']にはWebの画面からPOSTされてきたデータが入っています。
その配列データをそのまま読み込ませています。
細かく xxx = yyyy とか書かなくて良いのは楽ですね。
ただし、データの扱い方に心配な時や、入力チェックをここで追加で行う必要があれば、個別展開も考えましょう。validateのほうできちんと処理を書いていれば心配はないですけどね。

setAttributesメソッドはそのまま引数に配列を入れるだけです。
第二引数をつかってオブジェクト指定のupdateとかも出来ますが、複雑なので通常は使わないほうがいいでしょう。

ちなみに、save時に強制的にvalidateされます。要注意。



パスワード忘れ時のパスワード再発行 remindアクション
//パスワード忘れのパスワード再送
function remind ()
{
//セッションを念のため破棄(ユーザ情報不一致が発生するため)
$_SESSION['user'] = false;
if($this->Request->isPost()) {
//ユーザモデルクラスを新たに作る
$u = new User();
//emailアドレスが一致するユーザの情報を探し、Userクラス$uに入れる
$u = & $u->findFirstBy('email AND is_enable', $this->params['user']['email'],true);

//一致するメールアドレスが見つかったかどうかを判断
if( !empty($u->email) ) {
//ユーザモデルに新しいパスワードの発行と更新を依頼
$new_passwd = $u->new_password();

////ここに後でメール処理を追記予定
////詳細はメール機能のところで

$this->flash['notice'] = $this->t('succeeded in the email send of new password.');
$this->redirectTo(array('action'=>'login'));
}else{
$this->flash['notice'] = $this->t('Error! Sorry,plese retry email remind...');
$this->redirectTo(array('action'=>'remind'));
}


}
}

ちょっと長いですね。forgot_passwordメソッドとか長い名前がついているサンプルも多いですが、ここではremindとしています。
ログイン出来ない状態なので、$uにUserモデルを新しく作り、その上で入力されたアドレスから、登録メールアドレスを探す処理をfindFirstByメソッドで行っています。
パスワードの作成ルールはモデルで定義されているので、$u->new_password()で発行し、新しいパスワードを受け取っています。
その後、メールの送信処理を入れるんですが、ここでは入れず、あとでmailerを作ったときに足します。

以上でユーザ向けコントローラの処理は実装終了です。
posted by AMUAMU at 15:57| Comment(0) | TrackBack(0) | チュートリアル | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/105900741

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。