2010-11-06 9 views
0

Может ли кто-нибудь увидеть, что мне не хватает?Ошибка обратного вызова Codeigniter

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

В документ:

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

Она гласит:

$ this-> form_validation-> set_rules ('имя пользователя', 'Имя пользователя', '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; 
     } 
    } 

В моем классе User расширяет Controller

Я имею в функции регистра:

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

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

+0

Я не вижу, где вы можете добавить обратный вызов этой функции. – helle

+0

@helle: Функция является обратным вызовом. Если вы прочтете веб-страницу, которую он привел, вы увидите, что 'callback_username_check' устанавливает' username_check' в качестве обратного вызова. –

ответ

3

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

Возможно, вы захотите проверить, позволяет ли CodeIgniter вызывать функции обратного вызова и функции prepping/validator в том же правиле. Если это не позволяет этого, вы можете позвонить 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.')');

Престол, в этой строке, вы не должны быть на самом деле ВЫЗОВ функция. Скорее, вы передаете строку в функцию 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; 
     } 
} 
+0

Это делает работу: – pigfox

+0

Спасибо !!! Это не работает: $ this-> form_validation-> set_rules ('username', 'Username', 'callback_username_check'); Но теперь я не могу назвать trim, require и xss_clean. Любая идея, как это сделать? – pigfox

+0

Отлично! Это сработало! Спасибо! – pigfox

Смежные вопросы