0
votes

Can anyone see what I'm missing?

I'm using Codeigniter v1.72.

In the doc:

http://codeigniter.com/user_guide/libraries/form_validation.html

It states:

$this->form_validation->set_rules('username', 'Username', 'callback_username_check');

function username_check($str)
    {
        if ($str == 'test')
        {
            $this->form_validation->set_message('username_check', 'The %s field can not be the word "test"');
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }

In my class User extends Controller

I have in function register:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean', 'callback_username_check('.$username.')');

I have also tried 

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean', 'callback_username_check');

And

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean', 'callback_username_check['.$username.']');


    function username_check($str)
    {
            $this->load->model('User_model', '', TRUE);
            $taken = $this->User_model->countUsername($str);

            if($taken)
            {
                $this->form_validation->set_message('username_check', 'That username is already taken');
                return FALSE;
            }
            else
                return TRUE;
    }

There are no errors at all, none of my approaches work, the code behaves like it's not there.

1
i can't see where you can add a callback to this function.helle
@helle: The function IS a callback. If you read the web page he cited, you'll see that callback_username_check sets username_check as a callback.William Linton

1 Answers

3
votes

First of all, I'm assuming the rest of your code is correct. It might help to show the whole User class.

You might want to check if CodeIgniter lets you invoke callback functions AND prepping/validator functions in the same rule. If it doesn't allow that, you could call trim, require, and xss_clean in your callback function.

I will say, though, that if it is allowed, then this is definitely the RIGHT form:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean', 'callback_username_check');

This is wrong:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean', 'callback_username_check['.$username.']');

And this is wrong too:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean', 'callback_username_check('.$username.')');

See, in that line, you shouldn't actually be CALLING the function. Rather, you're passing a string to the set_rules() function that it will parse and figure out what function you want to use as a callback.

As the documentation states, whatever the value of username is, will be passed as the argument to your callback function.

EDIT:

I was going to say try this:

$this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|callback_username_check');

But I don't think it will work. Instead, this should work:

function username_check($str)
    {
        $this->load->model('User_model', '', TRUE);
        $taken = $this->User_model->countUsername($str);

        if($taken)
        {
            $this->form_validation->set_message('username_check', 'That username is already taken');
            return FALSE;
        }
        else if(!$str) {
            // This is functioning as the required rule
            return FALSE;
        }
        else {
            $str = trim($str);
            $str = $this->input->xss_clean($str);
            return $str;
        }
}