Ошибка обратного вызова Codeigniter - PullRequest
0 голосов
/ 07 ноября 2010

Кто-нибудь может увидеть, что мне не хватает?

Я использую Codeigniter v1.72.

В документе:

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

В нем говорится:

$ 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;
        }
    }

В моем классе пользователь расширяет контроллер

У меня в реестре функций:

$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');

И

$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;
    }

Нет ошибок вообще, ни один из моих подходов не работает, код ведет себя так, как будто его там нет.

1 Ответ

3 голосов
/ 07 ноября 2010

Прежде всего, я предполагаю, что остальная часть вашего кода верна. Это может помочь показать весь класс User.

Возможно, вы захотите проверить, позволяет ли CodeIgniter вызывать функции обратного вызова и функции подготовки / проверки в одном правиле. Если это не позволяет, вы можете вызвать trim, require и xss_clean в функции обратного вызова.

Я скажу, однако, что если это разрешено, то это определенно форма RIGHT :

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

Это неправильно :

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

И это неправильно тоже:

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

Видите ли, в этой строке вы не должны быть CALLING функцией. Скорее, вы передаете строку в функцию set_rules(), чтобы она проанализировала и выяснила, какую функцию вы хотите использовать в качестве обратного вызова.

Как указано в документации, любое значение username будет передано в качестве аргумента функции обратного вызова.

EDIT:

Я собирался сказать, попробуйте это:

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

Но я не думаю, что это сработает. Вместо этого это должно работать:

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;
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...