Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

HTML_MetaForm: извлечение информации о структуре HTML-формы и ее обработка (Дмитрий Котеров, оценка: 9)
Goto page 1, 2, 3, 4, 5  Next
Author Message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Sep 25, 2006 12:42 pm (написано за 8 секунд)
   Post subject: HTML_MetaForm: извлечение информации о структуре HTML-формы и ее обработка
Reply with quote

Свершилось!
dklab.ru/lib/HTML_MetaForm/
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 387
   поощрить/наказать


PostPosted: Fri Sep 29, 2006 11:27 am (спустя 3 дня 22 часа 45 минут; написано за 1 минуту 31 секунду)
   Post subject:
Reply with quote

Довольно спорное решение , практика покажет. В нашей системе используется система оповещений для обработки форм, на основе паттерна Observer.
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Fri Sep 29, 2006 1:27 pm (спустя 1 час 59 минут; написано за 58 секунд)
   Post subject:
Reply with quote

Согласен, что спорное, но моя практика показывает, что оно очень удобное, потому что легко "накладывается" на любые уже существующие скрипты без их существенной переработки.

А Ваша система как работает?
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 387
   поощрить/наказать


PostPosted: Mon Oct 02, 2006 12:43 pm (спустя 2 дня 23 часа 16 минут; написано за 6 минут 9 секунд)
   Post subject:
Reply with quote

Автору респект!
Очень удобное средство, кучу проблем берет на себя. Сначала немного сложно разобраться, но когда разберешься, то понимаешь, что полезность стремится к бесконечности.
А как вы смотрите на то, чтобы объединить его с FormPersister, чтобы вся обработка выполнялась за один проход SemiParser(если такое вообще осуществимо)? И писать что-то вроде: meta:default="" и т.п. Еще было бы неплохо помоему иметь возможность передавать валидатору параметры: meta:validator="password:6:true" (пароль не короче 6 символов и допустим пустой пароль(true)).
В любом случае спасибо!
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Oct 02, 2006 1:24 pm (спустя 41 минуту; написано за 9 минут 57 секунд)
   Post subject:
Reply with quote

Гость wrote:
Сначала немного сложно разобраться
Комментарии о том, что именно увиделось сложным (в частности, в статье) и предложения по упрощению объяснений были бы как нельзя более кстати в этом топике. Я собираюсь в ближайшее время переводить статью на английкий, и хотелось бы, чтобы она была максимально простой для понимания буржуями. :-) В противном случае все произойдет, как с FormPersister-ом на PEAR: никто не понял, для чего это надо, все запутались и забраковали библиотеку.
Гость wrote:
А как вы смотрите на то, чтобы объединить его с FormPersister, чтобы вся обработка выполнялась за один проход SemiParser(если такое вообще осуществимо)?
Естественно, это осуществимо.
Code (php): скопировать код в буфер обмена
$SemiParser =& new HTML_SemiParser();
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$SemiParser, 'process'));

$MetaForm =& new HTML_MetaForm();
$SemiParser->addObject($MetaForm);

$FormPersister =& new HTML_FormPersister();
$SemiParser->addObject($FormPersister);
И будет у Вас обработка за один проход как раз.
Гость wrote:
И писать что-то вроде: meta:default=""
Дело в том, что FormPersister и MetaForm - совершенно различные библиотеки, так что привязываться к слову meta в FormPersister - по-моему, не очень хорошая идея. Впрочем, MetaForm уже не увидит никаких атрибутов default, т.к. он запустится после FormPersister-а.
Гость wrote:
Еще было бы неплохо помоему иметь возможность передавать валидатору параметры: meta:validator="password:6:true"
Параметры валидатору можно передавать в отдельных мета-атрибутах, это концептуальнее:

<input meta:validator="password" meta:minlen="6">

Вариант "допустим пустой пароль" лучше делать не так. Создавайте валидаторы, ортогональные друг другу. Например, валидатор password допускает прием пароля длиннее 6 символов ИЛИ пустого. Тогда чтобы разрешить пустой пароль, пишете просто meta:validator="password", а чтобы запретить - meta:validator="filled password". Чем это удобно? Тем, что выдаются осмысленные сообщения об ошибках (типа "поле должно быть заполнено" и "пароль должен быть длиннее 6 символов"). С одним валидатором вы этого так просто не добьетесь, придется возвращать кастомные сообщения из валидатора, а не просто true/false.

