Прежде всего, я предполагаю, что остальная часть вашего кода верна. Это может помочь показать весь класс 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;
}
}