Добрый день. Есть несколько форм. И классы, которые из обрабатывают. В этих классах есть метод checkForms, который проверяет введенные данные (длина, допустимые символы, нет ли такого логина/мыла в БД). Если происходят ошибки, то мы получаем поле $errors['поле_формы'] = 'Текст ошибки для этого поля'; Далее это дело уже применяем. Так вот, как это дело можно оптимизировать? Ну можно сделать что-то для проверки мин, макс длины, символы, но еще придется проверять, есть ли пользователь с таким логином уже, есть ли запрашиваемый атрибут для удаления в базе и тд. Если есть какие-то идеи по этому поводу - интересно их услышать. UPD: последняя версия и пример расширения своими ф-циями - проверками предпоследняя версия и пример проверки на реальной форме
а еще нашел такую штуку http://www.html-form-guide.com/php-form ... ation.html буду расширять ее для своих потребностей
чего-то не понравился мне тот валидатор. Буду свой писать или использовать этот http://codeigniter.com/user_guide/libra ... ation.html
а в чем собственно оптимизацию увидеть хотели? в оптимизации кода или алгоритма(последовательности процессов)? я так понимаю вы просто выбрали из имеющихся скриптов более подходящий....
Оптимизация в том, что бы не писать каждый раз в классе что-то*Manage PHP: <?php private function checkForm() { $title = trim($_POST['title']); if(!$title) $this->errors['title'] = 'поле не заполнено'; elseif(!$this->id) { if($this->db->numRows('SELECT id FROM ?t WHERE title=?s', 'manufacturer', $title)) $this->errors['title'] = 'Такой производитель уже присутствует'; } $this->values['title'] = $title; } private function checkForm() { $reWriteUrl = trim($_POST['reWriteUrl']); if($reWriteUrl{0} != '/') $this->errors['reWriteUrl'] = 'Uri alias must begin with "/"'; elseif(!strlen($reWriteUrl = substr($reWriteUrl, 1))) $this->errors['reWriteUrl'] = 'Uri alias is empty'; elseif($this->db->numRows( 'SELECT url FROM ?t WHERE url=?s AND ?c NOT IN(SELECT url_rewrite FROM ?t WHERE ?c=?i)', 'rewrites', $reWriteUrl, array('rewrites', 'id'), 'goods', array('goods', 'id'), $this->id )) $this->errors['reWriteUrl'] = 'The page with the same Uri alias already exists, please enter another Uri alias.'; } ?> а сделать это удобнее и красивее. Пока я ничего не выбрал. Я все еще определеюсь с тем, что именно хочу, и как это должно выглядеть.
По-бырику накидал такое. Не проверял еще и не отлаживал. Не знаю вот, как ошибки обрабатывать - возвращать коды ошибок или сообщения? код помещен в репозиторий
Я бы сообщения сразу выдавал. Коды ошибок хорошо, но придётся запариться с переводом кода ошибки в сообщение. Ну и предусмотрел бы возможность установить свои сообщения для любого правила.
+ еще хочу сделать возможность расширять класс, делать пользовательские ф-ции (на основе класса работы с имеджесами - проверку загружаемых файлов), проверку дублирующихся пользователей и тд. Можно в принципе попробовать сразу выдавать сообщения. Нужно подумать, как их устанавливать. Такой класс имеет право на существование? Не сильно будет тормозить? Посоветуйте по поводу куска, который закомментирован ###. Если к примеру мы вообще не объявили значение какого-то поля (ну какой-то бот отправлял и этот бот не знал, что у меня есть поле hash). Бот посылает запрос, а $_POST['hash'] не объявлен, нет такого ключа. Тогда стоит присвоить ошибку EMPTY и перейти к следующей итерации? Или забить на проверку в этом месте, и подождать когда эта ошибка всплывет или не всплывет при проверке в теле switch?
как можно компактнее записать че-то типа: PHP: <? $form['name'] = array( array('trim'), array('nonEmpty', 'Логин не может быть пустым'), array('minLength[3]'), array('maxLength[10]', 'Имя слишком длинное') ); $form['mail'] = array(array('mail', 'Некорректный адрес мыла')); $form['pass'] = array( array('trim'), array('minLength[6]'), array('maxLength[8]', 'Не длиннее 8 символов'), array('md5') ); ? json'ом не получится. Сообщения есть не для каждых ошибок
Полагаю код: Код (Text): if($i = strrpos($rule, '[')) { $param = substr($rule, $i+1, -1); $rule = substr($rule, 0, $i); } Будет выглядеть понятней и удобней так: Код (Text): list($rule, $param) = explode("[", $rule); $param = explode("]", $param)[0]; А так класс довольно интересный. А что касается торможений, то сомневаюсь, поскольку не такие уж и большие формы на обработку пойдут, к тому же количество правил небольшое.[/quote]
Очень хотел задействовать чем-то конструктор. Пожтому: По обновлению класса - теперь можно задавать свои сообщения для ошибок. Как в конструкторе так и через отдельный метод. Если сообщение не установлено, то будет возвращен код ошибки. + теперь при нахождении в поле какой-либо ошибки остальные проверки по этому полю не проводятся. Возможно это выведу опцией. если честно, то не сильно понравился. Я свой делаю по образу CodeInteger, но исходник не смотрел даже, только мануал читал. Есть спорный вопрос на тему requried. Отдельно его как-то задавать или просто в списке правил? Что нам даст отдельное задавание: поле как бы необязательно для заполнения (мыло, к примеру). Но если уж ты решил его заполнить, будь добр вводить корректный адрес. Сейчас так нельзя. А это нужная штука. Возможно сделаю что-то типа array('trim', 'nonEmpty', 'mail'), где по проверке на наличие/осутствие nonEmpty будет устанавливаться флаг. Есть флаг и данные введены - проверяем валидность мыла, нет флага и данных - не проверяем. нужно подумать об этом. Я первоначально хотел так делать, но: потом все равно к массиву приводить нужно. Регулярка или explode, а это время и ресурсы. Лучше сразу массивом задавать, но много писанины лишней. array(array()) а разве уже можно писать function()[0]? я думал, что только с 5.3 версии. Ну и по удобству если честно не уверен. 2 раза explode или 3 операции со строками. спасибо, старался. Нужно еще расширяемость продумать. upd: 1) как можно оптимизировать рутинные isset (сообщение) : сообщение ? код ошибки? 2) не слишком ли много используется ссылок? 3) вводить ли проверки на корректность данных типа "length[]" или "length[ффф]" - некорректно. Или писатель не дурак, сам отловит такие вещи? 4) может разбавить все это исключениями? При наличии хоть одной ошибки выбрасывать исключение. Или не стоит?
Koc Класс понравился Все просто и логично. Только объясни, плз, для чего нужна customFunction, ежели она ничего не делает? PHP: protected function customFunction($rule, $param, &$value, &$error){}