За последние 24 часа нас посетили 18207 программистов и 1682 робота. Сейчас ищут 1087 программистов ...

Валидатор форм

Тема в разделе "Решения, алгоритмы", создана пользователем Padaboo, 7 ноя 2010.

  1. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    из серии "ночной бред"
    PHP:
    1. <?php
    2. /**
    3.  * Валидатор форм
    4.  * @author padaboo
    5.  */
    6. class Validate {
    7.     /**
    8.      * Объект валидатора
    9.      * @var object
    10.      */
    11.     private $validators = array();
    12.     /**
    13.      * массив ошибок
    14.      * 'field' => 'errors'
    15.      */
    16.     private $errors = array();
    17.     /**
    18.      * Валидные поля или нет
    19.      * @var bool
    20.      */
    21.     private $valid = true;
    22.     /**
    23.      * @param array $options
    24.      * $_POST $_GET
    25.      * @param array $methodType
    26.      */
    27.     public function  __construct($options, $form, $mapper = null) {
    28.         $validateFactory = new ValidateFactory();
    29.         foreach ($options as $validator => $ops) {
    30.             $errors  = array();
    31.             $this->validators[$validator] = $validateFactory->getValidator($validator, $ops, $form, $mapper);
    32.             if(!$this->validators[$validator] ->isValid()){
    33.                 foreach ($this->validators[$validator]->getErrors() as $field => $error) {
    34.                     $this->errors[$field]=  $error;
    35.                 }
    36.                 $this->valid = false;
    37.             }
    38.         }
    39.     }
    40.     /**
    41.      * Валидны ли поля
    42.      * @return bool
    43.      */
    44.     public function isValid(){
    45.         return $this->valid;
    46.     }
    47.     /**
    48.      * @return array
    49.      */
    50.     public function getErrors(){  
    51.         return $this->errors;
    52.     }
    53. }
    PHP:
    1. <?php
    2. /**
    3.  * Description of ValidateFactory
    4.  * Фабрика, возвращет объект валидатора
    5.  * @author padaboo
    6.  */
    7. class ValidateFactory {
    8.     /**
    9.      * возвращает объект валидатора
    10.      * @return object
    11.      */
    12.     public function getValidator($validator, $options, $form, $mapper){
    13.         switch ($validator){
    14.             case('string') :
    15.                 return new StringValidator($options, $form);
    16.             case('mail') :
    17.                 return new MailValidator($options, $form);
    18.             case('overlap') :
    19.                 return new OverlapValidator($options, $form);
    20.             case('file') :
    21.                 return new FileValidator($options, $form);
    22.             case('binding') :
    23.                 return new BindingValidator($options, $form);
    24.             case('db') :
    25.                 return new DBValidator($options, $form, $mapper);
    26.             default :
    27.                 return trigger_error("Неизвестный тип валидатора $validator!", E_USER_ERROR);
    28.         }
    29.     }
    30. }
    31. ?>
    32.  
    PHP:
    1. <?php
    2. /**
    3.  * Description of AValidator
    4.  * Абстрактный класс валидатора
    5.  * @author padaboo
    6.  */
    7. abstract class AValidator {
    8.     /**
    9.      * опции валидатора
    10.      * @var array
    11.      */
    12.     protected $options;
    13.     /**
    14.      * массив 'field' => 'ошибка'
    15.      * @var array
    16.      */
    17.     protected $errors = array();
    18.     /**
    19.      * $_POST $_GET
    20.      * @var array
    21.      */
    22.     protected $form;
    23.     /**
    24.      * опции валидатора
    25.      * @param array $options
    26.      */
    27.     public function __construct($options, $form){
    28.         if(!is_array($options))trigger_error(" Не верно заданы поля для $field", E_USER_ERROR);
    29.         $this->options    = $options;
    30.         $this->form       = $form;
    31.         $this->checkOptions();
    32.     }
    33.     /**
    34.      * проверяет правильность опций
    35.      */
    36.     abstract protected function checkOptions();
    37.     /**
    38.      * Валидные или нет данные
    39.      * @return bool
    40.      */
    41.     abstract public function isValid();
    42.     /**
    43.      * Возвращает ошибки в виде массива
    44.      * @return array
    45.      */
    46.     public function getErrors(){
    47.         return $this->errors;
    48.     }
    49.  
    50. }
    51. ?>
    PHP:
    1. <?php
    2. /**
    3.  * Description of StringValidator
    4.  * Предназначен для валидации строк
    5.  * @author padaboo
    6.  */
    7. include_once 'AValidator.php';
    8. class StringValidator extends AValidator {
    9.     /**
    10.      * Реализация абстрактного метода
    11.      * AValidator проверяет правильность опций
    12.      */
    13.     protected function checkOptions(){
    14.         foreach ($this->options as $field => $rule) {
    15.             if( !isset($rule['min']) || !isset($rule['max']) )
    16.                 trigger_error("Не верно заданы поля для $field ", E_USER_ERROR);
    17.             if( $rule['min'] > $rule['max'] )
    18.                 trigger_error(" ['min'] > ['max'] ", E_USER_ERROR);
    19.         }
    20.     }
    21.     /**
    22.      * Валидны ли данные
    23.      * @return boolean
    24.      */
    25.     public function isValid(){
    26.         $valid = true;
    27.         $errors = array();
    28.         foreach ($this->options as $field => $rule) {
    29.             if(isset($this->form[$field])){
    30.                 $min = $rule['min'];
    31.                 $max = $rule['max'];
    32.                 if(($min > strlen($this->form[$field]))
    33.                     || $max < strlen($this->form[$field])
    34.                     || !isset($this->form[$field])){
    35.                     $errors[] =  "Не верная длинна поля $field (от ".$rule['min']." до ".$rule['max'].")";
    36.                     $valid = false;
    37.                 }
    38.                 if(isset($rule['rule']) && preg_match($rule['rule']['pattern'],$this->form[$field])){
    39.                     $errors[] = $rule['rule']['error'];
    40.                     $valid = false;
    41.                 }
    42.             }
    43.         }
    44.         if($errors)$this->errors[$field] = implode("<br/>", $errors);
    45.         return $valid;
    46.     }
    47. }
    48. ?>
    Есть фабрика и абстрактный класс, на базе этого можно дописать любой валидатор, вот пример для строки, можно задавать патерн с символами которые вы не хотите увидеть в полях формы
    PHP:
    1. <?php
    2. //правила
    3. $rule = array(
    4.     //тип переменных, он case для фабрики
    5.     'string' => array(
    6.        
    7.        'login' => array(
    8.            'min' => 6,
    9.            'max' => 20,
    10.            'rule' => array(
    11.                 'pattern' => '/^[^@]*@[^@]*\.[^@]*$/',
    12.                 'error'   => 'Это не должен быть e-mail'
    13.                 )
    14.            ),
    15.  
    16.         'password' => array(
    17.            'min' => 6,
    18.            'max' => 20
    19.            )
    20.     )
    21. );
    22. //имитация $_GET
    23. $get = array('login'    => [email='olo@mail.ru]'olo@mail.ru[/email]',
    24.             'password' => 'password');
    25.  
    26. $validate = new Validate($rule, $get);
    27.  
    28. if($validate->isValid()){
    29.    echo 'Валидно';
    30. } else{
    31.    foreach ($validate->getErrors() as $field => $error) {
    32.        echo $field." : ". $error.'<br/>';
    33.    }
    34. }
    этот пример выдаст
    не судите строго, толком не проверял и не ничего не исправлял (но вроде как работает)
     
  2. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    бери Zend_Validator ))
     
  3. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Костян
    зенд валидатор видел, с фабрикой интереснее) , а написал посмотря на твой кстати, тоже прикольная идея
     
  4. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    да, прикольная, я но уже точно знаю, что в большинстве моих случаев удобнее отдельные классы валидаторов, каждый из которых рули одно правило (ну может внутри юзает еще например парочку собратьев ...)
     
  5. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Костян
    а вот еше есть такая штука формы генерировать, тоже хочу написать, вот только не пойму, сгенерировал я форму на ходу,
    а что с ней верстальщик то делать будет?
    тупо в блок <div class="form"></div>? поля подписывать как, тоже не понятно
    или там какие то заранее заготовленные шаблоны?
     
  6. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    та, тут куча разных варианто, всё зависит от работы с вёрской, обычно верстальщик даёт сверстанную форму, так что генерить - это как то не ахти ...
     
  7. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    а вот мне на удивление зендовский не понравился. Ну неудобный он и все
     
  8. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Koc
    а какой нравится?
     
  9. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    пока еще не знаю
     
  10. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    да уж, не самый удачный вариант
    PHP:
    1. <?php
    2.             $ops = array(
    3.                 'string' => array(
    4.                     'login' => array(
    5.                         'min' => 6,
    6.                         'max' => 20
    7.                     ),
    8.                     'password' => array(
    9.                         'min' => 6,
    10.                         'max' => 20
    11.                      ),
    12.                     'question' => array(
    13.                         'min' => 3,
    14.                         'max' => 20
    15.                      ),
    16.                     'answer' => array(
    17.                         'min' => 3,
    18.                         'max' => 20
    19.                      )
    20.                  ),
    21.                 'mail' => array(
    22.                     'mail'
    23.                 ),
    24.                 'overlap' => array(
    25.                     'password' => 'password2',
    26.                     'mail'     => 'mail2'
    27.                 ),
    28.                 'binding' => array(
    29.                     'login',
    30.                     'password',
    31.                     'password2',
    32.                     'mail',
    33.                     'mail2',
    34.                     'question',
    35.                     'answer'
    36.                 ),
    37.                 'db' => array(
    38.                     'login'    => array('user','login'),
    39.                     'password' => array('user','password')
    40.                 )
    41.             );
     
  11. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Ну расковыряйте вы уже Yii! блин! :D
     
  12. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Psih
    и все будем на yii писать !!111