CodeIgniter表单验证错误重定向到部分页面

时间:2014-01-27 20:02:05

标签: php html codeigniter

我有一个页面按部分划分,最后一部分有表格联系。

我的代码形式:

<section id="contact">
<div class="contact_form">
        <span class="form_settings">
            <?php
            $this->load->helper("form");
            //echo $msg;
            //echo validation_errors();

            echo form_open("main/send_email");
            echo form_label("", "nome");
            $data = array(
                "placeholder" => "Nome:",
                "class" => "form_settings",
                "name" => "nome",
                "id" => "nome",
                "value" => set_value("nome")
            );
            echo form_input($data);
            echo form_error('nome');


            echo form_label("", "email");
            $data = array(
                "placeholder" => "Email:",
                "class" => "form_settings",
                "name" => "email",
                "id" => "email",
                "value" => set_value("email")
            );
            echo form_input($data);
            echo form_error('email');


            echo form_label("", "msg");
            $data = array(
                "placeholder" => "Mensagem:",
                "class" => "form_settings",
                "name" => "msg",
                "id" => "msg",
                "value" => set_value("msg")
            );
            echo form_textarea($data);
            echo form_error('msg');


            echo form_submit("submit", "Enviar", "class='form_settings'");
            echo form_close();
            ?>

        </span>
    </div>
</section>

我的控制器有一个函数send_email():

public function send_email() {
    $this->load->library("form_validation");
    $this->form_validation->set_rules("nome", "Nome:", "required|alpha|xss_clean");
    $this->form_validation->set_rules("email", "Email:", "required|valid_email|xss_clean");
    $this->form_validation->set_rules("msg", "Mensagem:", "required|xss_clean");

    if ($this->form_validation->run() == FALSE) {
        redirect('main/contactPage#contact');
    } else {

        $this->load->library("email");
        $this->email->from(set_value("email"), set_value("nome"), set_value("msg"));
        $this->email->to("xxx@gmail.com");
        $this->email->subject("Mensagem");
        $this->email->message(set_value("msg"));

        $this->email->send();
        $data["msg"] = "Email enviado com sucesso!";
        //echo $this->email->print_debugger();
        redirect('main/contactPage#contact', $data);

        }
    }

如果表单错误,它会重定向到部分页面,但不会显示验证错误。 如果形式正确,它会重定向到部分页面,但不会显示$ data的值。

对此有何解决方案?

韩国社交协会!

2 个答案:

答案 0 :(得分:1)

编辑#2:
在绞尽脑汁之后,这就是我想出来的。如果表单验证为FALSE,则检查每个单独的验证错误,如果存在,则设置flash数据项。然后重定向,并在设置时回显闪存数据。以下是更新的代码。

控制器

public function send_email() { 
    $this->load->library("form_validation"); 
    $this->form_validation->set_rules("nome", "Nome:", "required|alpha|xss_clean"); 
    $this->form_validation->set_rules("email", "Email:", "required|valid_email|xss_clean"); 
    $this->form_validation->set_rules("msg", "Mensagem:", "required|xss_clean"); 

    if ($this->form_validation->run() == FALSE) {
            // Set the flashdata that will be preserved for only the next server request
            if (form_error('nome')) {
                $this->session->set_flashdata('nome-failed','Your error message here');
            }
            if (form_error('email')) {
                $this->session->set_flashdata('email-failed','Your error message here');
            }
            if (form_error('email')) {
                $this->session->set_flashdata('msg-failed','Your error message here');
            }

            // Redirect to the contact section
            redirect('main/contactPage#contact');

    } else {
        $this->load->library('email');

        $this->email->from($this->input->post('email'), $this->input->post('nome'));
        $this->email->to('xxx@gmail.com');
        $this->email->subject('Mensagem');
        $this->email->message($this->input->post('msg'));

        $this->email->send();       

        if ($this->email->send() === TRUE) {
            // Set the flashdata that will be preserved for only the next server request
            $this->session->set_flashdata('success', 'Email enviado com sucesso!');

            // Redirect to the contact section
            redirect('main/contactPage#contact');
        }
    } 
}

查看

<?php
    $this->load->helper("form");

    // Test to see if the var is set before you try to echo it so you won't get an error
    if ( isset( $this->session->flashdata('success') ) ) {
        echo $this->session->flashdata('success');
    };
    if ( isset( $this->session->flashdata('nome-failed') ) ) { 
        echo $this->session->flashdata('nome-failed');
    };
    if ( isset( $this->session->flashdata('email-failed') ) ) { 
        echo $this->session->flashdata('email-failed');
    };

    if ( isset( $this->session->flashdata('msg-failed') ) ) {
        echo $this->session->flashdata('msg-failed');
    };

    echo form_open("main/send_email");

编辑#1:
我错过了控制器中的一部分,具体而言,您无法重定向,并期望验证错误。你最终做的就是从头开始重新加载表单。因此,您需要在if ($this->form_validation->run() == FALSE) {分支下加载视图,以便查看由您在上面设置的表单验证规则生成的任何表单验证错误。我修改了上面的控制器代码来反映这一点。表单中的视图代码将保持不变。 Here是CI用户指南中的相关页面,显示了构建代码所需的内容。

原文答案:
从我可以收集的内容(控制器的格式设置为borked),看起来你实际上并没有在sendmail函数中输入值。您可以通过调用CI中的$this->input->post();函数来实现。

我不相信你可以在重定向上传递数据(至少我从来没有能够这样做,也没有为CI提供这样的文档),所以你应该测试电子邮件是否成功发送,以及如果是这样,请使用成功消息设置$msg变量重新加载视图,以便显示。

您还注释了视图中显示表单验证错误或发送成功数据的部分。但我怀疑你在评论之前得到了一个PHP未定义的变量错误,所以检查是否先设置var,然后检查是否为echo。示例如下。

答案 1 :(得分:0)

一旦控制器文件发生变化,CI的验证消息根本不起作用。你必须使用会话。它仅适用于来自同一控制器内直接加载视图页面的消息。