我刚开始使用Codeigniter,需要设置表单验证规则和自定义验证消息,以检查数据库中是否存在以忘记密码形式提交的电子邮件地址。如果电子邮件地址存在则发送电子邮件,如果不存在,则应重新加载表单,将字段值设置为用户输入的内容,并提供电子邮件地址不存在的错误。
我在控制器中有以下内容......
public function forgot_password()
{
$this->form_validation->set_rules('email_address','Email Address','trim|required|valid_email');
if($this->form_validation->run() == FALSE)
{
$this->forgot_password_form();
}
else
{
$this->load->model('membership_model');
if($query = $this->membership_model->val_forgot_password())
{
$data['main_content'] = 'forgot_password_sent';
$this->load->view('includes/template', $data);
}
else
{
$this->form_validation->set_message('email_address','The email address you provided does not exist.');
$this->forgot_password_form();
}
}
}
并在模型中......
public function val_forgot_password()
{
$this->db->where('email_address', $this->input->post('email_address'));
$query = $this->db->get($this->members);
if($query->num_rows == 1)
{
return true;
}
else
{
return false;
}
}
表格是......
<?php
echo form_open('login/forgot_password');
echo "Email Address: " . form_input('email_address', set_value('email_address', ''));
echo br(2);
echo form_submit('submit','Send Email');
echo form_close();
echo br(1);
echo validation_errors('<p>Error: ');
?>
使用有效的电子邮件地址提交表单时,它会正确转到成功页面,但如果电子邮件地址不存在,则表示重新加载表单但不会出错。
帮忙吧! :d
答案 0 :(得分:3)
您应该使用回调来检查电子邮件是否存在。所以你的控制器就像......
public function forgot_password()
{
$this->form_validation->set_rules('email_address','Email Address','trim|required|valid_email|callback__check_email_exists');
if($this->form_validation->run() == FALSE)
{
// VALIDATION ERRORS, SHOW VIEWS
}
else
{
// ALL IS GOOD, UPDATE EMAIL, AND REDIRECT TO CURRENT URL
}
}
你的回调(仍然在你的控制器中)就像......
public function _check_email_exists($email)
{
// LOAD AND USE YOUR MODEL TO CHECK EMAIL EXISTS HERE
if ( ! $email_exists )
{
$this->form_validation->set_message('email_address', 'That email address don\'t exist, sucka!');
return FALSE;
}
else
{
return TRUE;
}
}
所有这些都在这里的优秀CI文档中详细说明,如果您是初学者,我建议您坚持CI约定。
http://codeigniter.com/user_guide/libraries/form_validation.html
编辑:在codeigniter3中执行此操作时还遇到了另一个问题。您必须将消息字段名称命名为回调。所以不是$this->form_validation->set_message('email_address', 'That email address don\'t exist, sucka!');
这应该是
$this->form_validation->set_message('_check_email_exists', 'That email address don\'t exist, sucka!');
答案 1 :(得分:0)
你应该扩展MY_Form_validation
,这样你的函数就可以在任何形式上使用,而不仅仅是那些驻留在控制器中的形式。