Оцените идеи валидации данных поступающих от пользователя.

crocodile2u

http://vbolshov.org.ru
Не совсем в тему:
Есть хорошая (на мой взгляд) штука - XForms. Жду ее (более полной) реализации от Mozilla, чтобы, вполне возможно, начать использовать. Когда пользователь присылает данные в XML - этот XML легко поддается валидации с помощью, допустим, XMLSchema. Более того, на стороне клиента данные тоже проверяются, с помощью той же XMLSchema.

ЗЫ: для HTML-форм использую HTML_QuickForm.
 

Demetrius

Новичок
zarus
maxlength официально еще не одобрена w3.org
Зато её одобрил мой класс и использует этот же самый параметр для проверки максимальной длины строки уже на серваке. ;-)
То же самое я делаю у себя, но без классов.
Прошу прощения за оффтоп, но раз уж возник вопрос... :) Лично я пришёл к PHP от С++, поэтому везде, где надо организовать функциональность для какой-либо программной "сущности", предпочитаю оформить эту "сущность" в виде класса. Если же это просто функция, например есть у меня такая - для х-форматной конвертации строковых дат, то это и есть отдельная функция. Хотя, в последнее время (вероятно, это сезонное :)) даже для набора функций по одной тематике пишу класс и обращаюсь через ::. Погряз в ООП, что называется. :) Но для структурирования кода удобно.
Кстати, если обработчик форм является классом, то кто мешает прикрутить ему конфигурационный флажок для указания, надо ли выводить javascript или нет? А фича пригодится.

-~{}~ 27.12.05 12:04:

crocodile2u
чтобы, вполне возможно, начать использовать
Прекрасное далёко, не будь ко мне жестоко... :)
 

tf

крылья рулят
Demetrius >>// рисуем форму и сообщения об ошибках (автоматически)
ну незнаю я против автоматизма в формах
мне так больше нравится +удобство и расшираяемость
PHP:
$item_form=new handler_form($this_url,'item_form');

$item_form->add_object('section_id',array('type'=>'select','null'=>1,'int'=>1));
$item_form->add_element('section_id','all','Все');
$item_form->add_element('section_id','null','ничего');
$item_form->select_element('section_id','nill');

$item_form->add_object('type',array('type'=>'radio'));
$item_form->add_element('type','all','Прайс-лист общий');
$item_form->add_element('type','privat','Прайс-лист для личного кабинета');

$item_form->add_object('contact',array('type'=>'text','int'=>1,'null'=>1,'specialchars'=>'all'));
$item_form->add_object('description',array('type'=>'textarea','float'=>1));

$item_form->add_object('visible',array('type'=>'checkbox'));
PHP:
<?=$item_form->html_start_form() ?>
<?=$item_form->html_output_data('section_id','style="width:50%"') ?>
<?=$item_form->html_output_data(array('type','all')) ?>
<?=$item_form->html_javascript_not_empty_variable(array('id_eroor'=>'error1')) ?>
- правдо оно пока вешается на всю форму - но это я переработаю в свобод время
<?=$item_form->html_end_form() ?>
zarus>>-: в этом случае размер странички вырастет (из-за вставок javascript), начнутся "потери" на сжатие и передачу...
не такие уж большие минусу + переваливают. к томуже если сервер не будет лишние разы загружаться обработкой неверно введенных данных потери на сжатие и передачу можно не считать

crocodile2u когда буду использовать XML обязательно посмотрю раз ее многие расхваливают. но пока на html XMLSchema использовать трудновато)
 

crocodile2u

http://vbolshov.org.ru
Насчет "размер странички вырастет из-за javascript":

Генерацию Javascript можно делать отдельно и на странице с формой подключать что-то вроде
PHP:
<script language="javascript" type="text/javascript" src="my_form_js.php"></script>
Тогда Javascript будет кэшироваться клиентом. Надо только продумать механизм работы при возможных изменениях ( если мы изменили форму, Javascript тоже должен измениться - соответственно, нужно отправить нужные заголовки ). Такой подход, несомненно, сложнее. Но и польза от него, имхо, есть.
 

tf

крылья рулят
crocodile2u не знаю как у тебя но если javascript генерится динамически зачем разделять саму форму от javascript а это приведет к ненужной трудности изменения самой формы когда данным и ее javascript характеристики будут храит в другом месте - только лишний геморой модернизаци
 

crocodile2u

http://vbolshov.org.ru
tf
К геморрою это приведет, только если разработчик это спроектирует неоптимально.

Пример реализации с использованием HTML_QuickForm:

1. Код создания формы храним в отдельном файле "my_form_builder.inc.php".
2. Этот файл подключается при показе формы пользователю.
3. Этот же файл подключается в my_form_js.php
4. При показе формы вместо всего ее жабаскрипта генерим <script src="my_form_js.php"></script>
5. В my_form_js.php генерим только javascript, благо QuickForm это позволяет.

Вуаля.
ЗЫ: filemtime("my_form_builder.inc.php") выдаем как Last-Modified при генерации жабаскрипта.
 

tf

крылья рулят
crocodile2u хм. ну тебе с HTML_QuickForm виднее как делать
но нам скомненько подходит
1. обозначили форму
2. где надо напсиал
PHP:
<?=$item_form->html_javascript_not_empty_variable(array('id_eroor'=>'error1')) ?>
а остальные дейтсивя ради мал кусочка просто лень делать
PHP:
<script type="text/javascript" language="javascript"><!--
    function form_order()
    {  if(!document.getElementById('item_form_data[region]').value || !document.getElementById('item_form_data[fio]').value || !document.getElementById('item_form_data[org_name]').value || !document.getElementById('item_form_data[phone]').value)
       {
         if(!document.getElementById('item_form_data[region]').value) document.getElementById('item_form_data[region]').style.backgroundColor='#FFE3BB';
   ....
         document.getElementById('error1').style.display='block'
         alert('Заполните обязательные поля!');
         return false;
       }
       return true;
    } //--></script>
 

zarus

Хитрожопый макак
А не проще ли прерываться на первом же незаполненном поле и переносить на него фокус, чтобы пользователь сразу его заполнил?
 

tf

крылья рулят
zarus как скажеш в след версии будет и дополнит фокус.
только знаеш пока смотрю в другую сторону как такую[www.poolgalaxy.ru/orderl] форму обработаь с мин моим участием. насколько там все жестко и коряво можно увидеть по названиям переменных
crocodile2u как HTML_QuickForm может решить такую сложно подчиненую форму. при кот результат формируется в результате выбранных или невыбранных переменных
 

crocodile2u

http://vbolshov.org.ru
"сложно подчиненные" формы с помощью HTML_QuickForm можно валидировать собственными функциями-плагинами. Как насчет проверки на клиенте в этом случае - я не в курсе. Но, имхо, можно просто дать пользователю указания, как заполнять. И проверять "сложные зависимые" данные на сервере.

(Кстати, в XForms такие вещи решены весьма красиво...)
 
Сверху