簡體   English   中英

Codeigniter驗證表單中的數組

[英]Codeigniter Validate Array In Form

我有一張桌子的表格。 該表包括三個用戶輸入。 數量,訂單項和價格。 我需要填寫所有三個信息,然后用戶才能提交表單。 該表允許添加行。

這是我的桌子。

<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;
    }

 }

我遇到的問題是,當我將訂單項字段留空時,表單未提交但沒有顯示錯誤。 如果我在訂單項字段中輸入數據,但數量和價格字段為空,則提交表單。 我是否需要為表中的每個字段創建驗證 如何使錯誤出現?

Codeigniter 版本3.0.6

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

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

在codeigniter代碼中。 使用簡單的php isset和count函數從表單發布數組。 這樣,您可以驗證發布的數組。 表單驗證庫可在任何地方工作。 發布數據的條件。

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

在盡力理解所有內容之后,這就是我可以說的。

首先,您所有的輸入都沒有結尾>,並且不需要包含“”部分。

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

全部更改為

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

接下來,您在codeigniter中的回調,我假設代碼是檢查所有輸入是否都有。 您不需要這就是您按照我上面所說的做。

最后,當您動態添加輸入,添加該代碼時,我會缺少該部分,我將對其進行更多介紹。 但是按照我說的做,您將無法使用HTML5驗證提交表單。

如果任何一個為空,則不會刷新頁面也不提交表單

對於像這樣的領域

<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
});

當然,您的情況會有所不同,但這只是建議,可以幫助您

我找到了自己的簡便方法,

一些簡單的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">

試試這個。

$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()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM