SOY App開発の説明 詳細ページでデータを更新する
2014.02.07
データベースを利用するために下記をダウンロードしてください。
前回の/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);
でデータの更新をして終了です。