S2Container+S2Dao.PHP5を使ってみる(その7)

セッション回りが出来たので、ログイン後に遷移するカート画面を作っていきます。まずはtemplateから。カートでは、"ログインした人の名前さんのカート"とか表示したいので下記の様にしてみました。フォームの遷移先actionはやはり自分自身なのでviewCart、そしてactionでの遷移先決定用にsubmitボタンの名前は"viewCart:selectPaymentMethod"にしています。カートに入れる商品は、テーブルすら存在していないので今後実装するとして、今は"カートの内容"とだけ書いておきます。

<!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から会員を引き当てて会員の名前を表示する、というところまで出来ました。

続く...