动态表单输入名称的codeigniter表单验证

时间:2013-03-03 14:17:48

标签: forms codeigniter dynamic input validation

我有一个codeigniter应用程序。我的视图使用数据库行ID附加到输入名称以获取唯一ID。这允许我在表单操作中使用所有输入,即更新。

我的查看语法:

<?php if(isset($records)) {?>
<table id="hor-minimalist-a">
    <tr>
        <th>&nbsp;</th><th>&nbsp;</th><th>Customer Name</th><th>postalcode</th>
    <tr>

<?php if(isset($records)) : foreach ($records as $row) : ?>
    <tr>
        <td>
<?php echo anchor('masterdata/confirm_delete_customer/'.$row->id, img(array('src'=>'images/delete_icon.png','border'=>'0','alt'=>'Delete'))); ?>
        </td>
        <td>
            <input type=checkbox name="editcustomer[]" id="editcustomer[]" value="<?php echo $row->id ?>">
        </td>
        <td>
            <input class="inputwide" type="text" name="customer_name_<?php echo $row->id ?>" id="customer_name_<?php echo $row->id ?>" value="<?php echo $row->customer_name ; ?>" >
        </td>
        <td>
            <input class="inputnarrow" type="text" name="postalcode_<?php echo $row->id ?>" id="postalcode_<?php echo $row->id ?>" value="<?php echo $row->postalcode ; ?>" >
        </td>
    </tr>
<?php endforeach ; ?>
    </table>
<input type="submit" value="Update Checked Customers">
<?php endif; ?>

<?php echo form_close(); ?>
<?php } else {?>
<h4 id="warning"> No Customers currently in database</h4>
<?php } ?>

您可以看到输入name'sid's是唯一的。

我的控制器语法如下:

function manage_customers()
    {

        $data['title']="Manage Customers";

            //query model to get data results for form
            $data=array();

            if($query=$this->model_master_data->get_customer_records()){
                $data['records']=$query;
            }

            $this->load->view("master_data/view_master_data_header",$data);
            $this->load->view("master_data/view_master_data_nav");
            $this->load->view("master_data/view_content_master_data_manage_customers",$data);
            $this->load->view("master_data/view_master_data_footer");


            $editcustomer = $this->input->post('editcustomer');

            // single update - working

            if( $this->input->post('editcustomer') != false )
            {
                foreach ($editcustomer as $row_id)
                {
                    $data = array( 
                        'postalcode' => $this->input->post('postalcode_'.$row_id),
                        'customer_name' => $this->input->post('customer_name_'.$row_id) );
                    $this->model_master_data->update_customer_records( $row_id, $data );
                }
             $this->session->set_flashdata('dbaction', 'Selected Records have been updated successfully');
            redirect('masterdata/manage_customers', 'refresh');
            }


    }

如何使用codeigniter验证类来确保用户使用可靠的数据修改输入框?

怎么可以

$this->form_validation->set_rules("primary_contact_tell","联系人告诉","required|xss_clean|min_length[10]|max_length[14]");

引用输入字段的正确动态名称?表单目前只有客户名称和邮政编码,但需要添加其余字段。

提前感谢,一如既往。

2 个答案:

答案 0 :(得分:1)

您可以在控制器中循环遍历$记录,以实现动态输入验证规则。

foreach($records as $row)
{
    $this->form_validation->set_rules("customer_name_" . $row->id, "Customer name", "required|xss_clean|min_length[10]|max_length[14]");
    $this->form_validation->set_rules("postalcode_" . $row->id, "Customer name", "required|xss_clean|min_length[10]|max_length[14]");
}


修改

想一想。我无法检查控制器中的变量。据我所知,基于你在这里写的代码,这应该有效:

foreach($editcustomer as $row_id)
{
    $this->form_validation->set_rules("customer_name_" . $row_id, "Customer name", "required|xss_clean|min_length[10]|max_length[14]");
    $this->form_validation->set_rules("postalcode_" . $row_id, "Customer name", "required|xss_clean|min_length[10]|max_length[14]");
}

答案 1 :(得分:0)

工作解决方案,非常感谢@yabol。我仍然需要清理语法,但希望功能正常工作。

查看

<?php 
    $attributes=array(
        'name'=>'updatecustomer',
        'id'=>'updatecustomer',
        );
    echo form_open('masterdata/manage_customers',$attributes);
?>
<div id="validation_failed">
    <?php
        echo validation_errors();
    ?>
