S2Container+S2Dao.PHP5を使ってみる(その4)
S2Base.PHP5 with Smartyで組み合わせると、ありがたいことに画面遷移の仕組みは提供されているので、それをそのまま使います。actionからtemplateや他のactionへのredirectを指定してやれば良いという訳です。面倒なデータアクセス関係は全部s2daoがやってくれるので、あとは
という依存関係の決まりを守って作っていけば、自動的に分かりやすいプログラムが書けそうな感じです。
そんな訳で、まあUIから作っていきます。templateとactionは一対で、templateを処理する直前にactionのexecuteが実行される、ということなので、htmlのフォームで自分自身へPOSTするようにして、actionのexecute内でrequestの内容をチェックし、クリックされたsubmitボタンの名前によって遷移先を判断し、他のactionへredirectするなり自身のtemplateを指定してやるようにする、というのを基本に考えれば良さそうです。
- memberLogin.tpl
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Login</title> </head> <body> <form action="d.php" method="post"> <input type="hidden" name="mod" value="Login"/> <input type="hidden" name="act" value="memberLogin"/> メールアドレスとパスワードを入力してログインしてください <br/> e-mail <br/> <input type="text" name="email" size="30" value="{$dto->getEmail()}"/> <br/> password <br/> <input type="password" name="password" size="30" value="{$dto->getPassword()}"/> <br/> <input type="submit" name="memberLogin:viewCart" value="ログイン"/> <br /> <input type="submit" name="memberLogin:memberEntry" value="新規登録"/> </form> </body> </html>
とりあえずこんな感じ。ログインはemailとpasswordで行う、という前提で、それら二つのテキストボックスと、「ログイン」「新規登録」の二つのボタンを用意します。submitボタンの名前は、わかりやすいように"遷移元のaction名:遷移先のaction名"にしてみました。別に他の命名法でもいいかと思いますが、今のところこれで不便はありません。
<input type="hidden" name="act" value="memberLogin"/>
と、actパラメータをmemberLoginにして、自身へのPOSTを指定しています。
テキストボックスのvalueに、それぞれ
{$dto->getEmail()}
{$dto->getPassword()}
と指定していますが、viewにdtoをassignする想定です。dtoはこの画面に必要なデータのフィールドを持ち、それらそれぞれにgetter、setterがある、という訳です。まあここは後で書けばいいんですが、どうせ次はdtoを書くので...。
で、次はdtoですが、emailとpasswordは要るとして、他に余計なフィールドまで勢いで書いてしまいました。まあ、ほんとはisAuthorizedとかは後で付け足したのですが、気にしない。また、結局不要なフィールドもあるんですが、とりあえず使わなければいいだけなので放置。
<?php class MemberLoginDto { private $id; private $firstName; private $lastName; private $email; private $password; private $isAuthorized; private $message; public function getId(){return $this->id;} public function setId($id){$this->id = $id;} public function getFirstName(){return $this->firstName;} public function setFirstName($firstName){$this->firstName = $firstName;} public function getLastName(){return $this->lastName;} public function setLastName($lastName){$this->lastName = $lastName;} public function getEmail(){return $this->email;} public function setEmail($email){$this->email = $email;} public function getPassword(){return $this->password;} public function setPassword($password){$this->password = $password;} public function getIsAuthorized(){return $this->isAuthorized;} public function setIsAuthorized($isAuthorized){$this->isAuthorized = $isAuthorized;} public function getMessage(){return $this->message;} public function setMessage($message){$this->message = $message;} public function __construct(){} } ?>
次にaction。S2Base with Smartyの機能を利用するため、implements S2Base_Actionになってます。まあ、S2Baseのaction commandで勝手にそのように生成されるので、気にせずいきます。
service interfaceとdtoのフィールドがあります。setter/getterを書いておいて、actionにDIするようにする、と。"memberLogin:memberEntry"のsubmitボタンで新規登録用actionへredirect、"memberLogin:viewCart"のsubmitボタンでログイン処理を行って、ログイン処理が成功すればviewCartへredirect。それ以外はmemberLogin自身のtemplateを処理してます。ログイン処理はまだ書いてないですが、serviceにauthorizeメソッドを実装して、結果がdto→isAuthorizedに設定されるようにしようかなーと。
<?php class MemberLoginAction implements S2Base_Action { private $service; private $dto; public function setService(MemberLoginService $service = null){ $this->service = $service; } public function getService(){ return $this->service; } public function setDto(MemberLoginDto $dto = null){ $this->dto = $dto; } public function getDto(){ return $this->dto; } public function execute(S2Base_Request $request, S2Base_View $view) { if($request->getParam('memberLogin:memberEntry') != null) { return "redirect:memberEntry"; } elseif($request->getParam('memberLogin:viewCart') != null) { $this->dto->setEmail($request->getParam('email')); $this->dto->setPassword($request->getParam('password')); //$this->service->authorize($this->dto); //ログイン処理をする //if($this->dto->getIsAuthorized() == true) //{ // $view->assign('dto',$this->dto); // return "redirect:viewCart"; //} $view->assign('dto', $this->dto); return "memberLogin.tpl"; } else { $view->assign('dto', $this->dto); return "memberLogin.tpl"; } } } ?>
あとはaction diconですが、最初にaction classに書かれたserviceとdtoだけを使う分には、自動生成されたやつをそのまま使えば大丈夫なはず。
そんな感じで、次はserviceとdxoを書いていきます。
続く...