前回のエントリーの続きです。前回はbake.phpのはき出すコードにいちゃもんをつけ,ビューを表示するメソッドとその結果を受け取るメソッドを分離した方がよいのではないか。そして追加でも編集でも,dbをアップデートするメソッドを作るのがよいのではないかという論旨でした。
実際にupdateメソッドを書いてみると,データの保存に成功したときには,indexへredirectするのですが,エラーがあったときには元のビューを再表示させます。ところが元のビューが何なのかがわからないという問題に直面しました。
viewから戻ったときのparamsを見る
前回のエントリーを書いた時点では,「きっとビューからコントローラに渡されるデータの中にそんなものがあるだろう」と軽く考えていました。
そこで,updateメソッドの中で,$this->paramsを見てみました。
2007-11-17 22:06:00 Debug: Array ( [pass] => Array ( [0] => 9 ) [controller] => bookmarks [action] => update [form] => Array ( [data] => Array ( [Bookmark] => Array ( [name] => cakephp [url] => http://php.sunvisor.net [id] => 9 ) ) ) [data] => Array ( [Bookmark] => Array ( [name] => cakephp [url] => http://php.sunvisor.net [id] => 9 ) ) [url] => Array ( [url] => bookmarks/update/9 ) [bare] => 0 [webservices] => [plugin] => )
これはedit.thtmlからSubmitした時のparamsの内容なのですが,ビューの名前を知る部分はないのです。
ビューからコントローラに値を渡すには,formにhiddenフィールドを作ってそこにビューの名前をセットするというのも考えましたが・・・・。
Sessionを使う
セッションを利用する方法を思いつきました。というかこれが普通の解決方法なのかもしれません。
function add() { $this->Session->write('view','add'); } function edit($id = null) { if (!$id) { $this->Session->setFlash('Invalid id for Bookmark'); $this->redirect('/bookmarks/index'); } $this->data = $this->Bookmark->read(null, $id); $this->Session->write('view','edit'); }
addとeditメソッドではセッション変数viewにそれぞれのメソッド名をセットしています。
function update($id = null) { $page_name ='/bookmarks/index'; if(!empty($this->data)){ $this->cleanUpFields(); if ($this->Bookmark->save($this->data)) { $this->Session->setFlash('The Bookmark has been saved'); } else { $this->Session->setFlash('Please correct errors below.'); $page_name = '/bookmarks/'.$this->Session->read('view'); } $this->Session->del('view'); }else{ $this->Session->setFlash('No Data'); } $this->redirect($page_name); }updateメソッドではその値を見て,エラーの時にリダイレクトするビューを決めています。念のためupdateメソッドではセッション変数のviewを削除しています。また,フォームを介さずにアクセスされた場合の処理も入れてあります。こんな感じでいけるのじゃないかと思うのですがいかがでしょうか。
コメントする