S2Container+S2Dao.PHP5を使ってみる(その7)
セッション回りが出来たので、ログイン後に遷移するカート画面を作っていきます。まずはtemplateから。カートでは、"ログインした人の名前さんのカート"とか表示したいので下記の様にしてみました。フォームの遷移先actionはやはり自分自身なのでviewCart、そしてactionでの遷移先決定用にsubmitボタンの名前は"viewCart:selectPaymentMethod"にしています。カートに入れる商品は、テーブルすら存在していないので今後実装するとして、今は"カートの内容"とだけ書いておきます。
- viewCart.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>ViewCart</title> </head> <body> <form action="d.php" method="post"> <input type="hidden" name="mod" value="Login"/> <input type="hidden" name="act" value="viewCart"/> {$dto->getFirstName()} {$dto->getLastName()}さんのカート </br> <input type="submit" name="viewCart:selectPaymentMethod" value="レジへ進む"/> </form> カートの内容 ... </body> </html>
次にactionです。セッション変数sessionMemberIdが設定されていれば、そのデータをdtoに設定し、serviceの初期化メソッドを呼びます。
- ViewCartAction.class.php
<?php class ViewCartAction implements S2Base_Action { private $service; private $dto; public function setService(ViewCartService $value){ $this->service = $value; } public function getService(){ return $this->service; } public function setDto(ViewCartDto $value){ $this->dto = $value; } public function getDto(){ return $this->dto; } public function execute(S2Base_Request $request, S2Base_View $view) { if(isset($_SESSION['sessionMemberId']) == true) { $this->dto->setId($_SESSION['sessionMemberId']); $this->service->initialize($this->dto); } else { $this->dto->setFirstName("ゲスト"); $this->dto->setLastName(""); } if($request->getParam('viewCart:selectPaymentMethod') != null) { $view->assign('dto', $this->dto); return "redirect:selectPaymentMethod"; } else { $view->assign('dto', $this->dto); return "viewCart.tpl"; } } } ?>
action diconです。自動生成でserviceの設定までされています。aspectでSessionFilterを適用します。
- ViewCartAction.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components namespace="viewCartAction"> <include path="%S2BASE_PHP5_ROOT%/app/modules/Login/dicon/ViewCartService.dicon"/> <include path="%S2BASE_PHP5_ROOT%/app/modules/Login/dicon/SessionFilter.dicon"/> <component name="action" class="ViewCartAction"> <aspect>sessionFilter.filter</aspect> <property name="dto">dto</property> <property name="service">viewCartService.service</property> </component> <component name="dto" class="ViewCartDto"> </component> </components>
dtoです。特に説明の必要はないです。
- ViewCartDto.class.php
<?php class ViewCartDto { private $id; private $firstName; private $lastName; 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 getMessage(){return $this->message;} public function setMessage($message){$this->message = $message;} public function __construct(){} } ?>
serviceでは、initialize()でmemberIdから会員を検索し、結果をdxoを用いてdtoにコピーします。
- ViewCartService.class.php
<?php interface ViewCartService { public function initialize(ViewCartDto $dto); } ?>
- ViewCartServiceImpl.class.php
<?php class ViewCartServiceImpl implements ViewCartService { private $dxo; private $memberDao; public function setDxo(ViewCartDxo $value = null){ $this->dxo = $value; } public function getDxo(){ return $this->dxo; } public function setMemberDao(MemberDao $value = null){ $this->memberDao = $value; } public function getMemberDao(){ return $this->memberDao; } public function __construct(){} public function initialize(ViewCartDto $dto) { $memberArray = $this->memberDao->getMemberByIdArray($dto->getId()); if(0 < count($memberArray)) { $this->dxo->copyMemberToDto($memberArray[0], $dto); } else { $this->dxo->copyMemberToDto(null, $dto); } //カートの中身を取得するコードを書く } } ?>
dxoでは、MemberEntityのデータをdtoにコピーするメソッドを定義しています。
- ViewCartDxo.class.php
<?php interface ViewCartDxo { public function copyMemberToDto(MemberEntity $entity = null, ViewCartDto $dto = null); } ?>
- SessionDxoImpl.class.php
<?php class ViewCartDxoImpl implements ViewCartDxo { public function __construct(){} public function copyMemberToDto(MemberEntity $entity = null, ViewCartDto $dto = null) { if($entity != null) { $dto->setId($entity->getId()); $dto->setFirstName($entity->getFirstName()); $dto->setLastName($entity->getLastName()); } else { $dto->setId(""); $dto->setFirstName(""); $dto->setLastName(""); } } } ?>
service diconは、現時点では自動生成のままで問題ありません。
- ViewCartService.dicon
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components namespace="viewCartService"> <include path="%S2BASE_PHP5_ROOT%/app/commons/dicon/dao.dicon"/> <component name="service" class="ViewCartServiceImpl"> <property name="dxo">dxo</property> <property name="memberDao">memberDao</property> </component> <component name="dxo" class="ViewCartDxoImpl"> </component> <component name="memberDao" class="MemberDao"> <aspect>dao.interceptor</aspect> </component> </components>
以上で、カート画面を表示すると、セッションIDから会員を引き当てて会員の名前を表示する、というところまで出来ました。
続く...