SOY CMS / SOY Shop

ブログトップ

SOY App開発の説明 詳細ページでデータを更新する

2014年02月07日

今回は前回作成したページから詳細ページへ遷移して、

詳細ページでデータの変更を行うところを見ていきたいと思います。

SOY App開発の説明 管理画面側に一覧ページを作成する。




データベースを利用するために下記をダウンロードしてください。

soymock_0.0.4.zip



前回の/pages/Page/IndexPage.class.phpで繰り返し箇所を作成した際に、

詳細ページへのリンクを

http://ドメイン/CMSインストールディレクトリ/app/index.php/Page/Detail/{ID}

とデータに振られたIDを末尾に付ける形で生成しました。


/pages/Page/DetailPage.class.phpでこのIDを受け取るために

DetailPage関数の引数として取得します。


IDの取得方法は


function DetailPage($args){

	$id = (isset($args[0])) ? $args[0] : null;

}

上記のように引数の最初の値に、

URLの末尾に付けた値(今回はID)を取得することができます。


$args[0]には数字だけでなく、トークンのような値も格納可能です。


IDを習得した後は、


function DetailPage($args){
		
	$id = (isset($args[0])) ? (int)$args[0] : null;
	$dao = SOY2DAOFactory::create("Sample.SOYMock_SampleDAO");
		
	WebPage::WebPage();
		
	try{
		$obj = $dao->getById($id);
	}catch(Exception $e){
		//取得できなかった時の念のため
		$obj = new SOYMock_Sample();
	}

	$this->createAdd("form", "HTMLForm");
		
	$this->createAdd("name", "HTMLInput", array(
		"name" => "Sample[name]",
		"value" => $obj->getName()
	));
		
	$this->createAdd("description", "HTMLTextArea", array(
		"name" => "Sample[description]",
		"value" => $obj->getDescription()
	));
}

今回はRegisterの時と異なり、すでに値が存在しているので、各createAddのvalueにはその値を入れます。

SOY App開発の説明 SOY2DAOでデータベースを利用する3


これで詳細ページの完成です。




次はdoPost関数内の処理ですが、


function doPost(){
	
	if(soy2_check_token() && isset($_POST["Sample"])){
		
		$id = (isset($args[0])) ? (int)$args[0] : null;
		$dao = SOY2DAOFactory::create("Sample.SOYMock_SampleDAO");

		try{
			$oldObj = $dao->getById($id);
		}catch(Exception $e){
			$oldObj = new SOYMock_Sample();
		}
			
		$newObj = SOY2::cast($oldObj, (object)$_POST["Sample"]);
			
		try{
			$dao->update($newObj);
		}catch(Exception $e){
			//
		}
			
		CMSApplication::jump("Page.Detail." . $id . "?updated");
	}
}

RegisterPageの時と大体同じですが、

$newObj = SOY2::cast($oldObj, (object)$_POST["Sample"]);

と前回は第一引数に文字列でオブジェクト名を指定していましたが、

SOY App開発の説明 SOY2DAOでデータベースを利用する3


更新の場合は、更新前のオブジェクトを第一引数に入れて、

第二引数にフォームから送信した配列を入れます。


更新前のオブジェクトを入れることによって、

フォームで入力欄を用意しなかった値のnullでの上書きを防止します。


例を挙げると、

記事の新規作成の時刻をフォームでは用意していません。


この場合、

配列からオブジェクト型にキャストする際、

createDateプロパティの値はnullになり、

SQLのUPDATE実行の際に作成時刻のデータが消えてしまいます。


古いデータを第一引数に入れることで

データ削除を防止しています。


あとは、

$dao->update($newObj);

でデータの更新をして終了です。