简体   繁体   English

Codeigniter - form_validation 回调函数错误信息

[英]Codeigniter - form_validation callback function error message

View:查看:

<div class="container">
    <div class="row">
        <div class="col-md-3">
        </div>
        <div class="col-md-6">
        <form method="post" action="<?php echo base_url();?>account/register">
        <?php $form_error = $this->session->flashdata('error'); ?>
          <div class="form-group">
            <label for="username">Username</label>
            <input class="form-control" id="username" name="username" type="input">
            <div id="form_error"><?php echo $form_error['username']; ?></div>
          </div>
          <div class="form-group">
            <label for="password">Password</label>
            <input class="form-control" id="password" name="password" type="password">
            <div id="form_error"><?php echo $form_error['password']; ?></div>
          </div>
          <div class="form-group">
            <label for="confirm_password">Confirm Password</label>
            <input class="form-control" id="confirm_password" name="confirm_password" type="password">
          <div id="form_error"><?php echo $form_error['confirm_password']; ?></div>
          </div>
          <div class="form-group">
            <label for="gender">Gender</label>
            <select class="form-control" id="gender" name="gender">
                <option disabled selected value="">select a gender</option>
                <option value="Male">Male</option>
                <option value="Female">Female</option>
                <option value="Other">Other</option>
            </select>
            <div id="form_error"><?php echo $form_error['gender']; ?></div>
          </div>
          <div class="form-group">
            <label for="birthdate">Birthdate</label>
            <input class="form-control" id="birthdate" name="birthdate" type="date">
            <div id="form_error"><?php echo $form_error['birthdate']; ?></div>
          </div>



          <button type="submit" class="btn btn-primary btn-block">Submit</button>
        </form>
        <div class="text-center">
        <a class="d-block small mt-3" href="<?php echo base_url();?>pages/login_user">Already have an account?</a>
        </div>
        </div>
        <div class="col-md-3">
        </div>
    </div>
</div>
</body>

Account Controller:账户管理员:

public function register(){
$this->form_validation->set_rules('username', 'Username', 'trim|required|is_unique[users.username]');
$this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[8]|max_length[20]');
$this->form_validation->set_rules('confirm_password', 'Confirm Password', 'trim|required|matches[password]');
$this->form_validation->set_rules('gender', 'Gender', 'trim|required|in_list[Male,Female,Other]');
$this->form_validation->set_rules('birthdate', 'Birthdate', 'trim|required|valid_date');

if($this->form_validation->run() == FALSE){
$form_error = array('username' => form_error('username'),
        'password' => form_error('password'),
        'confirm_password' => form_error('confirm_password'),
        'gender' => form_error('gender'),
        'birthdate' => form_error('birthdate'));
$this->session->set_flashdata('error', $form_error);
redirect('pages/register_user');
}else{ 
$data = array('username' => $this->input->post('username'),
            'password' => password_hash($this->input->post('password'),PASSWORD_BCRYPT),
            'gender' => $this->input->post('gender'),
            'birthdate' => $this->input->post('birthdate'),
            'date_created' => mdate('%Y-%m-%d',time()),
            'last_login' => mdate('%Y-%m-%d',time()));
if($this->account_model->create_account($data)){
$this->session->set_flashdata('message','Registration Successful');
redirect('pages/login_user');
}else{
$this->session->set_flashdata('message','Registration Failed');
redirect('pages/register_user');}}
}

//form_validation callback
public function valid_date($birthdate){
    echo 'aw';
if(date('YYYY-MM-DD',strtotime($birthdate))){
return TRUE; }else{
    echo $birthdate;
$this->form_validation->set_message('valid_date', 'Invalid Birthdate');
$form_error['birthdate'] = form_error('valid_date');
$this->session->set_flashdata('error',$form_error);
return FALSE; }
}

Pages Controller:页面控制器:

public function login_user(){
    $data['title'] = 'Login';
    $this->load->view('template/header',$data);
    $this->load->view('template/navbar');
    $this->load->view('pages/login');
    $this->load->view('template/footer');
    }

    public function register_user(){
    $data['title'] = 'Register';
    $this->load->view('template/header',$data);
    $this->load->view('template/navbar');
    $this->load->view('pages/registration');
    $this->load->view('template/footer');
    }

I tried setting flashdata inside the callback function but this is my first time using a callback function to check the validity of the birthdate given.我尝试在回调函数中设置 flashdata,但这是我第一次使用回调函数来检查给定生日的有效性。 I tested out the input and you can't input any alphabets but you can go over the maximum length.我测试了输入,你不能输入任何字母,但你可以超过最大长度。 For example the format should be 'YYYY-MM-DD' you can input something like this: 555555-55-55.例如,格式应为“YYYY-MM-DD”,您可以输入如下内容:555555-55-55。

All my other error prints out successfully but the valid_date callback function prints an error:我所有的其他错误都成功打印出来,但 valid_date 回调函数打印了一个错误:

Unable to access an error message corresponding to your field name Birthdate.(valid_date)无法访问与您的字段名称 Birthdate.(valid_date) 相对应的错误消息

If what i'm asking for is impossible/wrong then i'll just add a min_length[10] and max_length[10] and just edit its error to 'invalid date'.如果我要求的是不可能的/错误的,那么我只需添加一个 min_length[10] 和 max_length[10] 并将其错误编辑为“无效日期”。

EDIT: Taking inspiration from my statement above about the max and min length, i also added a custom error for the valid_date there and what do you know it works.编辑:从我上面关于最大和最小长度的陈述中汲取灵感,我还在那里为 valid_date 添加了一个自定义错误,你知道它有什么作用。

Heres my updated controller:这是我更新的控制器:

