Как я могу проверить тип "не соответствует", используя класс проверки формы CodeIgniter? - PullRequest
4 голосов
/ 20 апреля 2010

Я хочу убедиться, что определенное текстовое поле не содержит определенного значения.Могу ли я сделать это, используя класс проверки формы CI, или мне нужно написать собственное расширение для него?

Ответы [ 4 ]

8 голосов
/ 20 апреля 2010

Я бы расширил класс проверки формы: http://codeigniter.com/user_guide/general/creating_libraries.html

Что-то вроде

<?
class MY_Form_validation extends CI_Form_validation {
  function __constuct() {
    parent::__constuct();
  }
  function isnt($str,$field){
    $this->CI->form_validation->set_message('isnt', "%s contains an invalid response");
    return $str!==$field;
  }
}
?>

Ваше правило проверки будет выглядеть примерно так:

trim|alpha_numeric|isnt[invalid value]

Или вы можете создать функцию обратного вызова вместо расширения класса. Раздел проверки формы в руководстве пользователя CI содержит соответствующий пример: http://codeigniter.com/user_guide/libraries/form_validation.html#callbacks

4 голосов
/ 21 апреля 2010

На самом деле, в этом руководстве приведен довольно простой пример для этого вопроса - для V2 или V3

Найдите раздел "Обратные вызовы: ваши собственные функции проверки ".В этом примере он использует проверку слова «test» в поле имени пользователя и возвращает пользовательскую ошибку, если значение найдено.

В вашем контроллере измените правило «username» на следующее:

$this->form_validation->set_rules('username', 'Username', 'callback_username_check');

Затем добавьте в свой контроллер новую функцию 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;
    }
}

А Боб - твой дядя ...

4 голосов
/ 21 апреля 2010

Я согласен с Биллиамом, что вы должны расширить класс Form_validation

Я считаю, что более вероятно, что кто-то захочет проверить белый список возможных строковых значений, а не черный список. Например, вы знаете, что ваше поле shirt_size должно возвращать только строковые значения: «xl», «l», «m», «s». Мое решение - справиться с обоими случаями.

Я использую эти методы в MY_From_validation:




    /**
     * ENUM
     * The submitted string must match one of the values given
     *
     * usage:
     * enum[value_1, value_2, value_n]
     *
     * example (any value beside exactly 'ASC' or 'DESC' are invalid):
     * $rule['order_by'] = "required|enum[ASC,DESC]";
     * 
     * example of case-insenstive enum using strtolower as validation rule
     * $rule['favorite_corey'] = "required|strtolower|enum[feldman]";
     *
     * @access    public
     * @param     string $str the input to validate
     * @param     string $val a comma separated lists of values
     * @return    bool
     */
    function enum($str, $val='')
    {

        if (empty($val))
        {
        return FALSE;
        }

        $arr = explode(',', $val);
        $array = array();
        foreach($arr as $value)
        {
        $array[] = trim($value);
        }

        return (in_array(trim($str), $array)) ? TRUE : FALSE;
    }


    // --------------------------------------------------------------------

    /**
     * NOT ENUM
     * The submitted string must NOT match one of the values given
     *
     * usage:
     * enum[value_1, value_2, value_n]
     *
     * example (any input beside exactly 'feldman' or 'haim' are valid):
     * $rule['favorite_corey'] = "required|not_enum['feldman','haim']";
     *
     * @access   public
     * @param    string $str the input to validate
     * @param    string $val a comma separated lists of values
     * @return   bool
     */
    function not_enum($str, $val='')
    {
        return ($this->enum($str,$val) === TRUE)? FALSE : TRUE;
    }

Используя пример Биллиама, правило проверки, не допускающее строку 'неверное значение', будет выглядеть примерно так:

trim|alpha_numeric|not_enum[invalid value]
0 голосов
/ 21 апреля 2010

Класс проверки формы CodeIgniter может вызывать практически любую объявленную функцию PHP в вашем наборе правил. Поэтому я бы просто объявил функцию следующим образом:

class yourController {
    function someFunction() {
        $this->form_validation->set_rules('the_field_you_want_to_check', 'The Field Name', 'trim|myvalfunc[not this value]|xss');
    }
}
function myvalfunc($formvalue, $notallowed) {
    $this->CI->form_validation->set_message('myvalfunc', "%s is not allowed");
    return $formvalue !== $nowallowed;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...