CodeIgniter แสดงข้อผิดพลาดทีละรายการถัดจากฟิลด์แบบฟอร์มพร้อมการโทรกลับ ajax

ฉันสร้างแบบฟอร์มโดยใช้ CI และมีไลบรารี form_validation() ดั้งเดิมเพื่อตรวจสอบอินพุตแต่ละฟิลด์ ฉันใช้โพสต์ jQuery เพื่อเรียกกลับอินพุตเพื่อตรวจสอบว่าแต่ละฟิลด์นั้นถูกต้องหรือไม่ ฉันต้องการให้แต่ละข้อผิดพลาดเติมลงใน form_error() ถัดจากนั้นอย่างไร แต่ละฟิลด์แทนที่จะเป็น validation_errors()?

โปรดดูด้านล่าง:

มุมมอง:

<script>
$("#btnregister").click(function() {
    var parameters = $("#reg_form").serialize();

    $.post(baseurl+'pages/registration', parameters, function(data) {
        if(data == "ok") {
            //show success message
        }else{

            $("#error").html(data); 

        }
    }, "html");
});
</script>


<div id="error"></div>
<form id="reg_form" method="post">
     <p>
     <label for="reg_username">Username</label><br />
     <input type="text" id="reg_username" name="reg_username" value="<?php echo set_value('reg_username'); ?>">
     <?php echo form_error('reg_username'); ?>
     </p>

     <p>
     <label for="reg_email">Email</label><br />
     <input type="text" id="reg_email" name="reg_email" value="<?php echo set_value('reg_email'); ?>">
     <?php echo form_error('reg_email'); ?>
     </p>

     <p><input type="button" id="btnregister" value="Register"></p>
</form>
</div>

ตัวควบคุม:

public function registration(){
    $this->load->library('form_validation');

    $this->form_validation->set_rules('reg_username', 'Username', 'trim|required|min_length[4]|max_length[15]|xss_clean|is_unique[users.username]');
    $this->form_validation->set_rules('reg_email', 'Email', 'trim|required|valid_email|is_unique[users.email]');


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

    }else{
        // insert to db
        echo "ok";
    }
}

ขอบคุณที่ช่วยเหลือ.


person conmen    schedule 21.12.2012    source แหล่งที่มา


คำตอบ (1)


คุณจะต้องสร้างอาร์เรย์ข้อผิดพลาดของคุณเอง คงจะดีไม่น้อยถ้าเราสามารถเข้าถึง $_error_array ของ Form_validation ได้ แต่น่าเสียดายที่เป็น protected และไม่มีวิธีการเข้าถึง

ฉันจะเปลี่ยนคอนโทรลเลอร์ของคุณเพื่อแสดงการตอบสนอง json เพื่อให้ง่ายขึ้น:

public function registration()
{
    $this->load->library('form_validation');
    $this->form_validation->set_rules('reg_username', 'Username', 'trim|required|min_length[4]|max_length[15]|xss_clean|is_unique[users.username]');
    $this->form_validation->set_rules('reg_email', 'Email', 'trim|required|valid_email|is_unique[users.email]');
    if ($this->form_validation->run())
    {
       $response['status'] = TRUE;
    }
    else
    {
        $errors = array();
        // Loop through $_POST and get the keys
        foreach ($this->input->post() as $key => $value)
        {
            // Add the error message for this field
            $errors[$key] = form_error($key);
        }
        $response['errors'] = array_filter($errors); // Some might be empty
        $response['status'] = FALSE;
    }
    // You can use the Output class here too
    header('Content-type: application/json');
    exit(json_encode($response));
}

ตอนนี้การโทรกลับสำเร็จของ ajax ของคุณสามารถอ่านคีย์ status และ errors ของการตอบกลับได้ คุณสามารถวนซ้ำ data.errors และเพิ่มแต่ละรายการลงในช่องป้อนข้อมูล:

$("#reg_form").submit(function() {
    var form = $(this);
    $.post(baseurl+'pages/registration', form.serialize(), function(data) {
        if (data.status == true) {
            //show success message
        }else{
            $.each(data.errors, function(key, val) {
                $('[name="'+ key +'"]', form).after(val);
            });​
        }
    }, "json");
});

วิธีง่ายๆ อีกวิธีหนึ่งคือการโพสต์แบบฟอร์มไว้บนตัวมันเอง และให้การตอบกลับ ajax ของคุณโหลดแบบฟอร์มใหม่ทั้งหมด - วิธีนี้จะทำให้ข้อความและตัวกรองการตรวจสอบความถูกต้องได้รับการดูแลฝั่งเซิร์ฟเวอร์

person Wesley Murch    schedule 21.12.2012
comment
นั่นยอดเยี่ยมสำหรับฉัน .. ขอบคุณมาก @Wesley Murch Sir .. :) - person Mohammed Sufian; 25.02.2014