CodeIgniter flashdata延迟

时间:2011-09-20 09:45:56

标签: codeigniter

我想验证登录表单并使用flashdata发送错误消息。 Flash数据似乎有延迟,它只影响第二次提交(首次提交后没有显示错误信息,第二次提交后显示确定),而userdata工作正常。

视图>

<?php if ($this->session->flashdata('error_messages')): ?>
  <?php echo $this->session->flashdata('error_messages'); ?>
<?php endif; ?>
<?php echo form_open('user/login', array('name' => 'login_form', 'id' => 'login_form')); ?>
<fieldset>
  <p>
    <?php echo form_label('Username: ', 'username'); ?>
    <?php echo form_input('username', set_value('username', ''), array('id' => 'username', 'placeholder' => 'username')); ?>
  </p>
  <p>
    <?php echo form_label('Password: ', 'password'); ?>
    <?php echo form_password('password', set_value('password', ''), array('id' => 'password', 'placeholder' => '********')); ?>
 </p>
 <p>
   <?php echo form_submit('login', 'Login', array('id' => 'login')); ?>
 </p>

   

控制器操作&gt;

public function login() {
    //user is not logged in, carry on
    if (!user_is_logged_in()) {
        //check if form was already submitted, if yes validate
        if ($this->input->post('login')) {
            $this->load->library('chronos_user');

            //gather data from form
            $username = $this->input->post('username');
            $password = $this->input->post('password');

            //validate form, show error messages if not valid
            if (
                !($this->chronos_user->valid_username($username)) ||
                !($this->chronos_user->unique_username($username))
            )
            {
                $this->chronos_template->set_data('header', array('controller' => 'users', 'action' => 'login', 'title' => 'Login'));
                $this->chronos_template->set_view('content', 'user/login_view');
                $this->chronos_template->view();
            }
            //redirect if ok
            else {
                header("Location http://c4studio.ro");
            }
        }
        //if no form was submitted, just display it
        else {
            $this->chronos_template->set_data('header', array('controller' => 'users', 'action' => 'login', 'title' => 'Login'));
            $this->chronos_template->set_view('content', 'user/login_view');
            $this->chronos_template->view();            
        }
    }
    //user is already logged in, redirect to profile page
    else {
        $profile_url = "Location: ";
        $profile_url .= site_url();
        $profile_url .= "user/profile/";

        header($profile_url);
    }
}

Valid_username方法&gt;

    public function valid_username($username) {
        if (empty($username)) {

            $this->CI->session->set_flashdata('error_messages', 'Value.');
            return FALSE;
        }
        if (strlen($username) < 3) {
            $this->CI->session->set_flashdata('error_messages', 'Value11.');
            return FALSE;
        }
        return TRUE;
    }

有什么想法吗?如果有人知道更好的方法来做所有这些,请告诉我!感谢

2 个答案:

答案 0 :(得分:4)

根据下一个服务器请求中存在的documentation flashdata。

但是在你的情况下,实际上你在同一个服务器请求中设置了flashdata,因为你显示了不成功的登录视图。这就是它不起作用的原因。

更好的方法是让你的模型方法返回true或false并使用该值代替。只有在将用户重定向到错误页面或类似内容时才应考虑使用flashdata。

答案 1 :(得分:0)

正如@Repox所说,它只适用于'下次刷新'。您假设flashdata在设置时可以正常工作,但在此之前您不需要新的实际页面重新加载/刷新。

您有正确的想法,但您只是使用flashdata来实现您的消息,坚持将消息形成为返回结果,或只是自定义变量。

这确实是开发人员为一件事设计flashdata的情况,而用户则将其用于另一件事。

您需要使用form_error来返回所有表单错误,不要使用flashdata,它将无法正常工作。

<强>示例: http://codeigniter.com/user_guide/libraries/form_validation.html#settingerrors

  

您还可以覆盖语言文件中找到的任何错误消息。   例如,要更改“必需”规则的消息,您将执行此操作   这样:

$this->form_validation->set_message('required', 'Your custom message here');