("Ортогональный" в математическом смысле означает, что по результату, данному одним валидатором, невозможно предсказать результат, данный вторым. Например, если второй валидатор возвращает true, мы никоем образом не можем понять, вернет ли первый true или false. Тогда один валидатор будет уточнять другой, а конфликтовать - никогда.)
Back to top
View user's profile Send private message Send e-mail
Nadir
Guest





Карма: 387
   поощрить/наказать


PostPosted: Wed Oct 04, 2006 12:07 am (спустя 1 день 10 часов 42 минуты; написано за 4 минуты)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Согласен, что спорное, но моя практика показывает, что оно очень удобное, потому что легко "накладывается" на любые уже существующие скрипты без их существенной переработки.

А Ваша система как работает?
Идея , проста до безобразия

У каждой формы есть поле однозначно идентифицирующее ее в системе. На основе идентификатора, создается сообщение, о том что пришла такая та форма, соответственно, которое рассылается всем подписанным на него объектам. В свою очередь, каждый объект, уже сам решает, что ему делать с пришедшими данными.
Back to top
Guest






Карма: 387
   поощрить/наказать


PostPosted: Mon Oct 09, 2006 12:00 pm (спустя 5 дней 11 часов 52 минуты; написано за 25 минут 44 секунды)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Комментарии о том, что именно увиделось сложным (в частности, в статье) и предложения по упрощению объяснений были бы как нельзя более кстати в этом топике. Я собираюсь в ближайшее время переводить статью на английкий, и хотелось бы, чтобы она была максимально простой для понимания буржуями. :-) В противном случае все произойдет, как с FormPersister-ом на PEAR: никто не понял, для чего это надо, все запутались и забраковали библиотеку.
Немного непонятно было почему обработка идет по имени кнопки сабмита, а не по имени формы. Часто ли возникают ситуации когда такое поведение необходимо?
Подписывает ли HTML_MetaForm помимо стандартных элементов и полей формы, поля вида meta:smthng="val". Возможна ли их подделка злоумышленником?
Конкретный пример: существует валидатор validate_regexpr($value, $meta), который внутри использует значение meta:regexpr, возможна ли подделка meta:regexpr?

Насколько обосновано возвращаемое значение валидатора в виде массива при ошибке валидации? Необходимость в этом возникает при попытке вернуть строковое значение. Как насчет логики: успех валидации -- return false(null, 0), остальное -- ошибка.

Возможно было бы неплохо иметь механизм связывания валидатора с функцией внутри программы: $HTML_MetaFormAction->setValidator('filled', 'is_filled'). Ведь как было сказано в статье "они будут в общем случае специфичны для каждого конкретного проекта", а наследовать класс и переопределять встроенные валидаторы не очень удобно.
--
По предыдущим вопросам Ваши комментарии справедливы. Возможно новые вопросы тоже имеют простое и логичное объяснение =).
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Oct 09, 2006 12:24 pm (спустя 24 минуты; написано за 9 минут 29 секунд)
   Post subject:
Reply with quote

