Перейти к содержимому

Фото
- - - - -

Валидатор форм (PHP)


  • Вы не можете создать новую тему
  • Please log in to reply
41 ответов в этой теме

#1 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 02 июля 2007 - 11:45

Выкладываю сырую наработку по валидации форм на PHP. Комментариев мало, надо будет дописать их.

Как это дело работает на примере простой формы:
include 'form_validator/FormValidator.class.php';

$FormValidator = new FormValidator( 'POST' );

// Имя
$FormValidator->AddElement( 'name' );
$FormValidator->AddRule( 'name', 'Поле "Nimi" должно быть заполнено!', 'required' );
$FormValidator->ApplyFilter( 'name', 'trim' ); // Полученное значение будет пропущено через ф-цию trim

// Фамилия
$FormValidator->AddElement( 'lastname' );
$FormValidator->AddRule( 'lastname', 'Поле "Perekonnanimi" должно быть заполнено!', 'required' );
$FormValidator->ApplyFilter( 'lastname', 'trim' );

// Телефон
$FormValidator->AddElement( 'phone' );
$FormValidator->AddRule( 'phone', 'Поле "Mobiil" должно быть заполнено!', 'required' );
$FormValidator->ApplyFilter( 'phone', 'trim' );

// E-mail
$FormValidator->AddElement( 'email' );
$FormValidator->AddRule( 'email', 'Поле "E-mail" должно быть заполнено!', 'required' );
$FormValidator->AddRule( 'email', 'Неверный формат E-mail адреса!', 'email' );
$FormValidator->ApplyFilter( 'email', 'trim' );

// Комментарий
$FormValidator->AddElement( 'comment' );
$FormValidator->ApplyFilter( 'comment', 'trim' );

// Если форма была отправлена
if ( $FormValidator->HasPosted() )
{
  // Если форма не содержала ошибок
  if ( $FormValidator->Validate() )
  {
  }
  else
  {
	// Вывести ошибки
	//print_r( $FormValidator->messages );
  }
}

Пример самой формы
<form method="post">
<?php if ( ! $FormValidator->Validated() ) : ?>
<h1>Ошибки</h1>
<?php
foreach ( $FormValidator->messages as $element => $messages )
{
  foreach ( $messages as $message )
  {
	echo '<font color="#FF5C1E">*' . $message . '</font><br>';
  }
}
?>
<?php endif; ?>

<!-- Если была ошибка в поле, оно подсветится другим стилем. 
Название метода выбрано не лучшим образом :( ShowVar -->

<span class="<?=$FormValidator->ShowVar( 'name', 'style75', 'style76' )?>">Nimi:</span>
<input name="name" value="<?=$FormValidator->Show('name')?>" type="text">

<!-- аналогично и для остальных полей формы -->

<input type="submit">
</form>

Я использовал эту наработку пока что в одном проекте пару месяцев назад. Делалось на скорую руку, по этому она довольно сырая (багов нет, но может некоторые вещи не до конца продуманы и названия методов не везде означают то, как они называются). Хочется доработать, но всё руки не доходят, нет подходящих заказов ;)

Сделано на PHP4, чтобы работало везде, так я пишу только на PHP5.

Прикрепленные файлы


Сообщение изменено: Setor (02 июля 2007 - 11:42 )

  • 0

#2 Киря Веб

Киря Веб
  • Пользователь
  • 140 сообщений
  • Откуда:Tallinn, Estonia

Отправлено 02 июля 2007 - 13:35

Использование моего класса:
	
	Error_Reporting(E_ALL & ~E_NOTICE);
	
	if($_POST){
		
		require("validator_class.php");  // Поключаем класс
		
		$FV = new formValidator;
		
		$FV -> dataArray = $_POST['myform'];  // Передаём ему массив нужной формы
		
		$FV -> add_SC("name,password"); // Указываем поля для обработки htmlspecialchars можно просто add_SC("all")
		$FV -> add_AS("name,email"); // Указываем поля для обработки addslashes можно просто add_AS("all")
		
		$FV -> isEqually("password,password2,name"); // Указываем поля для сравнения между собой(all тут низзя)
		$FV -> isEmail("password,password2"); // Указываем поля для проверки на eMail можно "all".
		$FV -> isNumber("all"); // Указываем поля для проверки на значение номера
		
		$FV -> basicCheck("name,surname,password"); // Указываем поля для базовой проверки(htmlspecialchars - указанные выше и addslashes - указанные выше), все поля содержащие "email" в имени будут проверены на email
		
		
		echo "<pre>".print_r($FV -> get(), true)."</pre>"; // Выводим обработанный массив
		echo "<pre>".print_r($FV -> get('errors'), true)."</pre>"; // Выводим ошибки заполнения
		
	}
	


