• 締切済み

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'); } } このようなさらに奥に掘り下げていくようなプログラムになるのでしょうか? これだとなんか変な感じがします・・・

  • PHP
  • 回答数2
  • ありがとう数2

みんなの回答

回答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

  • Codelgniterのコンストラクタ記述方法

    PHP5 で Codelgniter (Ver2.0.3-1) を使用してコンストラクタを書く方法につきお尋ねします。 ある参考書で Codelgniter の使用法を学習していますが、その本のフォーム処理のためのコントローラーの例文として下記の記述があります(一部要約)。 Class Form extends Controller { function Form(){ parent:: Controller(); $this->load->helper('url'); $this->load->library('form_validation'); $this->form_validation->set_rules('name', '名前', required); } } ところがこのコンストラクタは PHP4 形式で記述しているとの注記が付いています。 このコンストラクタを PHP5 形式で Codelgniter (Ver2.0.3-1) を使用して書くにはどのようにすれば良いでしょうか? ネスト形式で次のようにすれば良いですか? Class Form extends CI_Controller { function Form(){ public function __construct(){ parent:: construct(); } $this->load->helper('url');   中略 } }

    • ベストアンサー
    • PHP
  • CodeIgniterで入力エラー検証

    お世話になります。 codeigniterでのエラーチェックで困っています。 たとえばDBに登録されているニックネームと入力されたニックネームを突合せて合致しているレコードがあれば「すでに登録されています」とエラー表示したいです。 この場合、どのようにしたらよいでしょうか? ユーザーガイドを見てもわかりません。 コールバック関数を使ってするのでしょうか? そのとき、POSTデータはどのように渡せばいいのでしょうか? よろしくお願いします。 はじめたばかりでわかりません。 下記は作成したコードです。 function index(){ --略-- コントローラ側 $this->form_validation->set_rules('email', 'メールアドレス', 'check_duplicate_address'); } function check_duplicate_address(){ //メールの重複確認 if(!$this->member->check_duplicate_address($this->input->post('email'))){ $this->form_validation->set_message('duplicate_address', 'この%s は、"すでに利用されています。'); return FALSE; } } //member のモデルの中の関数 //メールアドレスの重複確認 function check_duplicate_address($email){ $sql = 'select count(id) as cnt '; $sql .= 'from member_info '; $sql .= 'where email = ? '; $sql .= 'and comp_flg = "1"'; $query = $this->db->query($sql, array($email)); foreach ($query->result() as $row){ if($row->cnt > 0){ return FALSE; }else{ return TRUE; } } }

    • ベストアンサー
    • PHP
  • codeigniterのsessionについて

    codeigniterで、管理画面を作っていて、今認証画面に取り掛かってますが、sessionが引き継がれません。 ※以下のコードは、session以外は省いてます。 controller側のtop.phpで、 class Top extends MY_Controller { public function __construct() { parent::__construct(); $this->load->library('session'); } public function index() { $superuser = array( 'superuser' => 'yes' ); $this->session->set_userdata($superuser); redirect('show'); } $this->load->view('admin/top', $page); } とし、controller側のshow.phpで、 class Show extends MY_Controller { public function __construct() { parent::__construct(); $this->load->library('session'); } public function index() { var_dump($this->session->userdata('superuser')); $this->load->view('admin/show'); } } としてますが、show.phpで、var_dumpがfalseを返してしまい、sessionが引き継がれません。 ご教授下さい。

    • 締切済み
    • PHP
  • チェックボックスのチェックについて

    チェックボックスが2つあります。 一つが選択されたらテキストボックスが入力可能にしてあります。 Aを選択すると、Bのチェックが外れる、反対の場合も同じようにしたいのですが、下記のように書きましたがうまくいきません。 解決方法が分かられる方、教えて下さい。 *********************************************** function Change(){ if(document.myForm.chkB.checked ==true{ document.myForm.TxtA.disabled = true; document.myForm.chkA.checked = false; } else { document.myForm.TxtA.disabled = false; document.myForm.chkA.checked = true; } } ***********************************************

  • メールが送信されません。<phpを閉じて開いても

    メールが送信されません。<phpを閉じて開いても送信ボタンを押してメールが送信されません。 <?php namespace Application\Block\ExternalForm\Form\Controller; use Concrete\Core\Controller\AbstractController; use Core; use Page; class TForm2 extends AbstractController { // action を指定しなかった場合、view が実行されると思われる。初期表示。 public function view() { // 最初にフォームを開いた時の処理です。初期値を view に渡して、編集画面の表示を指定します。 $input['p_name'] = ''; $input['p_email'] = ''; $input['p_message'] = ''; $this->set('isvalid', true); $this->set('input', array()); $this->set('error', array()); $this->set('section', 'edit'); } // 入力値の検証処理 private function validate() { // バリデーション結果を成功に設定 $isvalid = true; // 入力値を取得 $input['p_name'] = trim($this->post('p_name')); $input['p_email'] = trim($this->post('p_email')); $input['p_message'] = trim($this->post('p_message')); // 検証実行 if ($input['p_name'] == '') { $isvalid = false; $error['p_name'] = 'お名前は、必ず入力してください。'; } if ($input['p_email'] == '') { $isvalid = false; $error['p_email'] = 'メールアドレスは、必ず入力してください。'; } if ($input['p_message'] == '') { $isvalid = false; $error['p_message'] = 'メッセージは、必ず入力してください。'; } // View に値を渡す $this->set('isvalid', $isvald); $this->set('input', $input); $this->set('error', $error); return $isvalid; } public function action_confirm() { // 検証結果によって、確認(confirm) を、編集(edit) セクションを出し分け。 if ($this->validate()) { $section = 'confirm'; } else { $section = 'edit'; } $this->set('section', $section); } public function action_update() { // 検証結果によって、完了(complete) を、編集(edit) セクションを出し分け。 if ($this->validate()) { //ここの部分でエラーが発生します。 ?>//一回閉じる。 //ここから追加しました。 <?php if ($_POST) { ?> <!-- 確認画面 --> <form action="./tform2.php" method="post"> 名前 <?php echo $_POST["fullname"] ?> Eメール <?php echo $_POST["email"] ?> 本文 <?php echo nl2br($_POST["message"]) ?> <input type="submit" name="back" value="戻る" /> <input type="submit" name="send" value="送信" /> </form> <?php } else { ?> <!-- 入力画面 --> <form action="./tform2.php" method="post"> 名前 <input type="text" name="fullname" value=""> Eメール <input type="email" name="email" value=""> 本文 <textarea name="message" id="" cols="" rows=""></textarea> <input type="submit" name="confirm" value="確認" class="button"> </form> <?php } ?> //ここまで <?php //もう一回開ける $c = Page::getCurrentPage(); header('location: ' . Core::make('helper/navigation')->getLinkToCollection($c, true) . '/complete'); exit; } else { $this->set('section', 'edit'); } } public function action_complete() { $this->set('section', 'complete'); } public function action_back() { // 戻るボタンで、編集(edit)セクションを表示します。 $section = 'edit'; $this->set('section', $section); } }

    • 締切済み
    • PHP
  • JavaScript初心者です。質問が

    あります。 誕生日勘定関数birth()、 うるう年対応関数uruu() はそれぞれ単独で作動することを確認しています。 がbirth()にuruu()を組み込むと作動しなくなります。 どうしたら解決するのでしょうか? <script language="JavaScript"> <!-- function birth(){ set_m = eval(document.myForm.formm.value); set_d = eval(document.myForm.formd.value); if(set_m<1 || set_m>12){ alert("正しい月日を入力してください!"); return false; } if(set_m ==2 && set_d>29){ alert("正しい月日を入力してください!"); return false; } if(set_m ==1 | set_m ==3 | set_m ==5 | set_m ==7 | set_m ==8 | set_m ==10 |set_m ==12){ if(set_d<1 || set_d>31){ alert("正しい月日を入力してください!"); return false; } }else if(set_d <1 | set_d>30){ alert("正しい月日を入力してください!"); return false; } if(set_m ==2 && set_d ==29) uruu(); else if{ now = new Date(); b = now.getYear(); spday= new Date (b,set_m-1,set_d); spday2 = new Date(b-1,set_m-1,set_d); spday3 = new Date(b+1,set_m-1,set_d); a = (spday.getTime() - now.getTime())/(24*60*60*1000); a = Math.ceil(a); c = (spday2.getTime() - now.getTime())/(24*60*60*1000); c = Math.ceil(c); d = (spday3.getTime() - now.getTime())/(24*60*60*1000); d = Math.ceil(d) aa = Math.abs(a); cc = Math.abs(c); dd = Math.abs(d); if(aa==0) document.write("誕生日おめでとう!!"); else if( a<0 && dd>aa && aa<cc) document.write("誕生日から",aa,"日過ぎました・・・"); else if(a<0 && aa>=dd && dd<cc) document.write("あと",dd,"日で誕生日です。"); else if(aa<=cc && aa<dd) document.write("あと",aa,"日で誕生日です。");else if(aa>cc && cc<dd ) document.write("誕生日から",cc,"日過ぎました・・・"); } } function uruu(){ now = new Date(); b = now.getYear(); spday = new Date(b,2-1,29); a = (spday.getTime()- now.getTime())/(24*60*60*1000); a = Math.ceil(a); aa = Math.abs(a); if(a<0){ if(b%4==0) document.write("誕生日から",aa,"日経過しました。"); else if(b%4==1) document.write("誕生日から",365+aa,"日経過しました。"); else if(b%4==2) document.write("あと",365+365-aa,"日で誕生日です。"); else if(b%4==3) document.write("あと",365-aa,"日で誕生日です。"); }else if(a>0){ if(b%4==0) document.write("あと",aa,"日で誕生日です。"); else if(b%4==1) document.write("誕生日から",365-aa,"日経過しました。"); else if(b%4==2) document.write("誕生日から",365+365-aa,"日経過しました。"); else if(b%4==3) document.write("あと",365+aa,"日で誕生日です。"); }else if(a==0) document.write("誕生日おめでとう!!"); } --> </script> <form name="myForm"> <input type="text" name="formm" size=2>月 <input type="text" name="formd" size=2>日 <input type="button" value="誕生日勘定する" onClick="birth()"> </form>

  • codeigniterのページネーションについて

    <?php class Test extends CI_Controller { public function __construct(){ parent::__construct(); // これ以降にコードを書いていく $this->load->model('rmodel'); $this->load->helper(array('form', 'url')); } public function index(){ $data["mlist"] = $this->my_list($this->uri->segment(2)); $data["page_link"] = $this->set_page_link(); //View $this->load->view('mypage',$data); } //ページめくり function set_page_link(){ $this->load->library('pagination'); $config['base_url'] = base_url().'mypage/'; $config['total_rows'] = $this->rmodel->Get_Count(); $config['per_page'] = 10; $config['cur_tag_open'] = '<strong>'; $config['cur_tag_close'] = '</strong>'; $this->pagination->initialize($config); return $this->pagination->create_links(); } function my_list($prm){ if($prm==""){ $prm=0; } $conv = $this->rmodel->Get_list(); $list = ""; for($i=$prm;$i<=$prm+9;$i++){ $list .= '<div class="nr">'."\n"; $list .= $conv[$i]["hoge"];              ・              ・              ・      $list .= '</div>'; } return $list; } } ?> として10件づつの一覧をページめくりする形で表示しようとしています。 ところが、11件目から20件目を表示するときに2ページ目のページめくりの数字が黒のリンクなしに切り替わらず、「1」がリンクなしになっています。 同様に21件目から30件目を表示するときに3ページ目のページめくりの数字が黒のリンクなしに切り替わらず、「1」がリンクなしのままです。 上記のソースでどこが悪いんでしょうか? URLはhttp://hogehoge.com/mypage/(offセット値) よろしくお願いします。

    • ベストアンサー
    • PHP
  • concrete5の外部フォームの埋め込みについて

    前提 phpでお問い合わせフォームをpostするときにエラーになります。 実現したいこと メール送信 concrete5の外部フォームの埋め込みについてエラーが発生します。 参考にしたサイトです。 https://qiita.com/s79ns/items/62ce69fef20258f35534 https://ginneko-atelier.com/blogs/entry236/ よろしくお願いします。 発生している問題・エラーメッセージ "syntax error, unexpected '<'" 該当のソースコード <?php namespace Application\Block\ExternalForm\Form\Controller; use Concrete\Core\Controller\AbstractController; use Core; use Page; class TForm1 extends AbstractController { // action を指定しなかった場合、view が実行されると思われる。初期表示。 public function view() { // 最初にフォームを開いた時の処理です。初期値を view に渡して、編集画面の表示を指定します。 $input['p_name'] = ''; $input['p_email'] = ''; $input['p_message'] = ''; $this->set('isvalid', true); $this->set('input', array()); $this->set('error', array()); $this->set('section', 'edit'); } // 入力値の検証処理 private function validate() { // バリデーション結果を成功に設定 $isvalid = true; // 入力値を取得 $input['p_name'] = trim($this->post('p_name')); $input['p_email'] = trim($this->post('p_email')); $input['p_message'] = trim($this->post('p_message')); // 検証実行 if ($input['p_name'] == '') { $isvalid = false; $error['p_name'] = 'お名前は、必ず入力してください。'; } if ($input['p_email'] == '') { $isvalid = false; $error['p_email'] = 'メールアドレスは、必ず入力してください。'; } if ($input['p_message'] == '') { $isvalid = false; $error['p_message'] = 'メッセージは、必ず入力してください。'; } // View に値を渡す $this->set('isvalid', $isvald); $this->set('input', $input); $this->set('error', $error); return $isvalid; } public function action_confirm() { // 検証結果によって、確認(confirm) を、編集(edit) セクションを出し分け。 if ($this->validate()) { $section = 'confirm'; } else { $section = 'edit'; } $this->set('section', $section); } public function action_update() { // 検証結果によって、完了(complete) を、編集(edit) セクションを出し分け。 if ($this->validate()) { //ここの部分でエラーが発生します。 //ここから追加しました。 <?php if($_POST ){ ?> <!-- 確認画面 --> <form action="./cotactform.php" method="post"> 名前 <?php echo $_POST["fullname"] ?> Eメール <?php echo $_POST["email"] ?> 本文 <?php echo nl2br($_POST["message"]) ?> <input type="submit" name="back" value="戻る" /> <input type="submit" name="send" value="送信" /> </form> <?php } else { ?> <!-- 入力画面 --> <form action="./contactform.php" method="post"> 名前 <input type="text" name="fullname" value=""> Eメール <input type="email" name="email" value=""> 本文 <textarea name="message" id="" cols="" rows=""></textarea> <input type="submit" name="confirm" value="確認" class="button"> </form> <?php } ?> //ここまで $c = Page::getCurrentPage(); header('location: '.Core::make('helper/navigation')->getLinkToCollection($c, true).'/complete'); exit; } else { $this->set('section', 'edit'); } } public function action_complete() { $this->set('section','complete'); } public function action_back() { // 戻るボタンで、編集(edit)セクションを表示します。 $section = 'edit'; $this->set('section', $section); } }

  • 【ASP.NET MVC】更新アクション

    いつもお世話になっております。 ASP.NET MVCのコントローラで、フォーム送信を受けて動作する更新アクションの作り方について質問させてください。 いろいろな記事やチュートリアルを読んで、なんとか次のような基本計については理解できました。 public class HomeController { [HttpPost] public ActionResult UpdateItem(Item item){  if (! ModelState.IsValid){   TempData["error"] = "入力内容にエラーがあります";   return View("ItemEdit", item);  } else {   var result = false;   //   // 延々と更新メソッドが続く   //   if (result) {     TempData["message"] = "正しく更新できました"     ModelState.Clear();     return Redirect("ItemList");   } else {     TempData["error"] = "更新でエラーが起きました";     return View("ItemEdit", item);   }  } } } TempData["xxx"]の処理は、ビュー側で、値に応じてjQueryUIによりダイアログを表示します。 質問したい箇所は以下の3つです。 ■一体、全体の流れはこれでいいのでしょうか? if文とTempDataばっかりで。。何かスッキリしません。 ■フォーム値の検証はアクション呼び出しの時点で終わっていますが、ここに任意の検証を入れたい場合はどうしたらいいのでしょう? (必須や文字種チェックはモデルで属性設定を行っていますが、それ以外の例えば2項目が連動するような検証) ■サンプルの例文は簡単ですが、DB更新などが伴うと数百行になるため、すごく見通しが悪いです。全部別メソッドにするのも。。いい方法はないでしょうか 不明点だらけですんません(笑 どなたか愛の手を

  • イベントリスナーの部分を関数にしたい

    イベントリスナーの部分で、「load」以外に「change」も必要になったので関数にしたいのですが、 引数の関数の指定方法がわかりません。 どうすればいいのでしょうか。よろしくお願いします。 【イベントリスナーを関数にする前】 function hoge(){ this.view = function(){ var _this = this; window.addEventListener( 'load',function(){ _this.foo()}, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view(); 【やってみたこと】 function hoge(){ this.view = function(){ var _this = this; var func = function(){ _this.foo()}; this.addListener( 'window', 'load', func ); } this.addListener = function(elem,type,func){ elem.addEventListener( type,func, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view();