Гость wrote:
почему обработка идет по имени кнопки сабмита, а не по имени формы. Часто ли возникают ситуации когда такое поведение необходимо?
На моей практике - очень часто. В каждой третьей форме не одна кнопка сабмита, а две и больше. Например, одна кнопка для сохранения записи, вторая - для ее удаления. Обработка по имени формы представляется мне малоперспективной, т.к. в каждой форме указывается action обработчика, который и так и так получит данную форму. Впрочем, в метаинформации имя формы присутствует, можно по нему делать любую операцию.
Гость wrote:
Подписывает ли HTML_MetaForm помимо стандартных элементов и полей формы, поля вида meta:smthng="val". Возможна ли их подделка злоумышленником?
Подписывается ВСЯ метаинформация. В том числе и атрибуты meta. Подделка невозможна (при условии, конечно, если ему не станет известен ключ подписывания - по умолчанию он выбирается автоматически на основе времени изменения файла библиотеки, но никто не мешает передать его в конструкторе первым параметром; главное - не светить его наружу).
Гость wrote:
Насколько обосновано возвращаемое значение валидатора в виде массива при ошибке валидации?
Такая необходимость возникает в случае, если валидатор должен сгенерировать сложное сообщение об ошибке. Например, вернув array('Ошибка базы данных: %s. Попробуйте позже.', $DB->error), и скормив потом этот массив функции sprintf() через call_user_func_array(), получим удобное средство отображения ошибки пользователю.
Гость wrote:
Как насчет логики: успех валидации -- return false(null, 0), остальное -- ошибка.
Тогда это будет не validator, а invalidator. Усложняется интуитивное понимание: надо будет везде инвертировать логику. Ошибки в виде массива возвращаются не так часто; я решил, что такая цена - оправдана.
Гость wrote:
Возможно было бы неплохо иметь механизм связывания валидатора с функцией внутри программы: $HTML_MetaFormAction->setValidator('filled', 'is_filled').
Я умышленно не сделал такую возможность, т.к. это - дублирование данных (имя поля упоминается как в форме, так и в ее обработчике).
Гость wrote:
а наследовать класс и переопределять встроенные валидаторы не очень удобно.
Во-первых, почему неудобно? В каждом специфическом проекте будут свои наследники со своими валидаторами. По-моему, достаточно удобно. Во-вторых, не обязательно же наследовать: можно определить статическую функцию validator_* (прямо в коде программы), и она будет с тем же успехом вызываться. Можете сделать целые библиотеки валидаторов - обыкновенные включаемые файлы с определениями функций.

Возможно, стоит сделать поддержку метода useValidatorClass($className), который включает класс $className в список классов, в которых ищутся функции-валидаторы. Но с практической точки зрения не совсем понятно, какое это даст преимущество - учитывая, что префикс validator_ все равно придется давать валидаторам по соображениям безопасности (для защиты от HTML injection).
Back to top
View user's profile Send private message Send e-mail
Макс
Guest





Карма: 387
   поощрить/наказать


PostPosted: Tue Oct 17, 2006 8:19 am (спустя 7 дней 19 часов 55 минут; написано за 1 минуту 26 секунд)
   Post subject:
Reply with quote

Интересно, как бы удобнее всего подцепить библиотеку к шаблонизатору?
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Oct 17, 2006 2:23 pm (спустя 6 часов 3 минуты; написано за 30 секунд)
   Post subject:
Reply with quote

А в чем проблема? Библиотека работает на более низком уровне, чем любой шаблонизатор.
Back to top
View user's profile Send private message Send e-mail
drews
Guest





Карма: 387
   поощрить/наказать


PostPosted: Thu Oct 19, 2006 12:45 pm (спустя 1 день 22 часа 22 минуты; написано за 4 минуты 44 секунды)
   Post subject:
Reply with quote

А у меня такой вопрос к автору: в форме, помимо всего прочего, присутсвует группа радиокнопок. После обработки формы, метод process() возвращает null, а getErrors() - пустой массив. Такми образом получается, что вроде ошибок нет, но и обработка формы завершена в нештатном режиме. Экпериментальным путём выяснил, что вся проблема в том, что эти радиокнопки не проходят проверку в _checkDynamicField() в том случае, когда ни одно из значений в группе не выбрано, то есть, когда $meta['value'] оказывается пустым.
Отсюда вопрос: это баг или фича?
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Fri Oct 20, 2006 11:42 pm (спустя 1 день 10 часов 56 минут; написано за 1 минуту 52 секунды)
   Post subject:
Reply with quote

drews wrote:
радиокнопки не проходят проверку в _checkDynamicField() в том случае, когда ни одно из значений в группе не выбрано, то есть, когда $meta['value'] оказывается пустым.
Отсюда вопрос: это баг или фича?
Если ни одно из значений не выбрано - то, естественно, это ошибка. Точнее, неправильно сверстана страница: у одной из кнопок обязательно должен быть атрибут checked (иначе получается, что пользователь может выбрать кнопку, а после этого "не-выбрать" - нет; интерфейс оказывается необратимым).

Но вот почему getErrors() возвращает пустой массив - я не могу понять. Там должно быть сообщение об ошибке. Можете привести минимальный тестовый код, воспроизводящий проблему?
Back to top
View user's profile Send private message Send e-mail
drews
Guest





Карма: 387
   поощрить/наказать