http://www.styleforyou.net/4/ - смотрим
http://www.styleforyou.net/4/4.rar - качаем
  • 0

#3 V^v

V^v
  • Пользователь
  • 316 сообщений

Отправлено 02 июля 2007 - 14:00

а в чем смысл всего этого и собственно сложность ? разве это не написано другими уже сотни раз ?
  • 0
int main(void)

#4 Киря Веб

Киря Веб
  • Пользователь
  • 140 сообщений
  • Откуда:Tallinn, Estonia

Отправлено 02 июля 2007 - 14:10

V^v, Отстань. У нас свои пути развития. :)

Сообщение изменено: Киря Веб (02 июля 2007 - 14:13 )

  • 0

#5 Vladson

Vladson

    XTGamers.com

  • Постоялец
  • 1 921 сообщений
  • Откуда:Эстония, Таллинн

Отправлено 02 июля 2007 - 14:46

разве это не написано другими уже сотни раз ?

Боюсь тысячи...

Далее по теме...

Человек использующий чужой код в своих проектах попробует много и будет использовать то что лучше, а новичок (или просто человек который привык использовать своё) всё равно напишет своё...

По этому давайте не будем чушь пороть а реально обсуждать достоинства/недостатки конкретно этого кода, а также приводить реальные примеры аналогов которые лучше этого...

Иначе будут одни голословные утверждения типа "баян" или "аффтар жжот" и.т.д...
  • 0
Один Владсон может за...ать всех, кроме себя самого. Два Владсона могли бы за...ать абсолютно кого угодно, но Владсон единственный и неповторимый. ©Vladson

Вы либо способны перелопатить тонны информации и отсеять лишнее, либо программистом не будете. ©Psih

Не вазелин, а бизнес-гель ©Avagraen

#6 V^v

V^v
  • Пользователь
  • 316 сообщений

Отправлено 02 июля 2007 - 16:04

меня неправильно поняли, я не хотел сказать ничего плохого, просто интересно в чем сложность кода и в чем цель, чего люди хотят добиться. еффективности? красоты кода ? удобного использования? я в пхп плохо разбираюсь, поэтому спрашиваю.
  • 0
int main(void)

#7 Vladson

Vladson

    XTGamers.com

  • Постоялец
  • 1 921 сообщений
  • Откуда:Эстония, Таллинн

Отправлено 02 июля 2007 - 16:08

просто интересно в чем сложность кода и в чем цель

Не знаю зачем написан этот но одно из двух
1 - хотелось изобрести велосипед (бывает такое)
2 - хотелось сделать что-то что подходит для его проекта лучше чем бесплатные аналоги
  • 0
Один Владсон может за...ать всех, кроме себя самого. Два Владсона могли бы за...ать абсолютно кого угодно, но Владсон единственный и неповторимый. ©Vladson

Вы либо способны перелопатить тонны информации и отсеять лишнее, либо программистом не будете. ©Psih

Не вазелин, а бизнес-гель ©Avagraen

#8 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 02 июля 2007 - 19:53

Киря Веб, попроще ;) Я тоже хотел максимально упростить свой класс, но когда я говорю максимально упростить, это означает, что он должен превратиться в 2 класса и кол-во строк увеличится в полтора раза.

Изначально он был тоже прост, но по ходу дела я понял, что мне нужны различные rules и filters. Самые необходимые я встроил в сам класс. Например, можно добавить правило, которое проверит, есть ли такой пользователь на сайте. Я сделал нечто вроде цепочки фильтров (Filter Chain), но стоило бы конечно реализовать цепочку фильтров более грамотно, используя паттерн Intercepting Filter. Но для обыкновенной формы это может показаться лишним.

