Добавление пользовательского обратного вызова к проверке формы Codeigniter

Я хочу ограничить свою регистрацию на электронные письма с помощью @ mywork.com. Я сделал следующее в My_Form_validation.

public function email_check($email) { $findme='mywork.com'; $pos = strpos($email,$findme); if ($pos===FALSE) { $this->CI->form_validation->set_message('email_check', "The %s field does not have our email."); return FALSE; } else { return TRUE; } } 

Я использую его следующим образом. Я использую правила CI для имени пользователя и пароля, и он работает, для электронной почты он принимает любой адрес электронной почты. Любую благодарю за любую помощь.

 function register_form($container) { .... .... / Set Rules $config = array( ...//for username // for email array( 'field'=>'email', 'label'=>$this->CI->lang->line('userlib_email'), 'rules'=>"trim|required|max_length[254]|valid_email|callback_email_check|callback_spare_email" ), ...// for password ); $this->CI->form_validation->set_rules($config); 

Проблема с созданием обратного вызова непосредственно в контроллере заключается в том, что он теперь доступен в URL- http://localhost/yourapp/yourcontroller/yourcallback вызывая http://localhost/yourapp/yourcontroller/yourcallback что нежелательно. Существует более модульный подход, который забирает ваши правила проверки в файлы конфигурации. Я рекомендую:

Ваш контроллер:

 <?php class Your_Controller extends CI_Controller{ function submit_signup(){ $this->load->library('form_validation'); if(!$this->form_validation->run('submit_signup')){ //error } else{ $p = $this->input->post(); //insert $p into database.... } } } 

application/config/form_validation.php :

 <?php $config = array ( //this array key matches what you passed into run() 'submit_signup' => array ( array( 'field' => 'email', 'label' => 'Email', 'rules' => 'required|max_length[255]|valid_email|belongstowork' ) /* , array( ... ) */ ) //you would add more run() routines here, for separate form submissions. ); 

application/libraries/MY_Form_validation.php :

 <?php class MY_Form_validation extends CI_Form_validation{ function __construct($config = array()){ parent::__construct($config); } function belongstowork($email){ $endsWith = "@mywork.com"; //see: http://stackoverflow.com/a/619725/568884 return substr_compare($endsWith, $email, -strlen($email), strlen($email)) === 0; } } 

application/language/english/form_validation_lang.php :

Добавить: $lang['belongstowork'] = "Sorry, the email must belong to work.";

Вам нужно проверить что-то подобное в функции обратного вызова Codeigniter?

 $this->form_validation->set_rules('email', 'email', 'trim|required|max_length[254]|valid_email|xss_clean|callback_spare_email[' . $this->input->post('email') . ']'); if ($this->form_validation->run() == FALSE) { // failed echo 'FAIL'; } else { // success echo 'GOOD'; } function spare_email($str) { // if first_item and second_item are equal if(stristr($str, '@mywork.com') !== FALSE) { // success return $str; } else { // set error message $this->form_validation->set_message('spare_email', 'No match'); // return fail return FALSE; } } 

Коррекция ответа Иордании, файл языка, который вам нужно изменить, должен быть расположен в

система / язык / английский / form_validation_lang.php

не приложение /…/ form_validation_lang.php. Если вы создаете новый файл под одним и тем же именем приложения, он будет перезаписывать оригинал в системном пути. Таким образом, вы потеряете все использованные исходные фильтры.