PostPosted: Sun Oct 22, 2006 5:09 pm (спустя 1 день 17 часов 27 минут; написано за 3 минуты 58 секунд)
   Post subject:
Reply with quote

Дмитрий, приношу свои извинения за ложную тревогу.
Как говорится, дело было не в бобиние :)
Действительно, что касается верстки формы, абсолютно с вами согласен, это моя оплошность.
Но ещё одна моя оплошность заключалась в том, что отладочный вызов print_r($metaFormAction->getErrors()) я производил ДО вызова $metaFormAction->process().
Подготавливая сейчас тестовый пример, в котором порядок вызовов getErrors() и process() был уже правильным, стабильно получал ошибку metaformaction_non_existed_value.
Посему, ещё раз прошу прощения и благодарю за очень полезный и нужный компонент!
Back to top
Guest






Карма: 387
   поощрить/наказать


PostPosted: Wed Oct 25, 2006 11:37 am (спустя 2 дня 18 часов 27 минут; написано за 3 минуты 25 секунд)
   Post subject:
Reply with quote

Обнаружен баг: система неправильно интерпретирует <input type="image", тип устанавливается в text, вместо правильного action. Вторая проблема: при отправке формы посредством <input type="image" name="smthng" /> мы не можем передать value, оно будет всегда NULL, зато будут установлены $_POST['smthng_x'], $_POST['snthng_y']. Надеюсь фикс не заставит себя ждать, а то приходится костыль лепить.
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Wed Oct 25, 2006 11:43 pm (спустя 12 часов 5 минут; написано за 1 минуту 47 секунд)
   Post subject:
Reply with quote

Вроде бы исправил, проверьте. В случае кнопки с простым именем (без [...]) в value хранится array(x, y). А вот если имя составное - "aaa[bbb]", тогда там хранится только y (это особенность PHP: QUERY_STRING aaa[bbb].x=10&aaa[bbb].y=20 трактуется точно так же, как aaa[bbb]=20).

version 1.03
- support for <input type="image"> submit buttons.
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 387
   поощрить/наказать


PostPosted: Fri Oct 27, 2006 1:19 pm (спустя 1 день 13 часов 36 минут; написано за 7 минут 10 секунд)
   Post subject:
Reply with quote

Да, теперь работает. Недочет еще остался: MetaFormAction.php? строка 109:
Code (php): скопировать код в буфер обмена
if ($meta['type'] == 'action' && strlen (www.php.net/strlen)($meta['value'])){
нужно заменить на что-то подобное:
Code (php): скопировать код в буфер обмена
if ($meta['type'] == 'action' && !empty (www.php.net/empty)($meta['value'])){
иначе Notice генерирует: неявное приведение array к string

Ещё предложение родилось: не сочтите за наглость, Дмитрий, но может исключить из стандартной поставки все методы-валидаторы? Ибо приоритет у них выше, чем у библиотек валидаторов функциями, а возвращаемое значение может не совпадать с тем(как в моем случае), что принято в разрабатываемом приложении. Может вместо этого добавить validators.php в /test/, чтобы продемонстрировать как они выглядят, в класс оставить чистым? =)
Вчера обновил MetaForm и долго не мог понять почему у меня filled стал возвращать NULL вместо array('msg'=>) =).

Небольшой offtop: есть предположение, что FormPersister не разворачивает confirm="" для <inuput type="image" />. Небыло времени проверить, возможно позже проверю.
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Fri Oct 27, 2006 4:44 pm (спустя 3 часа 24 минуты; написано за 37 секунд)
   Post subject:
Reply with quote

version 1.03 (HTML_MetaFormAction):
- fixed notice when action is "image"
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



Joined: 19 Mar 2006
Posts: 40
Карма: 1
   поощрить/наказать


PostPosted: Mon Oct 30, 2006 8:45 am (спустя 2 дня 16 часов 1 минуту; написано за 7 минут 21 секунду)
   Post subject:
Reply with quote

Дмитрий Котеров
Quote:
Параметры валидатору можно передавать в отдельных мета-атрибутах, это концептуальнее: <input meta:validator="password" meta:minlen="6">
А если валидаторов с дополнительными параметрами будет несколько? Тогда понимание кода сильно усложнится: какой meta к какому валидатору относится?

