Page MenuHomePhabricator
Paste P582

Fork of P581 (An Untitled Masterwork)
ActivePublic

Authored by weber on Oct 29 2012, 8:36 AM.
Tags
None
Referenced Files
F22318: Fork_of_P581__An_Untitled_Masterwork_
Feb 24 2016, 1:31 AM
Subscribers
None
<?
/**
* Правила создание правил трактуется самим классом валидации
* но есть некоторые правила как и для класса CValidator так и для классов
*Валидаторов это справедливо для методов rules() и rule().
* array('user',$user,'length','min'=>3, 'max'=>5) ,
* здесь первые три параметра обязательны
* 1 параметр ИМЯ валидации
* 2 параметр Значение для праверки
* 3 параметр ИмяВалидатор - указывает на класс валидатора
* остальные параметры необязятельные/дополнительные
* К примеру : array('user',$user,'length','min'=>3, 'max'=>5) ,
* здесь валидатор length проверяет длину заданными необязятельные/дополнительные параметрами
* min и max. класс CLength вводит их для своих нужд проверки длины.
* Каждый валидатор содержит параметр message по умолчанию для вывода сообщения ошибки, но можно
* задать его самому, пример ниже.
*
* @author webs <rainbluz@gmail.com>
* @version $Id$
* @package system
* @since
* */
require_once dirname(__FILE__)."/validators/IValidator.php";
class CValidator
{
public $wrapper;
public $wrapper_out;
public $rules;
//загрузчик
public function autoload($className)
{
$class_name="C".ucfirst($className);
$result=$class_name;
$path=dirname(__FILE__)."/validators/{$class_name}.php";
if(file_exists($path))
require_once $path;
else
$result=false;
return $result;
}
/**
* Проверка одиночного правила
* @param array $rule -правило в виде ассоциативного массива
* @param bool $boolian - флаг результата(по умолчанию false) если установленно в true метод вернет булеевый результат.
* @retrurn array|bool
* @example
* CValidator::rule(array('user',$user,'required'),false); //вернет результат в виде массива
* CValidator::rule(array('user',$user,'required'),true); //вернет true|false
* */
private function rule($rules=array(),$single=true)
{
try
{
if(!is_array($rules))
throw new Exception(__METHOD__ . " Параметр $rules не массив.");
if(empty($rules))
throw new Exception(__METHOD__ . " Параметр $rules пустой.");
if(count($rules)<3)
throw new Exception(__METHOD__ . "Кол-во параметров в правеле $rules меньше 3.");
if(isset($rules[2]))
{
if(is_string($rules[2]))
{
if($class_name=self::autoload($rules[2]))
{
if($res=$class_name::model($class_name))
{
if($single===true)
{
$wrapper = new CValidator;
$wrapper->wrapper=$res;
$wrapper->rules=$rules;
return $wrapper;
}
else if($single===false)
return $res;
}
}
else
throw new Exception(__METHOD__ . "Класс {$class_name}(/validators/{$class_name}.php) не существует");
}
else
throw new Exception(__METHOD__ . " В массиве правил rules, неправельно задан валидатор. Он должен быть строкой (3 параметр)");
}
else
throw new Exception(__METHOD__ . " В массиве правил rules, не задан валидатор(3 параметр).");
}
catch (PDOException $e)
{
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
}
/**
* Мульти проверка правил заданных многомерным масивом
*@param array $rules - массив правил
*@return object CValidator - обьект с результатом проверки
* */
private function rules($rules=array())
{
$wrapper = new CValidator;
foreach($rules as $params)
$_rules[] = self::rule($params,false);
$wrapper->wrapper= $_rules;
$wrapper->rules=$rules;
return $wrapper;
}
/**
* Проверка правил валидации и подготовка для дальнейших действий
* @param array $rules - массив правил
* @return object CValidator - обьект с результатом проверки
* @example
* <pre>
* $single_rule=array('E-mail','youmail@mail.ext','mail');
* CValidator::run($single_rules);
* или
* $my_array=array('one','first_name'=>'webs');
* $user_name;//берётся откуда нибудь
* $poly_rules=array(
* array('E-mail','youmail@mail.ext','mail'),
* array('user',$user_name,'required'),
* array('ХЕШ',$my_array,'length','min'=>3, 'max'=>5),
* );
* CValidator::run($poly_rules);
* </pre>
* */
public function run($rules=array())
{
try
{
if(!is_array($rules))
throw new Exception(__METHOD__ . " Параметр rules должен быть массивом. Правила валидации задаются в виде массива");
//для одиночного правила
if(is_string($rules[0]))
$result = self::rule($rules) ;
//мультиправила
else
$result = self::rules($rules);
return $result->check();
}
catch (PDOException $e)
{
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
}
/**
* Проверка заданых правил назначеными валидаторами в правилах
* @return
* */
private function check()
{
if(is_array($this->wrapper))
{
$wrapper = new CValidator;
//проверяем заданые правила
foreach($this->wrapper as $key=>$rule)
if(!is_bool($result=$rule->validate($this->rules[$key])))
$wrapper->wrapper_out[]= $result;
//отдаем true если небыло ошибок иначе отдаем обьект с массивом ошибок
if(empty($wrapper->wrapper_out))
$wrapper->wrapper_out=true;
return $wrapper;
}
else
{
$wrapper = new CValidator;
$wrapper->wrapper_out=$this->wrapper->validate($this->rules);
return $wrapper;
}
}
/**
* Возвращает массив ошибок в виде текскта
* @return array|boolean - ошибки в виде массива или false если ошибки отсутствуют
* @example
* <pre>
* CValidator::run($poly_rules)->getError();
* или
* CValidator::run($single_rules)->getError();
* </pre>
* */
public function getError()
{
$messages=array();
if(!empty($this->wrapper_out))
{
if(isset($this->wrapper_out['message']))
$messages[]=$this->wrapper_out['message'];
else
foreach($this->wrapper_out as $rules)
$messages[]=$rules["message"];
return $messages;
}
else
return false;
}
/**
* Возвращает резултат проверки в виде boolean
* @return boolean - true:если в ходе проверки найдена хоть одна ошибка,false:если ошибок не вознило.
* @example
* <pre>
* CValidator::run($poly_rules)->IsError();
* или
* CValidator::run($single_rules)->IsError();
* </pre>
* */
public function IsError()
{
if(!empty($this->wrapper_out))
{ //проверяем есть ли ошибка для одиночного правила.($this->wrapper_out Если ошибки нет вернет bool, если есть вернет массив)
if(isset($this->wrapper_out) && !is_array($this->wrapper_out))
{ //если нет
if($this->wrapper_out===true)
$error=false;
}
else
{
//одиночное правило
if(isset($this->wrapper_out['error']))
$error=true;
//мулти правило
else
{
foreach($this->wrapper_out as $rules)
$errors[]=$rules["error"];
if(!empty($errors))
$error=true;
else
$error=false;
}
}
return $error;
}
//ошибок нет или форсмажор
else
return false;
}
}

Event Timeline