из серии "ночной бред" PHP: <?php /** * Валидатор форм * @author padaboo */ class Validate { /** * Объект валидатора * @var object */ private $validators = array(); /** * массив ошибок * 'field' => 'errors' */ private $errors = array(); /** * Валидные поля или нет * @var bool */ private $valid = true; /** * @param array $options * $_POST $_GET * @param array $methodType */ public function __construct($options, $form, $mapper = null) { $validateFactory = new ValidateFactory(); foreach ($options as $validator => $ops) { $errors = array(); $this->validators[$validator] = $validateFactory->getValidator($validator, $ops, $form, $mapper); if(!$this->validators[$validator] ->isValid()){ foreach ($this->validators[$validator]->getErrors() as $field => $error) { $this->errors[$field]= $error; } $this->valid = false; } } } /** * Валидны ли поля * @return bool */ public function isValid(){ return $this->valid; } /** * @return array */ public function getErrors(){ return $this->errors; } } PHP: <?php /** * Description of ValidateFactory * Фабрика, возвращет объект валидатора * @author padaboo */ class ValidateFactory { /** * возвращает объект валидатора * @return object */ public function getValidator($validator, $options, $form, $mapper){ switch ($validator){ case('string') : return new StringValidator($options, $form); case('mail') : return new MailValidator($options, $form); case('overlap') : return new OverlapValidator($options, $form); case('file') : return new FileValidator($options, $form); case('binding') : return new BindingValidator($options, $form); case('db') : return new DBValidator($options, $form, $mapper); default : return trigger_error("Неизвестный тип валидатора $validator!", E_USER_ERROR); } } } ?> PHP: <?php /** * Description of AValidator * Абстрактный класс валидатора * @author padaboo */ abstract class AValidator { /** * опции валидатора * @var array */ protected $options; /** * массив 'field' => 'ошибка' * @var array */ protected $errors = array(); /** * $_POST $_GET * @var array */ protected $form; /** * опции валидатора * @param array $options */ public function __construct($options, $form){ if(!is_array($options))trigger_error(" Не верно заданы поля для $field", E_USER_ERROR); $this->options = $options; $this->form = $form; $this->checkOptions(); } /** * проверяет правильность опций */ abstract protected function checkOptions(); /** * Валидные или нет данные * @return bool */ abstract public function isValid(); /** * Возвращает ошибки в виде массива * @return array */ public function getErrors(){ return $this->errors; } } ?> PHP: <?php /** * Description of StringValidator * Предназначен для валидации строк * @author padaboo */ include_once 'AValidator.php'; class StringValidator extends AValidator { /** * Реализация абстрактного метода * AValidator проверяет правильность опций */ protected function checkOptions(){ foreach ($this->options as $field => $rule) { if( !isset($rule['min']) || !isset($rule['max']) ) trigger_error("Не верно заданы поля для $field ", E_USER_ERROR); if( $rule['min'] > $rule['max'] ) trigger_error(" ['min'] > ['max'] ", E_USER_ERROR); } } /** * Валидны ли данные * @return boolean */ public function isValid(){ $valid = true; $errors = array(); foreach ($this->options as $field => $rule) { if(isset($this->form[$field])){ $min = $rule['min']; $max = $rule['max']; if(($min > strlen($this->form[$field])) || $max < strlen($this->form[$field]) || !isset($this->form[$field])){ $errors[] = "Не верная длинна поля $field (от ".$rule['min']." до ".$rule['max'].")"; $valid = false; } if(isset($rule['rule']) && preg_match($rule['rule']['pattern'],$this->form[$field])){ $errors[] = $rule['rule']['error']; $valid = false; } } } if($errors)$this->errors[$field] = implode("<br/>", $errors); return $valid; } } ?> Есть фабрика и абстрактный класс, на базе этого можно дописать любой валидатор, вот пример для строки, можно задавать патерн с символами которые вы не хотите увидеть в полях формы PHP: <?php //правила $rule = array( //тип переменных, он case для фабрики 'string' => array( 'login' => array( 'min' => 6, 'max' => 20, 'rule' => array( 'pattern' => '/^[^@]*@[^@]*\.[^@]*$/', 'error' => 'Это не должен быть e-mail' ) ), 'password' => array( 'min' => 6, 'max' => 20 ) ) ); //имитация $_GET $get = array('login' => [email='olo@mail.ru]'olo@mail.ru[/email]', 'password' => 'password'); $validate = new Validate($rule, $get); if($validate->isValid()){ echo 'Валидно'; } else{ foreach ($validate->getErrors() as $field => $error) { echo $field." : ". $error.'<br/>'; } } этот пример выдаст не судите строго, толком не проверял и не ничего не исправлял (но вроде как работает)
Костян зенд валидатор видел, с фабрикой интереснее) , а написал посмотря на твой кстати, тоже прикольная идея
да, прикольная, я но уже точно знаю, что в большинстве моих случаев удобнее отдельные классы валидаторов, каждый из которых рули одно правило (ну может внутри юзает еще например парочку собратьев ...)
Костян а вот еше есть такая штука формы генерировать, тоже хочу написать, вот только не пойму, сгенерировал я форму на ходу, а что с ней верстальщик то делать будет? тупо в блок <div class="form"></div>? поля подписывать как, тоже не понятно или там какие то заранее заготовленные шаблоны?
та, тут куча разных варианто, всё зависит от работы с вёрской, обычно верстальщик даёт сверстанную форму, так что генерить - это как то не ахти ...
да уж, не самый удачный вариант PHP: <?php $ops = array( 'string' => array( 'login' => array( 'min' => 6, 'max' => 20 ), 'password' => array( 'min' => 6, 'max' => 20 ), 'question' => array( 'min' => 3, 'max' => 20 ), 'answer' => array( 'min' => 3, 'max' => 20 ) ), 'mail' => array( 'mail' ), 'overlap' => array( 'password' => 'password2', 'mail' => 'mail2' ), 'binding' => array( 'login', 'password', 'password2', 'mail', 'mail2', 'question', 'answer' ), 'db' => array( 'login' => array('user','login'), 'password' => array('user','password') ) );