Абстрактный пример:
Code (any language): скопировать код в буфер обмена
validator="is_length is_equal is_range" meta:min_lenght="4" meta:field1="field_1" meta:max_lenght="8" meta:min_range="1000" meta:field2="field_2" meta:max_range="100000"
На мой взгляд так гораздо понятнее и короче:
Code (any language): скопировать код в буфер обмена
validator="is_length(4,8) is_equal(field1,field2) is_range(1000,100000)"
Или так (не знаю, как коцептуальнее :-)):
Code (any language): скопировать код в буфер обмена
validator="is_length:4:8 is_equal:field1:field2 is_range:1000:100000"
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Oct 30, 2006 9:44 am (спустя 59 минут; написано за 1 минуту 11 секунд)
   Post subject:
Reply with quote

Так понятнее, но это значительно сложнее парсить (особенно если в параметрах захочется сделать строки). Мне кажется, незачем повторять ошибки Smarty. К тому же валидаторы с параметрами - скорее исключение, чем правило (т.к. для них сложно генерировать осмысленные сообщения об ошибках).
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



Joined: 19 Mar 2006
Posts: 40
Карма: 1
   поощрить/наказать


PostPosted: Mon Oct 30, 2006 10:10 am (спустя 25 минут; написано за 4 минуты 25 секунд)
   Post subject:
Reply with quote

Конечно, разбор строки усложнится... И хотя, как вы говорите, валидаторов с параметрами не так много, используются они не так уж и редко. Конечно, автоматическое создание сообщение об ошибке будет затруднено, т.к. только true или false для этого будет недостаточно. Может быть в этом случае разумно отдать формирование сообщение на откуп пользователя? Ведь вариант "Пароль не подтвержден" более понятен, чем "Значение поле1 не равно значению поле2".

А о каких ошибках Smarty вы говорите?
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



Joined: 19 Mar 2006
Posts: 40
Карма: 1
   поощрить/наказать


PostPosted: Tue Oct 31, 2006 6:20 am (спустя 20 часов 9 минут; написано за 2 минуты 7 секунд)
   Post subject:
Reply with quote

Есть еще одна идея по усовершенствованию библиотеки - добавление параметра meta:transform (можно и по другому обозвать). Например
Code (any language): скопировать код в буфер обмена
meta:transform="trim capitalize"
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Oct 31, 2006 10:42 am (спустя 4 часа 22 минуты; написано за 42 секунды)
   Post subject:
Reply with quote

meta:transform можете сделать как расширение библиотеки HTML_MetaFormAction (производный класс). В базовой версии, я считаю, ему делать нечего.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Nov 02, 2006 12:05 am (спустя 1 день 13 часов 22 минуты; написано за 2 минуты 2 секунды)
   Post subject:
Reply with quote

version 1.04
- MetaFormAction: if hidden field contains leading/trailing spaces, FireFox cut them off which causes validation error while comparing actual and expected hidden field values (metaformaction_invalid_value generated).
Back to top
View user's profile Send private message Send e-mail
Макс
Guest





Карма: 387
   поощрить/наказать


PostPosted: Thu Nov 09, 2006 5:29 am (спустя 7 дней 5 часов 24 минуты; написано за 9 минут 18 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
А в чем проблема?
Дмитрий, прежде всего, спасибо Вам за ответ и отличную библиотеку.
Quote:
любой шаблонизатор.
Интересен именно Ваш шаблонизатор;
возможно, я просто не до конца понимаю принципов его работы.
Подскажите, пожалуйста.
Quote:
Библиотека работает на более низком уровне
У меня получилось подписывание форм (подцепил так же, как и FormPersister), но не удается
запустить обработку (MetaFormAction).
Это вообще возможно сделать, используя компоненты, или?
Спасибо
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Nov 09, 2006 11:08 am (спустя 5 часов 38 минут; написано за 54 секунды)
   Post subject:
Reply with quote

Еще раз: возможно все, потому что библиотека работает на более низком уровне, чем шаблонизатор. Только ее надо подключить до шаблонизатора.
В чем именно проблема?
Back to top
View user's profile Send private message Send e-mail
Макс
Guest





Карма: 387
   поощрить/наказать


PostPosted: Thu Nov 09, 2006 7:37 pm (спустя 8 часов 29 минут; написано за 4 минуты 41 секунду)
   Post subject:
Reply with quote

я запутался:
Дмитрий Котеров wrote:
ее надо подключить до шаблонизатора
это что значит назначить ее обработчиком прежде шаблонизатора?

Я делаю так:
подключаю MetaForm в ApacheHandler.php точно так, как подключен FormPersister
Code (php): скопировать код в буфер обмена
$parser = new HTML_MetaForm;
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$parser, "process"));
В результате форма подписывается (скрытое поле есть)

