Уважемые посетители форума. Хотелось бы проконсультироваться с Вами по нескольким вопросам создания форм. Таким как: 0) Проверка данных. 1) Обработка данных(отправка, сохранение/изменение существующих данных и т.д.). 2) Возврат ошибок в случае неудачи. Дело в том что, с самого начала изучения PHP, обработка данных от пользователей была для меня проблемным местом. Почему-то мне никак не удается логично и аккуратно сделать обработку данных форм и вывод ошибок. Эти вещи почему-то превращаются в отвратительный фарш "все в одном файле лишь бы работало". Пример такого фарша*: PHP: <?php try{ $user = tUsers::getParam($uid); } catch(Exception $e){ headers('Location: /'.tConfig::getParam('adminLink').'/users/list/'); } $data = array(); if(!empty($_POST)){ //Если полей много присваиваем значения в цикле $data['login'] = (isset($_POST['login'])) ? $_POST['login'] : null; $data['email'] = (isset($_POST['email'])) ? $_POST['email'] : null; $errors = false; $errorHtml = array(); // -|| - ||-- || - ||- -|| - ||- $errorHtml['login'] = $errorHtml['email'] = null; // -|| - ||-- || - ||- -|| - ||- if(empty($data['login'])){ $errorHtml['login'] = 'Поле «логин» обязательно для заполнения.'; $errors = true; } if(empty($data['email'])){ $errors = true; $errorHtml['email'] = 'Поле «E-mail» обязательно для заполнения.'; } elseif(!preg_match('^[a-z0-9\._-]+@[a-z0-9\._-]+\.[a-z]{2,4}\$', $data['email'])){ $errors = true; $errorHtml['email'] = 'Неверный E-mail'; } } else{ $data['login'] = $user->getParam('login'); $data['email'] = $user->getParam('email'); } if(empty($_POST) || $errors){ if(!empty($errorHTML)){ foreach($errorHtml as $key=>$value){ $errorHtml[$key] = '<li class="error">'.$value.'</li>'; } } // -|| - ||-- || - ||- -|| - ||- return ' <ul> <li>Логин</li> <li><input type="text" name="login" value="'.$data['login'].'" /></li> '.$errorHtml['login'].' <li>E-mail</li> <li><input type="text" name="email" value="'.$data['email'].'" /></li> '.$errorHtml['email'].' <li><button type="submit">Сохранить изменения</button></li> </ul> '; } else{ $user->setParam('login', $login); $user->setParam('email', $email); $user->save(); return 'Изменения сохранены.'; } ?> Как Вы понимаете, при наличии полей 10, среди которых найдется пара селектов, несколько чекбоксов и т.д. и т.п. код становиться: 0) Трудно читаемым - с первого взгляда непонятно где у нас собственно действие происходит, где такая-то обработка и т.д. и т.п. 1) Трудно расширяемым - добавление еще одного поля, изменение какой-нибудь проверки легко может вызвать коллапс . 2) Легко забываемым - через месяц приходится потратить много времени что бы вспомнить, что делает эта вот проверка и зачем. Через 1.5 года(быстро до меня доходит мне это надоело. Я начал думать над решением "проблемы F". Наверное гугл у меня плохо работает поэтому ничего, что бы меня устроило я не нашел. В теории я предполагал что-то такое: Все данные по форме вынесены в отдельный файл. /data/forms/form-name.php Этот файл возвращает ассоциативный массив который может содержать: 0) 'inputDataType' - где искать данные формы (post/get/partUrl). 1) 'handler' - какому обработчику передавать данные формы после проверки (tMail::sendFromAdmin). 2) 'outputDataType' - что возвращаем (html/xml/JSON). 3) Список полей для которых мы указываем: а) 'type' - тип (text/hidden/password/...) б) 'loadFrom' - откуда брать начальное значение ($user->getParam('login')). в) 'check' - список проверок(см. ниже). г) 'errorMsg' - тексты для различных ошибок. ('не введен пароль' || tMultilang::getMsg('empty_password', 'system')); список проверок - таких как: 0) 'requied' - поле обязательно для заполнения 1) 'max-size' - максимальное значение 2) 'min-size' - минимальное значение 3) 'abc' - только буквы 4) 'digit' - только цифры 5) 'not' - все кроме знаков здесь перечисленных ('"/^&) 6) 'rus' - при проверке букв русские тоже канают 7) 'url' - похож на адрес 8) 'mail' - похож на мыло ........................... N) 'result' - если из (tUsers::userNotExist) вернулось true то все хорош N+1) 'result-1' - аналогично N) Ну и предполагается наличие 2-х классов: tForms. 0) Смотрит что за форма/формы Назначены на данную страницу. 1) Подгружает их или выдает formsGenException extends Exception. 2) По запросу tForms::drow('formName'); вызовет self::forms['formName']->drow(); tForm 0) Генрит html для формы (с сообщениями об ошибках или же без таковых). 1) Проверяет на ошибки. 2) В случае, если все хорошо вызывает метод указанный в handler. Но мне кажется что подобная вещь: 0) Будет тормозить. 1) Как-то монстрообразна, слишком много нужно иметь форм на проекте что бы ее "окупить". 2) Очень смахивает на велосипед с 4-мя колесами, 2-мя рамами и одним седлом. Вопросы к коллегам по цеху: 0) Как обрабатываете формы Вы? 1) Как думаете подобная вещь будет очень сильно тормозить? 2) Быть может генерацию html-a для форм спихнуть на клиента? 3) Я придумал себе проблему и теперь мучаюсь пытаясь ее решить? 4) К стыду своем очень мало разбирался с Симфони, Зенд фреймворк и кэйк не ставил вовсе. Вы с ними работаете? Как это реализовано там? 5) Как Вы думаете, как будут выглядеть для такого чуда шаблоны(шаблоны это тоже у меня больной вопрос ? 6) Если сама идея кажется Вам не бредовый, что бы Вы предложили добавить к этой штуке? * - Здесь и далее код, никакой смысловой нагрузки не несет, набран для наглядности, на работоспособность не тестировался. P.S. жена таки вытащила меня из-за компьютера , позже буду онлайн и обязательно всем на все отвечу.
http://dklab.ru/lib/HTML_FormPersister/ http://pear.php.net/manual/en/package.h ... amples.php Нормально. Форма сама себя валидирует.
Например, так: PHP: <?php print $form->begin()?> <p> Логин: <?php print $form->login?><br /> Пароль: <?php print $form->password?> </p> <p> <?php print $form->submit?> </p> <?php print $form->end()?>
флоппик, спасибо за ссылки, обязательно ознакомлюсь. По поводу фреймворков - в них всех форма сама себя валидирует или только в "избранных"? Нормально => стоит посмотреть как реализованно? Sergey89, у меня похожим образом реализованы собственно шаблоны страниц: PHP: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title><?php echo tPages::getTitle(); ?></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta content="<?php echo tPages::getMeta(); ?>" name="keywords" /> <script type="text/javascript" src="/js/jquery.js"></script> <?php echo tPages::getJs(); ?> <?php echo tPages::getCss(); ?> </head> <body> <div id="body"> <div id="header"> <div id="login"> <p id="login-message"> <?php echo tPages::getContent('login'); ?> <br /> ........................................... Но я когда заходил на страницу Smarty краем глаза видел, что там еще куча каких-то бонусов, типа какие-то шаблонные циклы ифы и прочее. Не пробовал так делать оно вообще нужно?
В симфонии. В остальных не знаю. Мне вообще в этом плане нравятся newforms в django... все хочу аналог в php реализовать.
Использую try {} catch () {}, форма валидирует сама себя. Ошибка - Exception. Мне нравиться, код стройный. Конечно приходится по старинке все проверки писать, но от пары if (empty($_POST['field'])) { throw new Exception(_("Message")); } не помру