Codeigniter 在表单中验证数组

Posted

技术标签:

【中文标题】Codeigniter 在表单中验证数组【英文标题】:Codeigniter Validate Array In Form 【发布时间】:2016-12-14 23:10:57 【问题描述】:

我有一个带有表格的表格。该表包括三个用户输入。数量、行项目和价格。在用户提交表单之前,我需要填写所有三个。该表允许添加行。

这是我的桌子。

<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

【问题讨论】:

没有&lt;form&gt; 标签。你能把问题简化为一个小问题吗?没有上下文,很难知道什么去哪里 你的 codeigniter 版本是多少? @motto 版本是3.0.6 已回答您的问题,请添加添加按钮的代码 另外,在添加输入时,您是否再次添加所有三个? 【参考方案1】:

首先,您在表单中使用了不完整的输入选择器。 应该是这样的。。

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

在 codeigniter 代码中。在表单中发布的数组上使用简单的 php isset 和 count 函数。通过这个,您可以验证发布的数组。表单验证库可以随心所欲地工作。发布数据的条件。

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

【讨论】:

我是否在验证回调函数中使用你的 if 语句? 抱歉回复晚了..它可以在任何地方正常工作..还有一件事,通过这种方式,您可以轻松发送不同类型的错误消息@bobthegoalie。 @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
);

当然,您的情况会有所不同,但这只是一个建议,如果它可以帮助您,请看小提琴

【讨论】:

我正在尝试使用您的 if 语句,但它不喜欢我在名称后面使用 [] 时。您对如何识别该字段有什么建议吗?【参考方案3】:

在尽我所能理解这一切之后,我想说的是。

首先,您的所有输入都没有关闭 > 并且 required 不需要有那个 "" 部分。

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

全部改为

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

接下来,您在 codeigniter 中的回调,我假设代码是检查所有输入是否都有。你不需要这个,你按照我上面说的去做。

最后,当您动态添加输入时,我遗漏了这部分,添加该代码,我将进一步了解它。但是按照我说的做,您将无法使用 HTML5 验证提交表单。

如果其中一个为空,则不会刷新页面也不会提交表单

【讨论】:

如果您在更完整的代码中需要更多帮助,我非常愿意回答。 我实际上并没有提交表单。我正在调用函数add_quotation 并通过序列化表单来获取帖子数据。因此,如果我是正确的,所需的方法将不起作用。我添加了添加表格行的代码。【参考方案4】:
$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()

【讨论】:

【参考方案5】:

我自己找到了一个简单的方法,

一些简单的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">

试试这个。

【讨论】:

以上是关于Codeigniter 在表单中验证数组的主要内容,如果未能解决你的问题,请参考以下文章

是我做错了,还是在使用数组作为字段名时 CodeIgniter 表单验证库中存在错误?

codeigniter 表单验证和数组作为字段名称

如何在codeigniter中验证数组值

使用表单验证配置文件设置CodeIgniter错误消息

CodeIgniter 2.0 - 验证数组

在 CodeIgniter 中验证表单下拉列表