2016-08-09 107 views
5

我有一個表格的形式。該表格包含三個用戶輸入。數量,行項目和價格。在用戶提交表單之前,我需要填寫所有三個。該表允許添加行。Codeigniter驗證數組的形式

這是我的桌子。

<form id="add_quote_form" name="add_quote_form" class="form-horizontal"> 
    <table style="width: 90%" id="myTable" class="centered-table table table-bordered"> 
    <thead> 
    <tr> 
     <th>Item</th> 
     <th>Qty</th> 
     <th>Price</th> 
     <th>Action</th> 
    </tr> 
    </thead> 
    <tbody> 
     <tr> 
     <td style="width: 60%"><input type="text" name="detail[]"required></td> 
     <td style="width: 10%"><input type="number" name="qty[]" required></td> 
     <td style="width: 15%"><input type="number" name="price[]" required></td> 
     <td style="width: 12%"><div class="inline"><input type="button" id="addButton" class="btn btn-primary btn-xs" value="Add"/></div><div class="inline"><input type="button" id="deleteButton" class="btn btn-primary btn-xs" value="Delete"/></div> 
     </tr> 
    </tbody> 
    </table> 
    <input type="button" id="saveBtn" name="saveBtn" class="btn btn-primary" value="Create Order" onClick="this.disabled=true; add_quotation();return false;"> 
</form> 

功能添加行表

$(function(){ 
    $("#addButton").click(function(){ 
     $(this).closest("tr").clone(true).appendTo("#myTable"); 
    }); 

    $("#deleteButton").click(function(){ 
//  var x = document.getElementById("myTable").rows.length; 
     var x = $('#myTable tr').length; 
     if(x == 2){ 

     } else { 
      $(this).closest("tr").remove(); 
     } 

    }); 
}); 

功能要求提交按鈕

function add_quotation() { 
document.add_quote_form.saveBtn.value="Saving..."; 
var formArray = $('#add_quote_form').serialize(); 

jQuery.post('<?php echo base_url(); ?>index.php/quotes/add_work_order_validation/' , formArray, function(data) 
{ 
    //alert('here'); 

    if (data.success) 
    { 
     //GetQuotesPage(); 
     //location.reload(base_url+'quotes'); 
     //window.location = base_url+'quotes'; 
     document.add_quote_form.saveBtn.value="Save Order"; 
     document.add_quote_form.saveBtn.disabled=false; 
     swal({ 


    title: "Order Saved!", 
       // text: "You clicked the button!", 
       type: "success" 
      }); 
      //alert("Quote Saved"); 
     } 
     else 
     { 
      document.add_quote_form.saveBtn.value="Save Order"; 
      document.add_quote_form.saveBtn.disabled=false; 
      for (var i in data.errors) 
      { 
       $('#'+i).css('border-color', 'red'); 
       $('#'+i).validationEngine('showPrompt', data.errors[i], '', 'topRight', true); 
      } 
      for (var z in data.hidden) 
      { 
       $('#add_quote_form#' +data.hidden[z]).validationEngine('hide'); 
      } 
    } 
}, 'json'); 

return false; 
} 

這裏是我的控制器

public function add_work_order_validation() 
{ 


    $this->form_validation->set_rules('quoteName', 'Quote Name', 'trim|required'); 
    $this->form_validation->set_rules("dueDate", "Due Date", "trim|required"); 
    $this->form_validation->set_rules('detail[]', 'Line Items','required|trim|callback_matchLineItems'); 


    if ($this->form_validation->run() == FALSE) 
    { 
     $result['errors'] = array(); 
     $result['hidden'] = array(); 
     $result['success'] = false; 
     $fields = array('quoteName', "dueDate", "detail"); 

     foreach ($fields as $field) 
     { 
      if (form_error($field)) 
      { 
       $result['errors'][$field] = strip_tags(form_error($field)); 
      } 
      else 
      { 
       $result['hidden'][] = $field; 
      } 
     } 
    } 
    else 
    { //Post Form 
} 

而最後一部分我的回調函數

function matchLineItems() { 

    $detailArray = $this->input->post("detail"); 
    $qtyArrayPost = $this->input->post("qty"); 
    $priceArray = $this->input->post("price"); 
    $qtyNumberCount = count($qtyArrayPost); 
    $priceNumberCount = count($priceArray); 
    $detailNumberCount = count($detailArray); 

    if($qtyNumberCount != $priceNumberCount || $qtyNumberCount != $detailNumberCount || $detailNumberCount != $priceNumberCount) { 
     $this->form_validation->set_message('matchLineItems', 'No Fields Can Be Left Blank'); 
     return FALSE; 
    } else { 
     return TRUE; 
    } 

} 

我遇到的問題是當我將行項目字段留空時,表單未提交但未顯示錯誤。如果我將數據輸入到訂單項字段中,但將數量和價格字段留空,表單會提交。我需要爲表格中的每個字段創建驗證?我如何得到錯誤?

版本3.0.6

+0

沒有'

'標籤。你能否將問題簡化爲一個小問題?沒有上下文,很難知道什麼地方 –

+0

什麼是你的codeigniter版本? – motto

+0

@motto該版本是3.0.6 – bobthegoalie

回答

2

對於像場

<input type="text" class="form-control" id="firstname" name="firstname" placeholder="Guest's First Name"> 

添加一個簡單的標籤,如下面的一個

<p class="firstname_error error"></p> 

然後用jquery查詢

var firstname = $('#firstname').val(); 
if(firstname == '' || firstname == null) 
      { 
       valid = false; 
       $(".firstname_error").html("* Firstname is required"); 
      } 
      else 
      { 
       $(".firstname_error").html(""); 
      } 

和你使用的條件

if(valid==true){ 

//your main jquery code 
} 

而且附加主要部分,如果你正在使用CI法表單驗證,您必須指定一個像

<?php echo form_error('username'); ?> 
<input type="text" name="username" value="<?php echo set_value('username'); ?>" size="50" /> 

如在這裏提到它的教程https://www.codeigniter.com/userguide3/libraries/form_validation.html#showing-errors-individually位置

由於測試的有限細節 此處是您的代碼的解決方法https://jsfiddle.net/kmvgty/napz948b/1/

剛纔添加一個id爲每個選項卡,並有JS像

$('#saveBtn').on('click', function() { 
    var detail = $('#detail').val(); 
    var qty = $('#qty').val(); 
    var price = $('#price').val(); 
    if ((detail == '') || (detail == null)) { 
    valid = false; 
    $('#erropr').removeClass('hide'); 
    $('#erropr').html('* Enter an item'); 

    } else { 
    $('#erropr').html(''); 
    } 

    // same way for other 
}); 

Ofcourse你的情況是不同的,但是這僅僅是一個建議,看向撥弄它是否可以幫助你

+0

我想使用你的if語句,但它不喜歡當我在名字後面使用[]。你有關於如何識別該領域的建議嗎? – bobthegoalie

2

盡我所能理解這一切,在這裏後我能說什麼。首先,你所有的輸入都沒有關閉>,並且不需要有那個「」部分。

<input type="text" name="detail[]" required="" 

改變所有

<input type="text" name="detail[]" required> 

接下來,你在笨的回調,我假設的代碼是檢查均有投入。你不需要這是你做我上面說的。

最後,我錯過了動態添加輸入的部分,添加了該代碼,我將更多地瞭解它。但按照我所說的,您將無法使用HTML5驗證提交表單。

這不會刷新頁面,也沒有提交表單,如果任何一個爲空

+0

如果您在更完整的代碼中需要更多幫助,我很樂意回答。 –

+0

我其實沒有提交表格。我調用函數'add_quotation'並通過序列化表單來獲取發佈數據。所以如果我是正確的,那麼所需的方法將不起作用。我添加了添加表格行的代碼。 – bobthegoalie

3

首先,您在表單中使用了不完整的輸入選擇器。 它應該是這樣的..

<input type="text" name="detail[]" required> 

在codeigniter代碼中。從表單中使用簡單的php isset和計數功能。通過這個你可以驗證發佈的數組。表單驗證庫可以隨時隨地工作。發佈數據的條件。

if(isset($_POST['detail']) && (count($_POST['detail'])>0)){ 
    // code here 
    } 
    else{ 
    return "required"; 
    } 
+0

我是否在驗證回調函數中使用if語句? – bobthegoalie

+0

對不起,您可以隨時隨地工作。還有一件事,通過這種方式,您可以輕鬆發送不同類型的錯誤消息@bobthegoalie。 –

+0

@bobthegoalie是你的答案嗎? –

1

我發現一個簡單的方法我自己,

一些簡單的JavaScript

我傾向於使用我的驗證控制器不使用的form_validation()方法

的例子是:

//this is a model 
    public function login($username,$password){ 
    $data = array('username' => $username, 
    'password' => $password); 

    $query = $this->db->select('user_account',$data); 

    return $query->result_array(); 
    } 

    //view 
    <form action = "" method = "post"> 
    <input type = "text" name = "username"/> 
    <input type = "password" name = "password"/> 
    <button>Submit</button> 
    </form> 


    //this is the controller 
    public function logging_in(){ 
    $username = $this->input->post('username'); 
    $password = $this->input->post('password'); 

    $result = $this->model->login($username,$password); 

      if(empty($username) && empty($password)){ 

      echo "<script>alert('Empty!');</script>"; 
      } 
      else{ 
        if($result!=NULL){ 
        echo "<script>alert('Successfully Logged In!');</script>"; 
        } 
      } 

    } 

您可以通過以下方式調用控制器中的方法:

<?php echo form_open('User_Authentication/logging_in'); ?> 
    //Your form 
    <?php echo form_close(); ?> 

或者您可以使用此:

<form action = "<?php echo base_url(); ?>index.php/User_Authentication/logging_in" method="post"> 

嘗試與此有關。

1
$this->load->library('form_validation'); 
$this->form_validation->set_error_delimiters('<div class="error">', '</div>'); 
$this>form_validation>set_rules('detail','Detail','required|greater_than[0]'); 
if ($this->form_validation->run() == FALSE) { 
    $this->load->view('',$data); 
}else{ 
    $this->model->add() 
}