我想验证登录表单并使用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;
}
有什么想法吗?如果有人知道更好的方法来做所有这些,请告诉我!感谢
答案 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');