Файл: engine/classes/Validator.php
Строк: 146
<?php
    /**
     * @class Validator
     * @author Patsifist
     * @version 0.1
     */
    Class Validator
    {
        public $attributes, $errors, $labels;
        /**
         * @param array $attributes массив полей
         * @param array $labels массив названий полей
         */
        public function __construct(array $attributes, $labels = array())
        {
            $this->attributes = $attributes;
            $this->labels = $labels;
        }
        /**
         * @param array $rules массив правил для проверки
         * @return bool Возаращает TRUE, если ошибок нет
         */
        public function check(array $rules)
        {
            foreach ($rules as $rule)
            {
                call_user_func(
                    array($this, 'validator_'.$rule[1]), // вызов метода / $validator->validator_require и тд
                    $rule[0], // название поля, которое проверяется
                    (isset($this->attributes[$rule[0]]) ? $this->attributes[$rule[0]] : false), // содержимое  поля, которое проверяется
                    (isset($rule[2]) ? $rule[2] : false) // дополнительный параметр
                    );
            }
            return empty($this->errors);
        }
        /**
         * @param string $attribute поле для проверки
         * Можно указать несколько полей, указав их черех запятую: array('name, password', 'require');
         */
        public function validator_require($attribute)
        {
            $attributes = explode(', ', $attribute);
            foreach($attributes as $attr)
            {
                if (empty($this->attributes[$attr]))
                {
                    $this->errors[] = 'Поле "'.$this->labels[$attr]. '" не заполнено';
                }
            }
        }
        /**
         * @param string $attribute поле для проверки
         * @param string $value содержимое поля для проверки
         * @param string $var2 переменная для сравнения с $value, можно быть названием поля: array('password', 'compare', 'password3');
         * @return bool
         */
        public function validator_compare($attribute, $value, $var2)
        {
            if (isset($this->attributes[$var2]))
            {
                if ($value != $this->attributes[$var2])
                {
                    $this->errors[] = $this->labels[$attribute] . ' и ' . $this->labels[$var2] . ' должны быть одинаковыми';
                    return false;
                }
            }
            elseif ($value != $var2)
            {
                $this->errors[] = $this->labels[$attribute] . ' не соответствует ' . $var2;
                return false;
            }
        }
        /**
         * @param string $attribute поле для проверки
         * @param string $value содержимое поля для проверки
         * @param string $type Разрешенный тип данных: array('age', 'type', 'integer');
         * @return bool
         */
        public function validator_type($attribute, $value, $type)
        {
            $types = array('boolean' => 'булевая', 'integer' => 'число', 'array' => 'массив', 'string' => 'строка', 'float' => 'дробное число', 'object' => 'объект');
            switch($type)
            {
            default:
            case 'string':
                $func = 'is_string';
                break;
            case 'boolean':
                $func = 'is_bool';
                break;
            case 'integer':
                $func = 'is_numeric';
                break;
            case 'array':
                $func = 'is_array';
                break;
            case 'float':
                $func = 'is_float';
                break;
            case 'object':
                $func = 'is_object';
                break;
            }
            $attributes = explode(', ', $attribute);
            foreach($attributes as $attr)
            {
                if (!call_user_func($func, $this->attributes[$attr]))//gettype($this->attributes[$attr]) != $type)
                {
                    $this->errors[] = $this->labels[$attr] . ' не ' . $types[$type];
                    return false;
                }
            }
        }
        /**
         * @param string $attribute поле для проверки
         * @param string $value содержимое поля для проверки
         * @param array $list список возможных значений: array('city', 'in_list', array('London', 'Paris'))
         * @return bool
         */
        public function validator_in_list($attribute, $value, $list)
        {
            /*
             * http://habrahabr.ru/post/216865/
             *
             * in_array($value, $list)
             */
            $found = false;
            foreach($list as $item)
            {
                if ($value == $item)
                {
                        $found = true;
                    break;
                }
            }
            if ($found == false)
            {
                $this->errors[] = $this->labels[$attribute] . ' не найден в списке возможных вариантов';
            }
            return $found;
        }
        /**
         * @param string $attribute поле для проверки
         * @param string $value содержимое поля для проверки
         * @param string $exts разрешенный расширения файлов, указывается через запятую
         * @return bool
         */
        public function validator_file_ext($attribute, $value, $exts)
        {
            if ($this->validator_in_list($attribute, pathinfo($value, PATHINFO_EXTENSION), explode(', ', $exts)) == false)
            {
                $this->errors[] = $this->labels[$attribute] . ' может быть одним из следующих форматов: '.$exts;
                return false;
            }
        }
        /**
         * @param string $attribute поле для проверки
         * @param string $value содержимое поля для проверки
         * @param array $size array('name', 'length', array('min' => 2, 'max' => 19');
         */
        public function validator_length($attribute, $value, $size)
        {
            if (isset($size['min']) && mb_strlen($value) < $size['min'])
            {
                $this->errors[] = $this->labels[$attribute] . ' должен содержать более '.$size['min'] . ' символов';
            }
            if (isset($size['max']) && mb_strlen($value) > $size['max'])
            {
                $this->errors[] = $this->labels[$attribute] . ' может содержать менее ' . $size['max'] . ' символов';
            }
        }
        /***
         * @param string $attribute поле для проверки
         * @param string $value содержимое поля для проверки
         * @return bool
         */
        public function validator_captcha($attribute, $value)
        {
            if (empty($_SESSION['captcha']) || trim(strtolower($value)) != $_SESSION['captcha'])
            {
                $this->errors[] = 'Неверный проверочный код';
                return false;
            }
        }
        /**
         * @param string $attribute поле для проверки
         * @param string $value содержимое поля для проверки
         * @param string $pattern регулярное выражение для проверки
         * @return bool
         */
        public function validator_match($attribute, $value, $pattern)
        {
            if (!preg_match($pattern, $value))
            {
                $this->errors[] =  $this->labels[$attribute] . ' не соответствует формату';
                return false;
            }
            //return preg_match($pattern, $value);
        }
        /**
         * @param string $attribute поле для проверки
         * @param string $url URL ля проверки
         * @return bool
         */
        public function validator_url($attribute, $url)
        {
            if(filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED) == false)
            {
                $this->errors[] =  $this->labels[$attribute] . ' содержит не корректный URL';
                return false;
            }
        }
        /**
         * @param string $attribute поле для проверки
         * @param string $value содержимое поля для проверки
         * @return bool
         */
        public function validator_email($attribute, $value)
        {
            if (filter_var($value, FILTER_VALIDATE_EMAIL) == false)
            {
                $this->errors[] = 'Проверьте правильность ввода e-mail';
                return false;
            }
        }
        /**
         * @param string $attribute поле для проверки
         * @param string $value содержимое поля для проверки
         * @return bool
         */
        public function validator_login($attribute, $value)
        {
            if (
                preg_match("#^[a-zа-яё][a-zа-яё0-9-_ ]{2,31}$#ui", $value) == false||
               (preg_match("#[a-z]+#ui", $value) && preg_match("#[а-яё]+#ui", $value)))
            {
                $this->errors[] = 'Проверьте правильность ввода логина';
                return false;
            }
        }
        /**
         * @param string $attribute поле для проверки
         * @param string $value содержимое поля для проверки
         * @param array $search массив с названиям таблицы и поля для проверки: array('login', 'in_table', array('table' => 'user', 'row' => 'nick');
         * @return bool
         */
        public function validator_in_table($attribute, $value, $search)
        {
            global $sql;
            if ($sql->query('SELECT COUNT(*) FROM `'.$search['table'].'` WHERE `'.$search['row'].'` = "'.$sql->esc($value).'"')->result() == 0)
            {
                $this->errors[] = $this->labels[$attribute] . ' не найден';
                return false;
            }
        }
        /**
         * @param string $attribute поле для проверки
         * @param string $value содержимое поля для проверки
         * @param mixed $user_method пользовательская функция для проверки
         */
        public function validator_user_method($attribute, $value, $user_method)
        {
            $result = call_user_func($user_method, $value);
            if (!empty($result))
            {
                $this->errors[] = $result;
            }
        }
        /**
         * @param string $attribute поле для проверки
         * @param string $value содержимое поля для проверки
         * @param mixed $default_value значение по умолчанию
         */
        public function validator_default($attribute, &$value, $default_value)
        {
            if (empty($value))
            {
                $value = $default_value;
            }
        }
        /**
         * @param string $attribute поле для проверки
         * @param string $value содержимое поля для проверки
         * @return bool
         */
        public function validator_token($attribute, $value)
        {
            if (!CSRF::check($value, $attribute))
            {
                $this->errors[] = 'Ошибка при отправке сообщения, попробуйте заново. Если ошибка повторяется, сообщите администратору';
                return false;
            }
        }
    }