Далее возникла такая проблема, надо было подсветить блоки с неверно введённой информацией, я создал метод ShowVar, который в случае, если допустим, информация в форме была введена неверно подсветилась бы к примеру, красным цветом.

а в чем смысл всего этого и собственно сложность ? разве это не написано другими уже сотни раз ?

Написано, но просто хочется обсудить. Ты можешь представить самый лучший на твой взгляд из этой сотни или тысячи скриптов...

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

Основная цель - упростить себе жизнь. Обычно обработка формы очень нудная задача, т.к. это куча однотипных условий и проверок. Надо проверить, было ли отправлено поле, нужного ли типа переданная информация, если надо снова отобразить эту форму с заполненными данными, надо заэкранировать спецсимволы и т.д. и т.п. И вообще, эта тема всё же больше подходит для любителей PHP :)

В том году я реализовывал корзину для заказа окон http://www.odavadaknad.ee/rus/ceni.php вот там проблема обработки форм стояла довольно остро.

Я создам второй класс FormValidatorItem, который будет непосредственно работать с каждым элементом формы. Пример использования.

$FormValidator = new FormValidator( 'POST' );

// Имя
$FormElement = $FormValidator->AddElement( 'name', 'default_field_value' );

$FormElement->AddRule( 'name', 'Поле "Nimi" должно быть заполнено!', 'required' );
$FormElement->ApplyFilter( 'name', 'trim' ); // Полученное значение будет пропущено через ф-цию trim
Далее можно ввести типы форм, инпуты, селекты, радио.

В конечном итоге мне кажется, получится тот же Pear Quick Form :)
  • 0

#9 V^v

V^v
  • Пользователь
  • 316 сообщений

Отправлено 02 июля 2007 - 19:53

$pattern = '/^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\
'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((
25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]
?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])
|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][
0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9
\-])+\.)+[A-Za-z\-]+))$/'

браво :D хорошо остальной код не такой же =)
  • 0
int main(void)

#10 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 02 июля 2007 - 19:58

Не знаю зачем написан этот но одно из двух
1 - хотелось изобрести велосипед (бывает такое)
2 - хотелось сделать что-то что подходит для его проекта лучше чем бесплатные аналоги

Велосипед - это свято. Почему не устраивают аналоги:
1) Нужно найти время на то, чтобы всех их досконально изучить
2) Стиль кодирования в них будет отличаться от моего, что будет меня сильно раздражать
3) При построении какой-либо сложной формы (простые формы мы строим редко :)) возможно, скрипт не будет соответствовать задаче, придётся в него лезть.
4) Т.к. большинство скриптов написаны криво, изменить их поведение будет сложнее, чем написать аналог
5) Зачастую аналоги либо слишком узкофункциональны, либо пытаются охватить всевозможные варианты в ущерб производительности и простоты использования. Что Pear QF, что Smarty - хорошие вещи, но слишком жирные...
6) Родное всегда приятно :)

V^v, эта регулярка была найдена на просторах интернета, говорилось, что она очень умная, но на деле оказалось не так :)
  • 0

#11 Vladson

Vladson

    XTGamers.com

  • Постоялец
  • 1 921 сообщений
  • Откуда:Эстония, Таллинн

Отправлено 02 июля 2007 - 20:31

Велосипед - это свято.

А я что спорю что ли ? (ты пост накатал как будто я тебя обвинил в измене родине)

Я понимаю что каждому своё, просто кому-то одно а кому-то другое...
  • 0
Один Владсон может за...ать всех, кроме себя самого. Два Владсона могли бы за...ать абсолютно кого угодно, но Владсон единственный и неповторимый. ©Vladson

Вы либо способны перелопатить тонны информации и отсеять лишнее, либо программистом не будете. ©Psih

Не вазелин, а бизнес-гель ©Avagraen

#12 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 02 июля 2007 - 23:16

Vladson, ты меня неправильно понял, я просто дополнил твой ответ ;) Ничего личного)