После, где бы ни был вызван $metaFormAction->process(),
кроме INIT (совершенно верно) в случае get
и NULL при пустом массиве $metaFormAction->getErrors() (так не должно быть) в случае post
он ничего не возвращает = имен кнопок нет

а хочется отлавливать $metaFormAction->process() в компоненте подготовки данных/обработки формы
Что не так в моих действиях?
Спасибо
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Nov 09, 2006 9:30 pm (спустя 1 час 53 минуты; написано за 18 секунд)
   Post subject:
Reply with quote

Попробуйте, что ли,

$parser =& new HTML_MetaForm;
ob_start(array(&$parser, "process"));

(=& вместо =).
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu Nov 09, 2006 9:31 pm (спустя 35 секунд; написано за 22 секунды)
   Post subject:
Reply with quote

Вообще, попытайтесь самостоятельно диагностировать проблему
phpfaq.ru/debug
Back to top
View user's profile Send private message Send e-mail
Макс
Guest





Карма: 387
   поощрить/наказать


PostPosted: Fri Nov 10, 2006 9:33 am (спустя 12 часов 1 минуту; написано за 5 минут 10 секунд)
   Post subject:
Reply with quote

уфф, как я на себя зол!
извините, Дмитрий, за беспокойство и спасибо за вектор.
Проблема не стоила выеденного яйца:

посмотрел значения переменных во время выполнения библиотеки ===
оказалось, что просто не совпадали имя скрипта-обработчика с заявленным в форме( было оставлено пустым ),
а насчет getErrors я, видимо, ошибся в коде - ошибка фиксируется

Еще раз спасибо за библиотеку.
Back to top
Максим З.
Заглянувший



Joined: 28 Sep 2006
Posts: 4
Карма: 1
   поощрить/наказать


PostPosted: Tue Nov 14, 2006 8:17 am (спустя 3 дня 22 часа 44 минуты; написано за 1 минуту 2 секунды)
   Post subject:
Reply with quote

Случайно обнаружил:
если в форме задать серию hidden-полей
Code (html): скопировать код в буфер обмена
<input (december.com/html/4/element/input.html) type="hidden" name="array[]" value="111"> (december.com/html/4/element/.html)
<input (december.com/html/4/element/input.html) type="hidden" name="array[]" value="222"> (december.com/html/4/element/.html)
<input (december.com/html/4/element/input.html) type="hidden" name="array[]" value="333"> (december.com/html/4/element/.html)
то генерируется ошибка
[message] => Array
(
    [0] => metaformaction_invalid_value
    [1] => array[]
    [2] => text
    [3] => '333'
    [4] => '111'
)
Без массива скрытых значений можно и прожить, но на всякий случай:
это так задумано?
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Nov 14, 2006 12:06 pm (спустя 3 часа 48 минут; написано за 6 минут 20 секунд)
   Post subject:
Reply with quote

Понимаете, какая штука... MetaForm накладывает некоторые ограничения на несколько экзотических способов использования полей-автомассивов. А именно, автомассивами могут быть только поля типа multiple (это checkbox-ы и select с множественным выбором). Поля типа hidden (а также <input type=text>, <textarea> и т.д. - все остальные поля, к которым можно приписать []) к ним, естественнно, не относятся (это тип text).

Поэтому и работает все не так, как Вы ожидаете.

Я не знаю, будет ли оправданным преобразование серии hidden-полей в элемент типа multiple со значением-массивом. Скорее всего - не будет, т.к. программа может ориентироваться на типы полей при их переборе, а у multiple-полей всегда доступны пары ключ=метка (где метка - текст в <option> или в <label>, привязанный к checkbox-полю); к hidden-полям, естественно, никакой метки не привязано

В Вашем случае решение - давать имена hidden-полям явно, без автомассивов.
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 387
   поощрить/наказать


