addRuleList($rules); } /** * Добавление списка правил в специальном формате * array(array('name' => fieldname, 'validate' => ruletext), ...) * fieldname - Имя переменой для проверки * ruletext - Описание правила см. формат правила ниже */ public function addRuleList(array $input) { $type = array( 'date' => 'Rule_Date', 'email' => 'Rule_Email', 'emaillist'=> 'Rule_EmailList', 'match' => 'Rule_Match', 'time' => 'Rule_Time', 'alpha' => 'Rule_Alpha', 'require' => 'Rule_Notnull', 'numeric' => 'Rule_Numeric', 'unique' => 'Rule_Unique', 'count' => 'Rule_Count', 'isfile' => 'Rule_IsFile', 'code' => 'Rule_Code' ); // Разбор правила проверки // Формат правила 'rule1|rule2,param1=value1|rule3,param1=value1,param2=value2' foreach ($input as $value) { // Список правил if (! isset($value['validate'])) continue; $rules = explode("|", $value['validate']); foreach ($rules as $rule) { // Список параметров правила $rule_param = explode(",", $rule); $name = array_shift($rule_param); if (isset($type[$name])) { $constructor = $type[$name]; // "Rule_" . ucfirst($name) $rule = new $constructor($value['name'], false); // Нужны шаблонные сообщения для правил if (isset($value['context'])) { $rule->setContext($value['context']); } foreach ($rule_param as $param) { // Имя и значение параметра list($name, $value) = explode("=", $param); $rule->$name = $value; } $this->addRule($rule); } else { throw new Exception('Unknown validation rule ' . $name); } } } } public function addRule(&$rule) { if (is_array($rule)) { $this->chain = array_merge($this->chain, $rule); } else { $this->chain[] = $rule; } } public function skip($rule, $container) // -> Rule_Abstract { if ($rule->skipEmpty()) { $data = $container->get($rule->field); if (!is_array($data)) { $value = trim($data); return $value == ''; } } return false; } public function validate(Collection $container, $rule = null, $status = null) { if ($rule) { $this->chain = $rule; } $this->errorMsg = array(); foreach ($this->chain as $key => $rule) { if (!$this->skip($rule, $container) && !$rule->isValid($container, $status)) { $name = $rule->field; $this->errorMsg[$name] = $rule->getErrorMsg(); } } return $this->isValid(); } public function addError($name, $message) { $this->errorMsg[$name] = $message; } public function isError() { return !empty($this->errorMsg); } public function isValid() { return empty($this->errorMsg); } public function getErrorMsg() { return $this->errorMsg; } }