Сообщение изменено: Setor (02 июля 2007 - 23:16 )

  • 0

#13 Киря Веб

Киря Веб
  • Пользователь
  • 140 сообщений
  • Откуда:Tallinn, Estonia

Отправлено 03 июля 2007 - 21:35

Setor, мдеее - да - твой вариант более гибкий. даж незнаю, как можно прощще сделать - тут только код переписывать и оптимизировать :)
  • 0

#14 ParadoxL

ParadoxL
  • Постоялец
  • 5 023 сообщений
  • Откуда:Edinburg

Отправлено 05 июля 2007 - 02:27

Люди может было бы логично перенести критерии проверки в какой-нить XML? И допустим там же тексты ошибок ... то есть при получении реквеста ... от клиента ... все данные посылаются через какой-нить лейр (писаный на вашем языке PHP) ... в который как фильтр вставлется имя формы и XML в котором описаны критерии валидации ... возвращется вектор резуальтатов (может быть что вам угодно по модели вашей системы) ... если вектор пустой значит всё пучком иначе формирование ответа с пометкой о неоходимости заполнения или исправления правописания (тут может быть что угодно ... вплоть до ответа что такого объекта нет ... после поиска ... просто в XML как фалидатор будет описан объявлен какой-нить класс который запрашивает например у базы или по SOAP /XML-RPC запрос на то или иное поле (или форму в целом, если валидатор инородный) ... вледвии чего надо будет тока заполнять и изменять XMLы ... чтобы тестировать формы или наборы форм ... просто и легко!

При чём можно доработать шаблоны этими вставками (то есть какими либо мануальными тегами) ... которые при обработке будут анализироваться и блоки в шаблоне будут заменяться например блоками проверки на JS или еще чем либо со стороны клиента ... а остальные будут формироваться в соответвии с необходимыми вам форматами при проверке на стороне сервеного лейра описаного выше ...

ЗЫ! Я не силен в PHP в плане познаний разнообразных скриптовых движков ... но такого я еще не наблыдал ... а ведь пободная технология используются во многих развитых язках при разработке Web лейеров.

Один из вариантов придумать некую подобию JSP или ASP тэгов ... что в разы упростит и ускорит весь процесс разработки.
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#15 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 05 июля 2007 - 02:57

CyBurglar, осталось теперь переварить всё вышесказанное... Решение интересное, но хотелось бы конечно, подробней с ним ознакомиться, т.к. я не раз уже убеждался в том, что с виду идеальные системы доставляли в ходе разработки множество хлопот. Чтобы найти оптимальный вариант, нужно строить формы и после делать выводы. Я кстати, встречал похожее на описанное тобой решение в некоторых крупных PHP фреймворках, например, в Symfony и оно мне показалось не очень гибким. Там вместо XML используется Yaml. Я кстати, стараюсь не использовать XML, т.к. его парсинг - довольно дорогое удовольствие в ПХП. Да и любые "пользовательские" форматы во всех системах пытаются как-то кешировать.

Я в своём разрабатываемом фреймворке пока что планирую использовать такую схему: контроллер формы, шаблон формы, и правила валидации. Надо будет на досуге всё это дело переварить и прикинуть как оно будет на практике работать.
  • 0

#16 zedirtybastard

zedirtybastard
  • Пользователь
  • 499 сообщений

Отправлено 05 июля 2007 - 10:01

Посмотри как в ASP.NET реализованы валидаторы, может сможешь почерпнуть кое-что оттуда
  • 0

#17 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 05 июля 2007 - 16:15

zedirtybastard, посмотрел, не впечатлило.

Ничего нового для себя не открыл :)

Сегодня народ в основном черпает идеи из Ruby on Rails, попробую там порыться, может чего и найду интересного.
  • 0

#18 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 05 июля 2007 - 16:30

P.S. никогда не интересовался Rails, но почитав его сводный обзор оказывается, я неплохо на теоретическом уровне знаком с его архитектурой, т.к. все самые интересные идеи, что я собрал с различных PHP фреймворков, похоже, изначально были реализованы именно в рельсах)
  • 0

#19 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 06 декабря 2007 - 21:56

