2issa для расширения класса своими проверками, смотри ниже этого сообщения пример такого расширения. Я немного обновил класс. Пока что он мало тестировался и не все проверки еще работают (по коду видно, что site и ftp не работают) код помещен в репозиторий Как и обещал пример расширения класса своими проверками: код помещен в репозиторий Принимаются предложения к улучшению класса
Psih а как это подключать во время выполнения, если хостер не может? А вообще по сабджекту, я делаю статический класс Request и он фильтрует мне все переменные, а не только одну форму....
зачем мне весь реквест фильтровать? мне конкретные поля нужны. про Filter только пару недель назад узнал, но мне все равно своим велосипедом удобней пользоваться.
Такая идея пришла. Почему бы не рассматривать валидатор как простую цепочку правил? Подумать над реализацией ещё конечно нужно, но, как мне кажется, такой вариант имеет право на существование. PHP: <?php $validator = Rule::chain() ->add( Rule::chain('login') ->add(new NotEmptyRule()) ->add(new LengthRule(3, 30)) ->add(new IsEmailRule()) ) ->add( Rule::chain('password') ->add(new NotEmptyRule()) ->add(new LengthRule(3, 30)) ) ->add( Rule::chain('some_key_arr') ->add(new IsArrayRule()) ->add( Rule::chain('some_arr_key') ->add(new NotEmptyRule()) ->add(new CallbackRule($some_object, 'customValidateMethod')) ) ); $_POST = array( 'login' => 'dmitry', 'password' => '', 'some_key_arr' => array( 'some_arr_key' => 'bla bla' ) ); if ($validator->validate($_POST)) { // ... } else { print_r($validator->getErrors()); }
можно наверно. Но такое я врятли напишу в ближайшее время, так как его совсем нет =). Меня пугает такое кол-во создаваемых объектов.
Sergey89 лучше так PHP: <? class FormValidate { public static $cnf=array( "formvalidate_def_errors"=>array( "noempty"=>"Поле {name} не должно быть пустым", "regexp"=>"Поле {name} не соответсвует шаблону {type_value}", "limitlength"=>"Поле {name} не может быть длиннее {type_value} символов", "minlength"=>"Поле {name} не может быть короче {type_value} символов", "int"=>"Поле {name} может быть только числом", "noint"=>"Поле {name} не может содержать чисел", ), "formvalidate_allow_types"=>array("noempty","regexp","limitlength","mreplace","replace","minlength", "addslashes","stripslashes","escape","r_replace", "htmldecode","int","md5","nohtml","userfunc","noint"), "formvalidate_method"=>"POST", ); public $types=array(); function __construct($cnf=false){ if($cnf)self::$cnf=$cnf; else self::$cnf=locator::LoadData('config'); } function SetType($name,$types=array()){ if(!is_array($name)){ $this->types[$name]=$types; }else{ foreach($name as $key=>$val) $this->SetType($key,$val); } } function SetMethod($type){ self::$cnf['formvalidate_method']=$type; } function CheckError(){ $errors=array(); if(!empty($this->types)){ foreach($this->types as $name=>$types){ for($i=0,$c=count($types);$i<$c;$i++){ if(is_array($types[$i])){ $str=$types[$i][0]; $msg=$types[$i][1]; }else{ $str=$types[$i]; $msg=false; } $row=$this->TypeResources($str); if(in_array($row['name'],(array)self::$cnf['formvalidate_allow_types']) && method_exists($this,$method="Parse".$row['name'])){ if($this->$method($name,$row)){ if(!$msg){ $errors[]=$this->ErrorTpl(strtolower($row['name']),array("name"=>$name,"type_value"=>$row['type_value'])); }else{ $errors[]=$this->ErrorMsg($msg,array("name"=>$name,"type_value"=>$row['type_value'])); } } } } } } return $errors; } private function TypeResources($str){ preg_match("#^([\w]+)(?:\[(.+)\])?$#i",$str,$res); return array("name"=>strtolower($res[1]),"type_value"=>$res[2]); } private function VarGet($name){ switch(self::$cnf['formvalidate_method']){ case "GET": return $_GET[$name]; break; case "REQUEST": return $_REQUEST[$name]; break; default; return $_POST[$name]; } } private function VarSet($value){ switch(self::$cnf['formvalidate_method']){ case "GET": return $_GET=array_merge((array)$_GET,(array)$value); break; case "REQUEST": return $_REQUEST=array_merge((array)$_REQUEST,(array)$value); break; default; return $_POST=array_merge((array)$_POST,(array)$value); } } ############################################### # Parse Action Zone ############################################### private function ParseNoEmpty($name,$row){ $value=$this->VarGet($name); if(empty($value)){ return true; } return false; } private function ParseLimitLength($name,$row){ $value=$this->VarGet($name); if(strlen($value)>$row['type_value']){ return true; } return false; } private function ParseMinLength($name,$row){ $value=$this->VarGet($name); if(strlen($value)<$row['type_value']){ return true; } return false; } private function ParseInt($name,$row){ $value=$this->VarGet($name); if(!is_numeric($value)){ return true; } return false; } private function ParseRegExp($name,$row){ $value=$this->VarGet($name); if(!preg_match($row['type_value'],$value)){ return true; } return false; } private function ParseEscape($name,$row){ $value=$this->VarGet($name); $this->VarSet(array($name=>Replacer::Escape($value))); return false; } private function ParseAddSlashes($name,$row){ $value=$this->VarGet($name); $this->VarSet(array($name=>support::SUaddslashes($value))); return false; } private function ParseStripSlashes($name,$row){ $value=$this->VarGet($name); $this->VarSet(array($name=>support::SUStripSlahes($value))); return false; } private function ParseMReplace($name,$row){ $value=$this->VarGet($name); $this->VarSet(array($name=>Replacer::Mreplace($value))); return false; } private function ParseReplace($name,$row){ $value=$this->VarGet($name); $this->VarSet(array($name=>Replacer::Replace($value))); return false; } private function ParseR_Replace($name,$row){ $value=$this->VarGet($name); $this->VarSet(array($name=>Replacer::R_Replace($value))); return false; } private function ParseMd5($name,$row){ $value=$this->VarGet($name); $this->VarSet(array($name=>md5($value))); return false; } private function ParseNoHtml($name,$row){ $value=$this->VarGet($name); $this->VarSet(array($name=>strip_tags($value))); return false; } private function ParseHtmlDecode($name,$row){ $value=$this->VarGet($name); $value=str_replace("<br>","\r\n",$value); $this->VarSet(array($name=>htmlspecialchars(html_entity_decode($value,ENT_QUOTES)))); return false; } private function ParseNoInt($name,$row){ $value=$this->VarGet($name); if(preg_match("#[0-9]+#is",$value)) return true; return false; } private function ParseUserFunc($name,$row){ $value=$this->VarGet($name); $funcs=explode(",",$row['type_value']); $funcs=(array)$funcs; for($i=0,$c=count($funcs);$i<$c;$i++){ $value=$funcs[$i]($value); } $this->VarSet(array($name=>$value)); return false; } ########################################### # EOF ########################################### private function ErrorTpl($tplname,$vars=false){ $msg=self::$cnf['formvalidate_def_errors'][$tplname]; return $this->ErrorMsg($msg,$vars); } private function ErrorMsg($msg,$vars=false){ if($vars){ foreach((array)$vars as $key=>$val){ $msg=str_replace("{".$key."}",$val,$msg); } } return $msg; } } ?>
Koc он требует ещё 2-4 класса =) а так, оч просто PHP: <? $fv=new FormValidate(); $fv->SetType(array( "name"=>array("noempty","regexp[#(?:[\w\.\-]+)\@(?:[\w\.\-]+)\.(?:\w+)#is]"), "text"=>array( array("noempty","Заполните поле текст"), array("minlength[30]","Какого фига поле {name} короче 30 символов?"), "replace","escape","userfunc[strtoupper,urlencode]" ), )); if($err=$fv->CheckError()){ print_r($err); }else{ print "Всё ок"; } ?>
PHP: <?php $mail = filter_input(INPUT_POST, 'mail', FILTER_VALIDATE_EMAIL); if (!$mail) die('Введите верный e-mail'); else die('cool!'); vasek-----@h-------h.ru -> cool!
http://cogear.ru/user_guide/gears/form_elements/ валидация как в CI (оно и не мудрено, система на нем построена ) Генерация форм в принципе тоже прикольная. А я, дурак, для каждой формы шаблон делаю. Пойду напьюсь с горя.
PHP: <?php Request::AddConstraint('reglogin', ST_POST, new Constraint(CT_MUSTMATCH, USER_LOGIN_MUTCH, Language::GetText('M_LOGIN_MUTCH_ERROR'))); Request::AddConstraint('password', ST_POST, new Constraint(CT_MINLENGTH, MIN_USER_PSWD_LENGTH, Language::GetText('М_PASSWORD_MINLENGTH_ERROR'))); Request::AddConstraint('password', ST_POST, new Constraint(CT_MAXLENGTH, MAX_USER_PSWD_LENGTH, Language::GetText('М_PASSWORD_MAXLENGTH_ERROR'))); Request::AddConstraint('passwordagain', ST_POST, new Constraint(CT_EQUALTO, Request::GetPostVar('password'), Language::GetText('M_PASSWORD_AGAIN_ERROR'))); Request::AddConstraint('email', ST_POST, new Constraint(CT_MUSTMATCH, USER_EMAIL_MATCH, Language::GetText('M_EMAIL_MUTCH_ERROR'))); if (Request::TestConstraints() { ......
давно считается хорошим тоном проверять данные на стороне клиента, а потом конечно в скрипте. http://enigma.440hz.ru/ я вот так извращаюсь. =)
это такой фреймворк http://www.extjs.com/products/extjs/ http://www.extjs.com/deploy/dev/example ... types.html
Не то что б не нравится, в ней много букав, констант, оч много всего в верхнем регистре, для каждого правила свой объект (хотя не факт, что это минус). 440hz не говорил что не нравится, он просто сказал, дескать еще и на стороне клиента проверять нужно. зы: я закоммитил куски кода старые в свои "велосипедные библиотеки". Кому интересно - могу закоммитить туда же текущую версию