アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHP Version 5.1.6を使っています。
CodeIgniterのバリデーション処理で分からないところがあります。
http://userguide.cilab.info/libraries/validation …
この例の中の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');
}
}

このようなさらに奥に掘り下げていくようなプログラムになるのでしょうか?
これだとなんか変な感じがします・・・

A 回答 (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);

}

私だとこんな感じに書くかも知れません。
結構省略してしまっている部分があるので実用的ではないですが。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/04 04:40

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

    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
セッションに入れてからの制御処理がどうなるのかが分からないのですが、
具体的にこの場合はどのような書き方になるのでしょうか?

if ($this->validation->run() == FALSE)
{
$this->load->view('myform1');//この2つのフォームをどこに入れて書けば良いのかが分かりません・・・
$this->load->view('myform2');//
}
else
{
$this->load->view('formsuccess');
}

お礼日時:2007/11/02 17:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!