PostPosted: Thu Nov 16, 2006 12:18 am (спустя 1 день 12 часов 11 минут; написано за 1 минуту 18 секунд)
   Post subject:
Reply with quote

Хотелось бы отметить, что с выходом PHP 5.2 MetaForm и валидация средствами библиотеки Filter из PHP просто созданы друг для друга.
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Sat Nov 18, 2006 12:25 am (спустя 2 дня 7 минут; написано за 3 минуты 54 секунды)
   Post subject:
Reply with quote

Да, действительно: функция filter_var с ru.php.net/filter - это практически один-в-один валидатор MetaForm. Только там вторым параметром передается еще тип значения. Можно сделать поддержку, в принципе - например, если вместо валидатора передается одна из констант FILTER_VALIDATE_*, то вызывать filter_var для нее.

Замечу, однако, что в контексте MetaForm расширение filter может использоваться ТОЛЬКО для валидации. Мое мнение: применять его для какой-то там "очистки" данных (как вот тут: devzone.zend.com/node/view/id/1113) - просто-напросто ошибка проектирования, т.к. решение будет неустойчиво: достаточно в одном месте пропустить вызов функции очистки, и привет, получаем дыру в безопасности. Тут рассуждения точь-в-точь такие же, как при разговоре о placeholder-е: безопасность должен обеспечивать тот слой абстракции, который имеет максимальную информацию о данных, но в то же время не требует рутинного "ручного" кодирования.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Sat Nov 18, 2006 12:30 am (спустя 5 минут; написано за 2 минуты 32 секунды)
   Post subject:
Reply with quote

Кстати, вот тут: devzone.zend.com/node/view/id/1113 товарищ очень правильно высказался (см. со слов THE BIGGEST MISTAKE). Действительно, что фильтрация, что magic_quotes - и то и другое обыкновенные ошибки проектирования, ничего больше. Очень похоже, что их создали люди, плохо разбирающиеся в программировании. (Кстати, вот автора Парсера - parser.ru - можно раз отнести к противоположной группе: он ввел средства tainting-а в само ядро языка, чем обеспечил по-настоящему безопасный и универсальный способ решения.)
Back to top
View user's profile Send private message Send e-mail
akxxiv
Заглянувший



Joined: 30 Sep 2005
Posts: 18
Карма: 0
   поощрить/наказать


PostPosted: Sat Nov 18, 2006 5:36 pm (спустя 17 часов 6 минут; написано за 13 минут 6 секунд)
   Post subject:
Reply with quote

Еще один вопрос по подключению данных библиотек к шаблонизатору или наоборот. Например, используя XTemplate для построения таблицы с полями формы, хотелось бы для проверки а заполнения ее использовать Ваше библиотеку. Как ее подключать?
Чтобы подключить XTemplate делаю:
Code (php): скопировать код в буфер обмена
$xtpl = new XTemplate('template.xtpl');
$rows = SpFo::getElements(); //
foreach($rows as $row)
{
        $xtpl->assign("ID", $row['id']);
        $xtpl->assign("NAME", $row['name']);
        $xtpl->parse("main.rows");
}
$xtpl->parse("main");
$xtpl->out();
Вопрос: как подключить библиотеку? У Вас в примерах она подключается через od_start:
Code (php): скопировать код в буфер обмена
ob_start (www.php.net/ob_start)(array (www.php.net/array)('HTML_FormPersister', 'ob_formpersisterhandler'));
$metaForm =& new HTML_MetaForm();
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$metaForm, 'process'));
$metaFormAction =& new HTML_MetaFormAction($metaForm);
Но в XTemplate сформированный html выводится через метод $xtpl->out() или $xtpl->text() если в переменную. Следует ли делать:
Code (php): скопировать код в буфер обмена
ob_start (www.php.net/ob_start)(array (www.php.net/array)('HTML_FormPersister', 'ob_formpersisterhandler'));
$metaForm =& new HTML_MetaForm();
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$metaForm, 'process'));
$metaFormAction =& new HTML_MetaFormAction($metaForm);
$xtpl->out();
Или можно передать каким либо образом сформированный html непосредственно в к.л. функцию Вашей библиотеки?

Спасибо.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Sat Nov 18, 2006 6:53 pm (спустя 1 час 16 минут; написано за 1 минуту 39 секунд)
   Post subject:
Reply with quote

