• 締切済み

MVCの処理について

PHP Version 5.1.6を使っています。 CodeIgniterのバリデーション処理で分からないところがあります。 http://userguide.cilab.info/libraries/validation.html この例の中のindexメソッドです。 if ($this->validation->run() == FALSE) { $this->load->view('myform'); } else { $this->load->view('formsuccess'); } これはエラーがあったらmyformにエラーを付加したのを表示させ、 エラーがなかったらformsuccessページを表示させます。 入力ページ(myform)とその結果ページ(formsuccess)の2つで構成されています。 もし入力ページが2つ以上続いた場合にどのようなプログラムになるのかが分かりません・・・ 例えば、myform1には'ユーザ名'と'パスワード'を入力するフォームがあり myform2は'メールアドレス'を入力するフォームがあって、その次に 結果ページ(formsuccess)という3段階のステップあったとします。 (myform1→myform2→formsuccess) この場合に上の制御プログラムは同じURIで作業するとして $rules['username'] = "required"; $rules['password'] = "required"; $this->validation->set_rules($rules); $fields['username'] = 'ユーザ名'; $fields['password'] = 'パスワード'; $this->validation->set_fields($fields); if ($this->validation->run() == FALSE) { $this->load->view('myform1'); } else { $rules['email'] = "required"; $this->validation->set_rules($rules); $fields['email'] = 'メールアドレス'; $this->validation->set_fields($fields); if ($this->validation->run() == FALSE) { $this->load->view('myform2'); } else { $this->load->view('formsuccess'); } } このようなさらに奥に掘り下げていくようなプログラムになるのでしょうか? これだとなんか変な感じがします・・・

みんなの回答

回答No.2

よく使われているのは、何らかの方法でactionが何かを示すフラグを用意しているんじゃないかなと思います。 URIは同じと言うことで、以下のような状態になるんじゃないでしょうか? <form action="http://一定のURI/"> <input type="hidden" name="ACTOIN_FLAG" value="ACTION_MODE"> //その他の入力フォームなど </form> このようにしておくと、以下のような処理を行うこと出来ます。 <?php class a { function __construct() { //クラス名は適当です $this->validation = new varidation(); $this->load = new load(); } //Controll function main() { $mode = $_REQUEST['ACTION_FLAG']; $this->setString(); switch ($mode) { case 'myform1': case 'myform2': case 'myform3': $this->$mode(); break; } $template_mode = ($this->validation->run()) ? 'error' : 'success'; $this->load->view($this->template[$template_mode]); } //Model function myform1() { $rules['username'] = "required"; $rules['password'] = "required"; $this->validation->set_rules($rules); $this->template = array('error'=>'myform1','success'=>'myform2'); } //Model function myform2() { $rules['username'] = "required"; $rules['password'] = "required"; $rules['email'] = "required"; $this->validation->set_rules($rules); $this->template = array('error'=>'myform1','success'=>'myform2'); } //Model function myform3() { $rules['username'] = "required"; $rules['password'] = "required"; $rules['email'] = "required"; $this->validation->set_rules($rules); $this->template = array('error'=>'myform2','success'=>'formsuccess'); } function setString() { $_tmp = array(); foreach (array($_POST, $_SESSION) as $_array) { foreach ($_array as $_k => $_v) { $_tmp[$_k] = $_v; } } $this->validation->set_fields($_tmp); } 私だとこんな感じに書くかも知れません。 結構省略してしまっている部分があるので実用的ではないですが。

takagoo100
質問者

お礼

ご返答ありがとうございます。 なるほど、フラグで分けて処理するということですね。参考になります。 ただ気になるところがあるのですが、 Modelのmyform1の 'success'=>'myform2' は必要なのでしょうか?template配列に空きがないようにする為のものでしょうか?

  • uki629
  • ベストアンサー率23% (40/172)
回答No.1

いったんデータをクッキーもしくはセッションに保存しておく。

takagoo100
質問者

お礼

ご返答ありがとうございます。 セッションに入れてからの制御処理がどうなるのかが分からないのですが、 具体的にこの場合はどのような書き方になるのでしょうか? if ($this->validation->run() == FALSE) { $this->load->view('myform1');//この2つのフォームをどこに入れて書けば良いのかが分かりません・・・ $this->load->view('myform2');// } else { $this->load->view('formsuccess'); }

関連するQ&A