Народ, может кто знает какие-нить желательно ОО валидаторы форм помощнее? Перерыл гугл, как-то не шибко популярна эта тема. В каждом FW используются свои валидаторы.

Мой валидатор всётаки слишком корявый :)

Сейчас пишу новый валидатор, в котором каждая форма будет отдельным объектом валидатора и часть ф-ций валидатора будет реализовываться именно в этих подклассах. Задачи таковы, что надо делать запросы к другим объектам, списки параметров у всех методов свои и в итоге старый валидатор превратился в костыль. Теперь думаю, как бы исключить повторение кода, если в разных модулях системы придётся редактировать формы с одинаковыми полями. Яркий пример тому - какая нить админка с большой кучей всяких форм.
  • 0

#20 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 06 декабря 2007 - 22:06

Причём, формы динамические. Поставишь где-нить галку, вылезет ещё несколько полей. И надо учитывать зависимости, если где-нить галка стоит, надо обработать одни поля, не стоит - не надо. Если где-то не в ведено значение, значит не надо обрабатывать связанные поля и т.п. Возможно применение AJAX'а...

Тут конечно, лучший валидатор - это сам PHP, как и в сложных шаблонах ;) Просто может в каких-то других языках это реализовано, хотелось бы посмотреть, украсть идей.
  • 0

#21 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 07 декабря 2007 - 14:11

А оно надо, спрашивается ? :) Не очень понятна цель этого валидатора )
  • 0

#22 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 07 декабря 2007 - 14:23

А оно надо, спрашивается ? :) Не очень понятна цель этого валидатора )

Оно-то надо, но гибкости особо не придашь :( Моя основная задумка - совместить генерацию форм в шаблонизаторе и управление формами в отдельном компоненте, который так же будет отвечать и за валидацию данных. Основная суть заключается в том, чтобы упростить работу с формами и пусть для этого потребуется 10 разных классов, главное - человеческое время. Но пока я понимаю одно, чем сложнее логика, тем нереальней вся эта задумка. Возможный вариант решения проблема - валидация сложных участков кода "вручную" на месте инициализации формы и сообщать валидатору о результате проверки...
  • 0

#23 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 07 декабря 2007 - 15:39

Setor, Человеческое время помоему тут и страдает больше всего)
  • 0

#24 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 07 декабря 2007 - 16:17

Setor, Человеческое время помоему тут и страдает больше всего)

А вот не всегда. Лучше потратить лишнее время на разработку один раз и использовать эту разработку потом, чем каждый раз городить огород. Так что первый случай выигрывает у второго всегда, если использование готовой наработки не слишком сложное. Просто формы бывают разные и задачи всегда разные, может случиться так, что в погоне за универсальностью мы придём к тому, что в итоге ни одна форма толком не будет работать с нашим универсальным валидатором)

Сообщение изменено: Setor (07 декабря 2007 - 16:17 )

  • 0

#25 Warvick

Warvick
  • Пользователь
  • 411 сообщений
  • Откуда:Tallinn

Отправлено 07 декабря 2007 - 20:53

Причём, формы динамические. Поставишь где-нить галку, вылезет ещё несколько полей. И надо учитывать зависимости, если где-нить галка стоит, надо обработать одни поля, не стоит - не надо. Если где-то не в ведено значение, значит не надо обрабатывать связанные поля и т.п. Возможно применение AJAX'а...

Тут конечно, лучший валидатор - это сам PHP, как и в сложных шаблонах ;) Просто может в каких-то других языках это реализовано, хотелось бы посмотреть, украсть идей.


В целом, могу сказать - чем проще, тем лучше. Если суть "валидации форм" в проверке правильности введённых данных - формат, длина, not null, в общем всё, искл. бизнесс правила, то все решения до боли похожи. И всё в конечном итоге сведётся к велосипеду(но с "кожаным седлом") :).

Единственное что я не понял, почему нет интерфейсов? РНР(с ним лично не знаком) же их вроде поддерживает...Каждая формочка бы его радосно импелементировала либо напрямую, либ через хелпер класс.

В $FormValidator->AddRule добавил бы ещё 1 параметр bool ruleActive, куды пихал бы флаг -