Можно и через ob_start(), а можно и непосредственно в $metaForm->process() передать. Почитайте документацию на php.net/ob_start, а также на библиотеки MetaForm и FormPersister.

Я бы на Вашем месте использовал способ через ob_start, причем вот так (это оптимальнее по производительности):
Code (php): скопировать код в буфер обмена
$SemiParser =& new HTML_SemiParser();
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$SemiParser, 'process'));

$MetaForm =& new HTML_MetaForm();
$SemiParser->addObject($MetaForm);

$FormPersister =& new HTML_FormPersister();
$SemiParser->addObject($FormPersister);
Back to top
View user's profile Send private message Send e-mail
Максим З.
Заглянувший



Joined: 28 Sep 2006
Posts: 4
Карма: 1
   поощрить/наказать


PostPosted: Thu Nov 23, 2006 6:51 am (спустя 4 дня 11 часов 57 минут; написано за 4 минуты 40 секунд)
   Post subject:
Reply with quote

Дмитрий!
Не могу понять - использую список (select) с единичным выбором (single), label в ошибке присутствует,
но стоит добавить multiple как весь массив meta в ошибке оказывается пустой
Для multiple-select(a) нет label и т.п. ?
Back to top
View user's profile Send private message Send e-mail
Максим З.
Заглянувший



Joined: 28 Sep 2006
Posts: 4
Карма: 1
   поощрить/наказать


PostPosted: Fri Nov 24, 2006 7:08 am (спустя 1 день 17 минут; написано за 45 секунд)
   Post subject:
Reply with quote

Дмитрий! Извините, пожалуйста, за предыдущее несколько сумбурное высказывание.
Мне понадобилось обработать ошибки в select(multiple) - поле стандартными средствами библиотеки
(например проверить данные на актуальность - в этом случае даже если они не подделаны, необходима доп. проверка, возмутиться и вернуть обновленную форму пользователю)
Назначив валидатор, нахожу, что meta-данные при возникновении ошибки в любом multiple-поле не передаются вместе с ошибкой, а теряются. Это специально сделано?
Смотрим код (MetaFormAction.php ф-ия validationError):
Code (php): скопировать код в буфер обмена
'meta' => $name !== null? @$metas['items'][$name] : null,
"
В лоб" заменил на:
Code (php): скопировать код в буфер обмена
'meta' => $name !== null? ( @$metas['items'][$name]? $metas['items'][$name]: @$metas['items'][$name.'[]']):null,
=== вроде счастье
Может, я чего-то не учел. Поправьте меня, если я не прав. Спасибо
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Fri Nov 24, 2006 11:36 am (спустя 4 часа 28 минут; написано за 3 минуты 17 секунд)
   Post subject:
Reply with quote

Спасибо. Да, это был баг. При генерации сообщений об ошибках иногда поле 'meta' не заполнялось (это касается, во-первых, multiple-полей, а во-вторых, автоавлидаторных сообщений вроде "поле содержит недопустимый элемент", когда, например, в качестве значения для select-а пытаются подсунуть величину, для которой нет option'а).

version 1.06:
- Now $error['meta'] is always passed to validation error handlers and correctly filled for items returned by getErrors(). Also SELECT MULTIPLE validation errors and LABEL binding to 'multiple' elements fixed.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Fri Nov 24, 2006 11:37 am (спустя 1 минуту 11 секунд; написано за 1 минуту 30 секунд)
   Post subject:
Reply with quote

Максим З. wrote:
Может, я чего-то не учел
Кстати, да, по-моему, не учли - Ваш фикс не универсальный, он не должен работать, если имя поля такое: sel[aaa][bbb][]. К тому же Вы привязываетесь к [], в то время как полное имя поля доступно в программе в отдельной переменной. В версии 1.06 все исправлено корректным образом, можете пользоваться.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page 1, 2, 3, 4, 5  Next
Page 1 of 5    Email to a Friend.
Post a reply
Username
Subject
Господа спамеры и оптимизаторы!

Вы можете даже и не пытаться вставлять в текст поста ссылки - они все равно автоматически удаляются (вернее, тэги <a> заменяются на тэги <u>).

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

Disable BBCode in this post
Disable Smilies in this post
    HTML is OFF
BBCode is ON
Smilies are ON
You cannot post new topics in this forum. You can reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML