2013-05-21 2 views
0

Мне нужно настроить валидацию для идентификаторов студента, а родная библиотека CI не разрезает ее, поэтому я расширил. У меня, однако, проблема с работой, и я не совсем понимаю, где я работаю. Это моя первая трещина в REGEX, так что легко и просто. Вот мой код:Расширение библиотеки проверки - CI2

<?php 

if(!defined('BASEPATH')) exit('No direct script access allowed'); 

class MY_Form_validation extends CI_Form_validation 
{ 

    public function is_valid_student_id($str) 
    { 
     if(strlen($str) > 9) 
     { 
      $this -> set_message('is_valid_student_id', 'A-Number can not be over 9 characters'); 
      return FALSE; 
     } 
     elseif(strlen($str) < 9) 
     { 
      $this -> set_message('is_valid_student_id', 'A-Number can not be under 9 characters'); 
      return FALSE; 
     } 
     elseif((($str[0]) !== 'a') && (($str[0]) !== 'A')) 
     { 
      $this -> set_message('is_valid_student_id', 'A-Number must begin with the letter "A"'); 
      return FALSE; 
     } 
     elseif(ctype_alpha($str[0])) 
     { 
      if(is_numeric(substr($str, 1, strlen($str) - 1))) 
      { 
       return TRUE; 
      } 
      else 
      { 
       $this -> set_message('is_valid_student_id', 'A-Number must have 8 digits 0 - 9'); 
       return FALSE; 
      } 
     } 
     else 
     { 
      $this -> set_message('is_valid_student_id', 'A-Number must begin with the letter "A"'); 
      return FALSE; 
     } 

    } 

} 

Затем использовать проверку я делаю это:

if (!$this->input->post('student') == 'yes') { 
    $this->form_validation->set_rules('anum', 'A Number', 'required|is_valid_student_id|exact_length[9]'); 
} 

Я Следование этим good /// tutorials, но я все еще немного запутался. Любая помощь будет большой. Спасибо

+1

Для этого правила нужно просто запустить одиночное 'preg_match()', и если это не удается, укажите в своем сообщении об ошибке требования к числу. Это много дополнительной логики для проверки одной строки. –

+0

Я абсолютно с тобой согласен с этим! Однако мой босс не делает - lol. Он хочет, чтобы ученик точно знал, почему их студенческий идентификатор не работает. С моим уровнем знаний PHP это был самый простой способ получения этого пользовательского требования. По крайней мере, сейчас прогнозируется каждый беспорядок на части студентов, когда дело доходит до ввода текста. –

ответ

2

Если вы используете синтаксис callback_, тогда функция должна быть на контроллере. Если вы добавляете его непосредственно в библиотеку Form_Validation, вам не нужно callback_. Попробуйте это:

$this->form_validation->set_rules(
     'anum', 'A Number', 'required|is_anum|exact_length[9]'); 
+0

На стороне примечания: вы можете захотеть переосмыслить это имя функции. Когда я вижу 'is_anum', я думаю, что это означает« буквенно-цифровое »или что-то эквивалентное. Может быть, is_valid_student_id? – cwallenpoole

+0

Я сделал то, что вы сказали, удалил обратный вызов и изменил имя функции, но я все еще не могу получить никаких ошибок проверки. –

+0

Вы можете получить * любые * ошибки? Если нет, убедитесь, что отчет об ошибках включен. Если вы тестируете устройство (если нет, почему бы и нет), убедитесь, что 'is_valid_student_id' возвращает то, что вы ожидаете, последовательно. – cwallenpoole

0

Я думаю, нет необходимости расширять библиотеку просто сделать один метод обратного вызова в контроллере и добавить выше код в нем ... Просто сделать один метод, называемый is_anum и поместить свой код в нем

if (!$this->input->post('student') == 'yes') { 
      $this->form_validation->set_rules('anum', 'A Number', 'required|callback_is_anum|exact_length[9]'); 
     } 

function is_anum($str) 
{ 
if (((substr($str, 0) !== 'a') || substr($str, 0) !== 'A') && (!preg_match("/[^0-9]/", $str))) // If the first character is not (a or A) and does not contain numbers 0 - 9 
     { // Set a message and return FALSE so the run() fails 
      $this->set_message('is_anum', 'Please enter a valid A-Number'); 
      return FALSE; 
     } else 
     { 
      return TRUE; 
     } 
    } 

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