если где-нить галка стоит, надо обработать одни поля, не стоит - не надо....

, ну я думаю идея понятна.
  • 0
Да, я такой!

#26 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 07 декабря 2007 - 21:17

В целом, могу сказать - чем проще, тем лучше. Если суть "валидации форм" в проверке правильности введённых данных - формат, длина, not null, в общем всё, искл. бизнесс правила, то все решения до боли похожи. И всё в конечном итоге сведётся к велосипеду(но с "кожаным седлом") :).

Да, это самая простая часть валидации. Но к сожалению, в каждой форме встретится пара-тройка полей с какой-нить заковыркой. То в базе надо что-то проверить, то какие-то проверки дополнительные. Например, если выбрана страна Эстония, то нельзя выбрать город "Москва" ;) Часто надо вызывать методы различных объектов для проверок, а они могут требовать различных параметров например, логин и пароль, которые ты ввёл в этой форме. Вариантов море.

Единственное что я не понял, почему нет интерфейсов? РНР(с ним лично не знаком) же их вроде поддерживает...Каждая формочка бы его радосно импелементировала либо напрямую, либ через хелпер класс.

ПХП5 поддерживает интерфейсы, в предложенным мною варианте ООП используется по-минимуму, я думал над тем, чтобы каждая форма поддерживалась своим классом, который реализует интерфейс формы, но пока ещё не решил как лучше сделать. Это наверное, будет вторым логическим этапом развития валидатора ;) Правда, тут существует такой момент, как повторение кода. Большая часть форм имеют какие-то пересекающиеся поля и при их заполнении и валидации нужно использовать один и тот же код, т.к. нужно его вывести так, чтобы любая форма могла к нему обратиться.

В $FormValidator->AddRule добавил бы ещё 1 параметр bool ruleActive, куды пихал бы флаг - , ну я думаю идея понятна.

Уже добавлено, флаг зависимости. Если поле Х не заполнено или не прошло проверку или не = опред. значению, не выполнять проверку зависимых полей.
  • 0

#27 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 07 декабря 2007 - 23:32

Наткнулся случайно на интересное нововведение в PHP >= 5.1 расширение filter (в 5.2 доступно по-дефолту, в 5.1 в pecl)
Описание: http://ee.php.net/filter и http://devzone.zend....de/view/id/1113
Одна из наработок: http://vbolshov.org....10&ctrl=article

Вполне юзабельная штука. Имеется несколько встроенных фильтров + можно вызывать свои callback ф-ции. Надо изучить получше...
  • 0

#28 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 07 декабря 2007 - 23:36

Setor, Буквально вчера ковырялся там же ))) Только я смотрел общие примеры с php.net :))
  • 0

#29 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 08 декабря 2007 - 00:00

Да если честно, всё равно костыли получаются. Просто перекладываем процесс валидации на PHP. Плюсом является скорость и то, что некоторые фильтры и валидаторы написаны за нас. Но всё равно придётся писать wrapper над filter'ом. Всё это красиво, пока не начнёшь использовать на реальном приложении и опять какое-нить тупое поле испортит всю малину :( Для обычных форм эти валидаторы подходят очень хорошо, просто жизнь спасают ;) Буду рыть дальше...
  • 0

#30 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 08 декабря 2007 - 22:22

Написал более менее гибкий валидатор. Потом выложу исходники и пример. Суть такова, что имеется класс абстрактный FormValidator, от него наследуется класс конкретной формы RegisterForm extends FormValidator. Далее, в этом классе задаётся набор полей и правил. Каждое поле - это объект типа FormValidatorElement. Для каждого элемента можно задать CallBack имя метода, в котором можно делать любые пользовательские проверки, в качестве единственного параметра передаётся объект поля FormValidatorElement. Вышло довольно гибкое решение, пока косяков не было... Примеры потом.

P.S. из-за особенностей ф-ции call_user_func & call_user_func_array параметры callback ф-ций не могут передаваться по ссылке, по-этому вместо значений надо передавать объект, с этим траблов нет - в PHP5 все объекты передаются по ссылке.
  • 0