2017-02-01 6 views
0

ユーザーがフォームを送信した後に複数のテーブルにデータを入力する必要があります。私はこれのためのフォームとコントローラを既に作成しました。私の質問は、どうすればエラーを処理できるかです。何らかの理由で1つのテーブルデータが挿入されていないなどのエラーがあるとします。だから、私は、( "何かが間違っています。もう一度"などの)特定のエラーメッセージをユーザーに警告したいと思います。また、エラーが発生した場合はフォームの値を保持する必要があります。私は次のことを試してみるCodeigniter実際の検証エラーではないエラーを処理する最良の方法

1)フォームの値に

2を保持するために、フォームフィールドでSET_VALUEを追加)セッションフラッシュメッセージを追加します(しかし、それを表示するために私がセッションを保持していないページを更新する必要があります。値)

ここでは私のコードです:

コントローラファイル:

public function add_new() 
{ 


    $this->load->helper('form'); 
    $this->load->library('form_validation');  

    if($this->input->post()) 
    { 
     if($this->input->post('add') !== false) 
     { 
      $post_val = $this->input->post(); 

      //Set validation rules 
      $this->form_validation->set_rules('field1', 'field1 name', 'required'); 
      . 
      . 
      . 


      if($this->form_validation->run() == TRUE) 
      { 
       //Add Data into first table 
       $this->load->model("my_model"); 
       $input_data['f1']=$post_val['filed1']; 
       $input_data['f2']=$post_val['filed2']; 
       $insert_fid =$this->my_model->insert($input_data); 

       //check whether data inserted into 1st table or not. 
       if($insert_fid) 
       { 
        //successfully inserted 

        //write into file(I have to write into file(for some requirement)) 
        $this->load->helper('file'); 

        $data = "\r\n".$input_data['f1']."."; 
        if (! write_file(WRITE_FILE, $data,'a+')) //WRITE_FILE is constant 
        {      
         //suppose file not writen then I have to alert user(Only to inform) 
         $this->session->set_flashdata('error',"Data no written.");      

        } 

        //Insert Into second table 
        $input_data=array(); 

        $input_data['f1']=$post_val['field3']; 
        $input_data['f2']=$post_val['field4']; 
        $input_data['f3']=insert_fid; 

        $this->load->model("my_model_two"); 

        $insert_sid =$this->my_model_two->insert($input_data); 

        //same procedure for checking 
        if($insert_sid) 
        { 

         //Insert Into Third table 

         $input_data=array(); 

         $input_data['f1']=$post_val['field5']; 
         $input_data['f2']=$post_val['field6']; 
         $input_data['f3']=insert_sid;     


         $this->load->model("my_model_three"); 

         $insert_tid =$this->my_model_three->insert($input_data); 

         //Insert Into Fourth table 

         $input_data=array(); 

         $input_data['f1']=$post_val['field7'];      
         $input_data['f2']=insert_sid;     


         $this->load->model("my_model_four"); 

         $insert_aid =$this->my_model_four->insert($input_data); 



         if(!$insert_tid) 
         { 
          $this->session->set_flashdata('error',"Error mesage 1"); 

          //redirect(base_url(uri_string())); 
         } 
         elseif(!$insert_aid) 
         { 
          $this->session->set_flashdata('error',"Error mesage 2"); 

          //redirect(base_url(uri_string())); 
         } 
         else 
         { 
          //ok all done successfully now I can redirect user to list page 
          $this->session->set_flashdata('message',"success message"); 
          redirect(base_url().'list/'); 
         } 


        } 

        else 
        { 
         $this->session->set_flashdata('error',"Error Message"); 

         //redirect(base_url(uri_string())); 
        }     

       } 
       else 
       { 
        $this->session->set_flashdata('error',"Error Message"); 

        //redirect(base_url(uri_string())); 
       } 

       //redirect(base_url(uri_string())); 
      } 
     } 

    } 
    $page_data["title"]="Add Data";  
    $this->load->view("myview",$page_data); 
} 

マイビューファイル

<div class="page-content">   

      <?php   
      $success = $this->session->flashdata('message'); 
      if(isset($success) && trim($success) != "") 
      { 

       ?> 
       <div class="alert alert-block alert-success" id="success-alert"> 
       <button type="button" class="close" data-dismiss="alert"> 
        <i class="ace-icon fa fa-times"></i> 
       </button> 
       <p> 
        <?= $success ?> 
       </p> 
       </div> 
       <?php 

      } 
      $error = $this->session->flashdata('error'); 
      $validate_error = validation_errors(); 
      if((isset($error) && trim($error) != "") || trim($validate_error) != "") 
      { 

       ?> 
       <div class="alert alert-block alert-danger"> 
       <button type="button" class="close" data-dismiss="alert"> 
        <i class="ace-icon fa fa-times"></i> 
       </button> 
       <p> 
        <?= $error ?> 
        <?= $validate_error ?> 
       </p> 
       </div> 
       <?php 

      } 

      ?> 

      <div class="page-header">    
       <h1 class=""><?=$title?>       
       </h1> 
      </div>  

      <form> 
      //My form Which sucessfully created 
      </form> 


     </div> <!-- page-contnet --> 

私も(検証エラーを期待して)エラーを表示すると、値から保持したいです。

答えて

1

set_value()は、フォーム検証ライブラリによって検証された値を使用するため、可能な限りルールを使用してください。また、検証ルールがない場合は$ _POSTも検索します。とにかく、それはそのままで動作します。最初のオプションは、自分で値を設定することですset_value('my_field', $this->input->post('my_field'), true); 3番目のパラメータはhtmlエスケープ用です(デフォルトではtrue)。これをfalseに設定すると、wyswig textareaの豊富なhtmlがある場合に便利です。

エラーについて言えば、フラッシュデータを使用してリダイレクトする必要はありません。配列を$ page_data配列に配置すると、ビューの内側に表示されます。 $page_data['errors'] = []; $page_data['errors']['first_field'] = 'We have a bad situation here';のようなものは、このトリックを行う必要があります

+0

はい@ cssBlaster21895。私は同じ解決策を$ page_data ['errors']に追加することも考えています。しかし、私は再びエラーを表示するために条件を入れなければなりません。だからもっと良い解決策があると思った。ご回答いただきありがとうございます。 –

+0

ようこそ。 – cssBlaster21895

関連する問題