2017-12-23 8 views
0

codeigniterでajaxを使用してフォームを送信して、データを挿入したいだけで、使用しない入力フィールドのみを入力したいときに検証しようとしました。しかし、attrは私が非表示にしている入力フィールドでこれを解決する方法を実行する必要があります。隠されている場合は、必要な入力フィールドを削除してください。ajaxで送信する前に入力に必要な削除

ビュー

<form id="fr" method="post" class="form-horizontal form-label-left">  
    <div class="form-group">   
     <label for="fullname">Section * :</label> 
     <select name="section" class="form-control" required="required"> 
      <option value="">Select section</option> 
      <option value="manager">Manager</option> 
      <option value="head manager">Head Manager</option> 
     </select> 
     <span class="help-block"></span>  
    </div> 
    <div class="form-group"> 
     <label for="nama">Kitchen * :</label> 
     <input type="text" name="name_kitchen" class="form-control" required="required" /> 
     <span class="help-block"></span> 
    </div> 
    <div class="form-group"> 
     <label for="nama">Resto * :</label> 
     <input type="text" name="name_resto" class="form-control" required="required" /> 
     <span class="help-block"></span> 
    </div> 

    <div class="form-group"> 
     <label for="fullname">&nbsp;</label><br> 
     <button type="button" id="submit" class="btn btn-primary"><i class="fa fa-save"></i> Simpan</button> 
    </div> 
</form> 

<script> 
    $("[name='section']").change(function(){ 
     var value=$(this).val(); 
     if(value == "manager"){ 
      $("[name='name_kitchen']").hide(); 
      $("[name='name_resto']").show(); 
     }else{ 
      $("[name='name_kitchen']").show(); 
      $("[name='name_resto']").hide();   
     } 
    }); 

    $("#submit").click(function() { 
     $.ajax({ 
      type: "POST", 
      url: base_url+"add", 
      dataType: 'json', 
      data: $('#fr').serialize(), 
      success: function(data) { 
       if(data.status) { 
        $(".add-from-staff").toggle("slow");  
        $("#fr").load(location.href + " #fr"); 
        $('form#fr input[type="text"],texatrea, select').val('');     
       }else { 
        for (var i = 0; i < data.inputerror.length; i++) 
        { 
         $('[name="'+data.inputerror[i]+'"]').parent().parent().addClass('has-error'); 
         $('[name="'+data.inputerror[i]+'"]').next().text(data.error_string[i]); 
        } 
       } 
      }, 
      error: function (request, jqXHR, textStatus, errorThrown) { 
       alert('Error'); 
       console.log(request.responseText); 
      }  
     });  
    });  
</script> 

コントローラ

public function add() { 
    $this->_validate(); 
    $insert = $this->My_models->_add(); 
    echo json_encode(array("status" => TRUE));   
} 

function _validate() { 
    $data = array(); 
    $data['error_string'] = array(); 
    $data['inputerror'] = array(); 
    $data['status'] = TRUE; 

    if($this->input->post('name_kitchen') == '') 
    { 
     $data['inputerror'][] = 'name_kitchen'; 
     $data['error_string'][] = 'Kitchen is required'; 
     $data['status'] = FALSE; 
    } 


    if($this->input->post('name_resto') == '') 
    { 
     $data['inputerror'][] = 'name_resto'; 
     $data['error_string'][] = 'Resto is required'; 
     $data['status'] = FALSE; 
    } 

    if($data['status'] === FALSE) 
    { 
     echo json_encode($data); 
     exit(); 
    } 
} 

ので、どのように私は必要な無効を隠し選択のいずれかのオプションを選択すると?

答えて

0

この例では、required属性は使用しません。それは価値があるより多くの頭痛を引き起こしている。代わりに、サーバー側の検証に頼ってください。

どの「セクション」が使用されているかを判断するには、別の情報をコントローラーに渡すことが問題を解決する最も簡単な方法と思われます。これはさまざまな方法で行うことができます。別の隠しフィールドを追加することも可能です。

どこか<form>

<input type="hidden" id="use-section" name="use_section" value=""> 

を追加あなたが最初のページを表示したときに「デフォルト」セクションが示されていることは明らかではありません。存在する場合は、上記のフィールドの「値」に使用します。ハンドラ中に

$("[name='section']").change(function(){ ... 

は "use_section" フィールドの値を設定します。

var value=$(this).val(); 
$("#use-section").val(value); 

あなたは、あなたのコントローラで、またはあなたのケースでは、私はあなたがポストされたデータをキャプチャしていると仮定した場合であるモデルに「use_section」を評価することができます。

if($this->input->post('use_section') === "manager") 
{ 
    //get the fields you want 
} 
else 
{ 
    //get the other fields 
} 

私には_validate()に関する提案があります。 を短絡してadd()を呼び出す代わりに、値がTRUEの場合はTRUE、そうでない場合は$dataを返します。それ短絡フレームワークの設計された実行フローので_validate()の最後の数行が

if($data['status'] === FALSE) 
{ 
    return $data; 
} 

return TRUE; 

なっ次にCodeIgniterの中exitまたはdieこのadd()方法

public function add() 
{ 
    if(TRUE === ($status = $this->_validate())) 
    { 
     $insert = $this->My_models->_add(); 
     $status = array("status" => TRUE);    
    } 
    echo json_encode($status); 
} 

使用することは、IMO、適切ではありません使用します。 uは任意のdiv要素を隠しているとき

0

uが要素を取得し、jqueryの

$("[name='name_kitchen']").removeAttr('required'); 

e.g: 
$("#elementID").removeAttr('required'); 
を使用して必要な属性を削除することができます
関連する問題