送信元のviewを特定する方法

user-pic
0

前回のエントリーの続きです。前回は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を削除しています。また,フォームを介さずにアクセスされた場合の処理も入れてあります。こんな感じでいけるのじゃないかと思うのですがいかがでしょうか。

トラックバック(0)

トラックバックURL: http://php.sunvisor.net/mt/mt-tb.cgi/56

コメントする

このブログで公開した情報は,のちほど Sunvisor Lab. CakePHP のコンテンツにまとめていますので,そちらも参照してみてください。

オススメの本

CakePHP初の公認ガイドブック。まずこれを読む。

CakePHPでの開発の際には常に机上に準備するべし。

CakePHP 1.2を使い始めるならこの本が必携。

CakePHP 1.2での実践が理解できる。

このブログ記事について

このページは、Sunvisorが2007年11月17日 22:43に書いたブログ記事です。

ひとつ前のブログ記事は「BAKE.PHPがはき出したコード」です。

次のブログ記事は「MS-SQLへの接続」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。