</div>
<?php if(isset($records)) {?>
<table id="hor-minimalist-a">
    <tr>
        <th>&nbsp;</th><th>&nbsp;</th><th>Customer Name</th><th>Address Line 1</th><th>Address Line 2</th><th>Suburb</th><th>City</th><th>Postal Code</th><th>Contact Name</th><th>Contact Email</th><th>Contact Tel</th>
    <tr>

<?php if(isset($records)) : foreach ($records as $row) : ?>
    <tr>
        <td>
<?php echo anchor('masterdata/confirm_delete_customer/'.$row->id, img(array('src'=>'images/delete_icon.png','border'=>'0','alt'=>'Delete'))); ?>
        </td>
        <td>
            <input type=checkbox name="editcustomer[]" id="editcustomer[]" value="<?php echo $row->id ?>">
        </td>
        <td>
            <input class="inputwide" type="text" name="customer_name_<?php echo $row->id ?>" id="customer_name_<?php echo $row->id ?>" value="<?php echo $row->customer_name ; ?>" >
        </td>
        <td>
            <input class="inputmedium" type="text" name="address_line_1_<?php echo $row->id ?>" id="address_line_1_<?php echo $row->id ?>" value="<?php echo $row->address_line_1 ; ?>" >
        </td>
        <td>
            <input class="inputmedium" type="text" name="address_line_2_<?php echo $row->id ?>" id="address_line_2_<?php echo $row->id ?>" value="<?php echo $row->address_line_2 ; ?>" >
        </td>
        <td>
            <input class="inputmedium" type="text" name="suburb_<?php echo $row->id ?>" id="suburb_<?php echo $row->id ?>" value="<?php echo $row->suburb ; ?>" >
        </td>
        <td>
            <input class="inputmedium" type="text" name="city_<?php echo $row->id ?>" id="city_<?php echo $row->id ?>" value="<?php echo $row->city ; ?>" >
        </td>
        <td>
            <input class="inputnarrow" type="text" name="postalcode_<?php echo $row->id ?>" id="postalcode_<?php echo $row->id ?>" value="<?php echo $row->postalcode ; ?>" >
        </td>
        <td>
            <input class="inputmedium" type="text" name="primary_contact_name_<?php echo $row->id ?>" id="primary_contact_name_<?php echo $row->id ?>" value="<?php echo $row->primary_contact_name ; ?>" >
        </td>
        <td>
            <input class="inputmedium" type="text" name="primary_contact_email_<?php echo $row->id ?>" id="primary_contact_email_<?php echo $row->id ?>" value="<?php echo $row->primary_contact_email ; ?>" >
        </td>
        <td>
            <input class="inputmedium" type="text" name="primary_contact_tell_<?php echo $row->id ?>" id="primary_contact_tell_<?php echo $row->id ?>" value="<?php echo $row->primary_contact_tell ; ?>" >
        </td>

    </tr>
<?php endforeach ; ?>
    </table><br>
<input type="submit" value="Update Checked Customers">
<?php endif; ?>

<?php echo form_close(); ?>

<强>控制器

function manage_customers()
    {

        $data['title']="Manage Customers";
            //query model to get data results for form
            $data=array();

            if($query=$this->model_master_data->get_customer_records()){
                $data['records']=$query;
            }
            $editcustomer = $this->input->post('editcustomer');

            if( $this->input->post('editcustomer') != false ){
            foreach($editcustomer as $row_id)
            {
                $this->form_validation->set_rules("customer_name_" . $row_id, "Customer name", "required|min_length[6]");
                $this->form_validation->set_rules("address_line_1_". $row_id,"`Address Line 1`","required|xss_clean|min_length[6]");
                $this->form_validation->set_rules("address_line_2_". $row_id,"`Address Line 2`","xss_clean|min_length[6]");
                $this->form_validation->set_rules("suburb_". $row_id,"`Suburb`","required|xss_clean|min_length[6]");
                $this->form_validation->set_rules("city_". $row_id,"`City`","required|xss_clean|min_length[6]");
                $this->form_validation->set_rules("postalcode_". $row_id,"`Postal Code`","required|xss_clean|min_length[4]|max_length[5]");
                $this->form_validation->set_rules("primary_contact_name_". $row_id,"`Contact Person Name`","required|xss_clean|min_length[6]");
                $this->form_validation->set_rules("primary_contact_email_". $row_id,"`Contact Person email`","required|valid_email|xss_clean");
                $this->form_validation->set_rules("primary_contact_tell_". $row_id,"`Contact Person tell`","required|xss_clean|min_length[10]|max_length[14]");

            }
            }

            if ($this->form_validation->run() == FALSE){

                $data["message"]="";

                $this->load->view("master_data/view_master_data_header",$data);
                $this->load->view("master_data/view_master_data_nav");
                $this->load->view("master_data/view_content_master_data_manage_customers",$data);
                $this->load->view("master_data/view_master_data_footer");

            } else {
                // single update - working
                if( $this->input->post('editcustomer') != false )
                {
                    foreach ($editcustomer as $row_id)
                    {
                        $data = array( 
                        'customer_name' => $this->input->post('customer_name_'.$row_id),
                        'address_line_1' => $this->input->post('address_line_1_'.$row_id),
                        'address_line_2' => $this->input->post('address_line_2_'.$row_id),
                        'suburb' => $this->input->post('suburb_'.$row_id),
                        'city' => $this->input->post('city_'.$row_id),
                        'postalcode' => $this->input->post('postalcode_'.$row_id),
                        'primary_contact_name' => $this->input->post('primary_contact_name_'.$row_id),
                        'primary_contact_email' => $this->input->post('primary_contact_email_'.$row_id),
                        'primary_contact_tell' => $this->input->post('primary_contact_tell_'.$row_id),
                        );

                        $this->model_master_data->update_customer_records( $row_id, $data );
                    }
                     $this->session->set_flashdata('dbaction', 'Selected Records have been updated successfully');
                    redirect('masterdata/manage_customers', 'refresh');
                    }

            }
    }