public function register(){
    $this->form_validation->set_rules('username', 'Username', 'trim|required|is_unique[users.username]');
    $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[8]|max_length[20]');
    $this->form_validation->set_rules('confirm_password', 'Confirm Password', 'trim|required|matches[password]');
    $this->form_validation->set_rules('gender', 'Gender', 'trim|required|in_list[Male,Female,Other]');
    $this->form_validation->set_rules('birthdate', 'Birthdate', 'trim|required|valid_date',
    array('valid_date' => 'Invalid Date of birth'));

    if($this->form_validation->run() == FALSE){
    $form_error = array('username' => form_error('username'),
            'password' => form_error('password'),
            'confirm_password' => form_error('confirm_password'),
            'gender' => form_error('gender'),
            'birthdate' => form_error('birthdate'));
    $this->session->set_flashdata('error', $form_error);
    redirect('pages/register_user');
    }else{ 
    $data = array('username' => $this->input->post('username'),
                'password' => password_hash($this->input->post('password'),PASSWORD_BCRYPT),
                'gender' => $this->input->post('gender'),
                'birthdate' => $this->input->post('birthdate'),
                'date_created' => mdate('%Y-%m-%d',time()),
                'last_login' => mdate('%Y-%m-%d',time()));
    if($this->account_model->create_account($data)){
    $this->session->set_flashdata('message','Registration Successful');
    redirect('pages/login_user');
    }else{
    $this->session->set_flashdata('message','Registration Failed');
    redirect('pages/register_user');}}
    }

    //form_validation callback
    public function valid_date($birthdate){
    if(date('YYYY-MM-DD',strtotime($birthdate))){
    return TRUE; }else{return FALSE; }
    }

I'm still not sure if it really works or just by fluke.我仍然不确定它是否真的有效或只是侥幸。

Register code:注册码:

public function register() {
    $this->form_validation->set_rules('username', 'Username', 'trim|required|is_unique[users.username]');
    $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[8]|max_length[20]');
    $this->form_validation->set_rules('confirm_password', 'Confirm Password', 'trim|required|matches[password]');
    $this->form_validation->set_rules('gender', 'Gender', 'trim|required|in_list[Male,Female,Other]');
    $this->form_validation->set_rules('birthdate', 'Birthdate', 'trim|required|callback_valid_date');

    if ($this->form_validation->run() == FALSE) {
        // let's see what's going on under the hood...
        print_r($this->form_validation->error_array());
        exit;
        $form_error = array('username' => form_error('username'),
            'password' => form_error('password'),
            'confirm_password' => form_error('confirm_password'),
            'gender' => form_error('gender'),
            'birthdate' => form_error('birthdate'));
        $this->session->set_flashdata('error', $form_error);
        redirect('pages/register_user');
    } else {
        $data = array('username' => $this->input->post('username'),
            'password' => password_hash($this->input->post('password'), PASSWORD_BCRYPT),
            'gender' => $this->input->post('gender'),
            'birthdate' => $this->input->post('birthdate'),
            'date_created' => mdate('%Y-%m-%d', time()),
            'last_login' => mdate('%Y-%m-%d', time()));
        if ($this->account_model->create_account($data)) {
            $this->session->set_flashdata('message', 'Registration Successful');
            redirect('pages/login_user');
        } else {
            $this->session->set_flashdata('message', 'Registration Failed');
            redirect('pages/register_user');
        }
    }
}

Referencing a callback necessitates the function be called via callback_func_name .引用回调需要通过callback_func_name函数。

Revised callback:修改后的回调:

Note: item does not start with callback_注:商品符合启动callback_

See: Correctly determine if date string is a valid date in that format (read: test cases)请参阅: 正确确定日期字符串是否为该格式的有效日期(阅读:测试用例)

public function valid_date($date) {
    $format = 'Y-m-d';
    $d = DateTime::createFromFormat($format, $date);
    if ($d && $d->format($format) == $date) {
        return TRUE;
    } else {
        $this->form_validation->set_message('valid_date', 'Invalid Birthdate.');
        return FALSE;
    }
}

Doing date('YYYY-MM-DD') is wrong as it yields: 2018201820182018-FebFeb-SatSat .date('YYYY-MM-DD')是错误的,因为它产生: 2018201820182018-FebFeb-SatSat See date docs .请参阅日期文档

hey try this to use callback嘿试试这个来使用回调

$this->form_validation->set_rules('birthdate', 'Birthdate', 'trim|required|callback_validdate',

//form_validation callback
public function validdate($birthdate){

    $birthdate = $this->input->post('birthdate');

    if( date('YYYY-MM-DD',strtotime($birthdate)) )
    {
        return true;
    }

    $this->form_validation->set_message('validdate','Check the birthday input to match a format like this YYYY-MM-DD');
    return false;

}

Callbacks: Your own Validation Methods回调:您自己的验证方法

The validation system supports callbacks to your own validation methods.验证系统支持回调到您自己的验证方法。 This permits you to extend the validation class to meet your needs.这允许您扩展验证类以满足您的需要。 For example, if you need to run a database query to see if the user is choosing a unique username, you can create a callback method that does that例如,如果您需要运行数据库查询来查看用户是否选择了唯一的用户名,您可以创建一个回调方法来执行该操作

More Detail read https://codeigniter.com/user_guide/libraries/form_validation.html#callbacks-your-own-validation-methods更多详情请阅读https://codeigniter.com/user_guide/libraries/form_validation.html#callbacks-your-own-validation-methods

你应该这样称呼:

$this->form_validation->set_rules('birthdate', 'Birthdate', 'trim|required|callback_valid_date');

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM