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

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



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

Location: Москва

PostPosted: Fri Dec 22, 2006 2:44 pm (написано за 32 секунды)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
<form action="a" meta:dynamic="b c">
Даже и не знал о таком варианте использование meta:dynamic, интересно...
Back to top
View user's profile Send private message
Сергей П.
Guest





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


PostPosted: Wed Dec 27, 2006 10:51 am (спустя 4 дня 20 часов 7 минут; написано за 47 секунд)
   Post subject: игнорирует <button type="submit">Кнопка</button>
Reply with quote

Все клева!
Тока
HTML_MetaForm игнорирует тэг <button type="submit">Кнопка</button>.
Back to top
Сергей П.
Guest





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


PostPosted: Wed Dec 27, 2006 11:39 am (спустя 47 минут; написано за 7 минут 4 секунды)
   Post subject:
Reply with quote

и...

Тэг <input type="image" /> работает как <input type="submit" />, т.е. отправляет форму с данными.

Следственно, думаю нужно внести коррективы в MetaForm.php.

Было:
Code (php): скопировать код в буфер обмена
    function tag_input($tag)
    {
        if (!isset (www.php.net/isset)($tag['name'])) return;
        $type = isset (www.php.net/isset)($tag['type'])? strtolower (www.php.net/strtolower)($tag['type']) : 'text';
        $item = array (www.php.net/array)();
        switch ($type) {
            case "checkbox":
    [down_x] => 13
    [down_y] => 22
    [down] => Вниз
                $type = 'multiple';
                $item['key'] = isset (www.php.net/isset)($tag['value'])? $tag['value'] : "on";
                break;
            case "radio":
                $type = 'single';
                $item['key'] = isset (www.php.net/isset)($tag['value'])? $tag['value'] : null;
                break;
            case "hidden":
                $type = 'text';
                $item['original'] = isset (www.php.net/isset)($tag['value'])? $tag['value'] : null;
                break;
            case "file":
                $type = 'file';
                break;
            case "submit":
            case "button":
                $type = 'action';
                break;
            default:
                $type = 'text';
                break;
        }
        return $this->_addItems($type, $tag, array (www.php.net/array)($item));
    }
Стало:
Code (php): скопировать код в буфер обмена
    function tag_input($tag)
    {
        if (!isset (www.php.net/isset)($tag['name'])) return;
        $type = isset (www.php.net/isset)($tag['type'])? strtolower (www.php.net/strtolower)($tag['type']) : 'text';
        $item = array (www.php.net/array)();
        switch ($type) {
            case "checkbox":
                $type = 'multiple';
                $item['key'] = isset (www.php.net/isset)($tag['value'])? $tag['value'] : "on";
                break;
            case "radio":
                $type = 'single';
                $item['key'] = isset (www.php.net/isset)($tag['value'])? $tag['value'] : null;
                break;
            case "hidden":
                $type = 'text';
                $item['original'] = isset (www.php.net/isset)($tag['value'])? $tag['value'] : null;
                break;
            case "file":
                $type = 'file';
                break;
            case "submit":
            case "image":
            case "button":
                $type = 'action';
                break;
            default:
                $type = 'text';
                break;
        }
        return $this->_addItems($type, $tag, array (www.php.net/array)($item));
    }
добавили:
Code (php): скопировать код в буфер обмена
case "image":
.


И ещё в IE, при нажатии на конку с <input name="down" type="image" value="Вниз" /> генерируются переменные в POST
Code (php): скопировать код в буфер обмена
[down_x] => 6
[down_y] => 13
А в нормальных браузерах:
Code (php): скопировать код в буфер обмена
[down_x] => 13
[down_y] => 22
[down] => Вниз
вероятно поэтому getFormMeta() не ген. элемент с type="action" и name="down"...

С этим тоже что-то нужно делать...
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Wed Dec 27, 2006 11:55 am (спустя 16 минут; написано за 1 минуту 11 секунд)
   Post subject:
Reply with quote

Сергей П. wrote:
добавили:
Код (php): скопировать код в буфер обмена
case "image":
Простите, а Вы какую версию используете? Дело в том, что в текущей версии поддержка image давно есть, и _x c _y тоже обрабатываются:
dklab.ru/lib/HTML_MetaForm/demo.zip
Сергей П. wrote:
HTML_MetaForm игнорирует тэг <button type="submit">Кнопка</button>
А вот это есть такое, да.
Вот, берите отсюда: dklab.ru/wsvn/lib/trunk/lib/HTML/ версию с поддержкой button-ов и image-ов.
Back to top
View user's profile Send private message Send e-mail
Сергей П.
Guest





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


PostPosted: Wed Dec 27, 2006 3:41 pm (спустя 3 часа 45 минут; написано за 1 минуту 9 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров

Благодарю!

Да я наверно пользовался старой версией. Месяца 2 назад качал...

Все теперь работает, спасибо.
Back to top
Guest






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


PostPosted: Thu Dec 28, 2006 2:58 pm (спустя 23 часа 16 минут; написано за 4 минуты 41 секунду)
   Post subject:
Reply with quote

Дмитрий Котеров

Оказывается не все совсем все ок...

теперь, если кликаем по <input name="public" value="Публиковать" type="image" src="..." />
getFormMeta() выдает:
Code (php): скопировать код в буфер обмена
        [items] => Array (www.php.net/array)
        (
            [public] => Array (www.php.net/array)
                (
                    [type] => action
                    [name] => public
                    [value] => Array (www.php.net/array)
                        (
                            [0] => 0
                            [1] => 22
                        )

                )
где:
Code (php): скопировать код в буфер обмена
        [0] => 0
        [1] => 22
координаты ук-ля мыши при клике, что не совсем ожидаемо, т.к. атрибут value игнорируется...
может стоит сделать так:
Code (php): скопировать код в буфер обмена
 
Ну или как-то типа того...
Back to top
Александр Шустов
Заглянувший



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

Location: Москва

PostPosted: Thu Dec 28, 2006 3:11 pm (спустя 13 минут; написано за 1 минуту 19 секунд)
   Post subject:
Reply with quote

Гость wrote:
Оказывается не все совсем все ок...
Что-то мне подсказывает, что у <INPUT type="image" /> стандартом не предусмотрено атрибута value. Да и зачем он Вам мог понадобиться?
Back to top
View user's profile Send private message
Сергей П.
Guest





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


PostPosted: Thu Dec 28, 2006 3:15 pm (спустя 3 минуты; написано за 1 минуту 7 секунд)
   Post subject:
Reply with quote

и ещё если
<button type="submit">Кнопка</button>
то getFormMeta() выдает: type="submit", хотя логичней было бы type="action"...
Back to top
Guest






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


PostPosted: Thu Dec 28, 2006 3:19 pm (спустя 3 минуты; написано за 1 минуту 20 секунд)
   Post subject:
Reply with quote

Александр Шустов

Mozilla:

в POST записывает:
public="Публиковать"
public_x="12"
public_y="33"

но ентот браузер полностью соотвествует стандартам.
Back to top
Guest






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


PostPosted: Thu Dec 28, 2006 3:31 pm (спустя 12 минут; написано за 55 секунд)
   Post subject:
Reply with quote

Гость wrote:
<input name="public" value="Публиковать" type="image" src="..." />
Кстати это атрибут соотвествует стандарту XHTML 1.0 Transitional, проверено валидатором validator.w3.org/check.
Back to top
Александр Шустов
Заглянувший



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

Location: Москва

PostPosted: Thu Dec 28, 2006 4:12 pm (спустя 40 минут; написано за 4 секунды)
   Post subject:
Reply with quote

Хорошо, по стандарту для данной ситуации value идет как необязательный атрибут, но все-таки зачем он Вам? Единственное применение, которое приходит в голову это вывести пользователю название кнопки.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Thu Dec 28, 2006 4:22 pm (спустя 9 минут; написано за 9 секунд)
   Post subject:
Reply with quote

Сергей П. wrote:
если
<button type="submit">Кнопка</button>
то getFormMeta() выдает: type="submit", хотя логичней было бы type="action"...
Упс. Это баг. Возьмите свежую версию с
dklab.ru/wsvn/lib/trunk/lib/HTML/
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Fri Dec 29, 2006 7:30 am (спустя 15 часов 8 минут; написано за 7 минут 1 секунду)
   Post subject:
Reply with quote

Александр Шустов wrote:
Хорошо, по стандарту для данной ситуации value идет как необязательный атрибут, но все-таки зачем он Вам?
Для передачи данных обработчику формы, так же как и все др. элементы <input>.

<input type="image"> - призван работать как обычная кнопка submit, а если таких кнопок на форме несколько, то как прикажете определять, какая именно нажата?
Можно конечно по атриб. name: если value у кнопки с name="name" установлено, то нажата именно эта кнопка. Но тогда нам приходится закреплять опред. действие за именем кнопки, что для меня (не хочу, конечно, навязывать свое мнение другим) не совсем логично получается. Поэтому более логично (по моему мнению) будет, действие определять по значению кнопки т.е. по тому, что наход. в value... ;-)
Back to top
Александр Шустов
Заглянувший



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

Location: Москва

PostPosted: Fri Dec 29, 2006 12:16 pm (спустя 4 часа 45 минут; написано за 3 минуты 13 секунд)
   Post subject:
Reply with quote

На мой взгляд более логично определять нажатую кнопку по name, тем более, что с MetaForm используется switch по имени нажатой кнопки:
Code (php): скопировать код в буфер обмена
switch ($metaFormAction->process()) {
    case 'INIT':
        // Called when script is called via GET method.
        // No buttons are pressed yet, initialize form fields.
        break;
       
    case 'doSend':
        // Called when doSend is pressed and THERE ARE
        // NO VALIDATION ERRORS! Process the form.
        break;
}
Хотя если взглянуть с точки зрения единообразия получаемой информации, может Вы и правы и value должен быть в результирующем массиве...
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Fri Dec 29, 2006 12:57 pm (спустя 41 минуту; написано за 1 минуту 35 секунд)
   Post subject:
Reply with quote

Гость wrote:
если таких кнопок на форме несколько, то как прикажете определять, какая именно нажата? Можно конечно по атриб. name
Не "можно, конечно", а именно "НУЖНО, конечно". Это, к тому же, стандартный алгоритм работы MetaFormAction: определение нажатой кнопки по ее имени, а не по значению. Предлагаю данный вопрос закрыть, т.к. он, по моему глубокому убеждению, не представляет практической ценности.
Александр Шустов wrote:
Хотя если взглянуть с точки зрения единообразия получаемой информации, может Вы и правы и value должен быть в результирующем массиве...
А он там и есть, содержит (x, y) - единственно полезную на практике информацию.
Back to top
View user's profile Send private message Send e-mail
Наталья Андриец
Участник форума



Joined: 14 Aug 2006
Posts: 35
Карма: 2
   поощрить/наказать

Location: Санкт-Петербург

PostPosted: Wed Jan 10, 2007 11:20 pm (спустя 12 дней 10 часов 22 минуты; написано за 2 минуты 30 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
 почти в любом сайте с хотя бы минимальной многоязычности есть таблицы словарных констант
Дмитрий! Простите за ламерский вопрос, но где можно посмотреть, как эту таблицу сделать? В отдельный файл ассоциативный массив с ключами-названиями ошибок и значениями - текстами для пользователя? Потом вызов по ключу и вывод?
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 105
   поощрить/наказать

Location: Москва

PostPosted: Fri Jan 12, 2007 8:20 am (спустя 1 день 9 часов 32 секунды; написано за 20 секунд)
   Post subject:
Reply with quote

Наталья Андриец wrote:
В отдельный файл ассоциативный массив с ключами-названиями ошибок и значениями - текстами для пользователя? Потом вызов по ключу и вывод?
Да хотя бы так.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Fri Jan 12, 2007 9:54 am (спустя 1 час 34 минуты; написано за 5 минут 14 секунд)
   Post subject:
Reply with quote

Рекомендую, кстати, в качестве хранилища для словаря использовать формат gettext PO. Именно PO, а не MO - смысла из PHP работать с откомпилированными mo-файлами лично я не вижу, прироста производительности никакого, если не используются php.net/gettext. А применять php.net/gettext я бы не рекомендовал, т.к. там для того, чтобы mod_php увидел изменения в mo-файле, надо апач перезапускать.

Читать PO можно при помощи pear.php.net/package/File_Gettext (к примеру).

Преимущества PO в том, что есть разные программы для извлечения строковых констант из исходников; например, poedit (она, правда, глючная, но кое-как работает, и хороших gui-шных аналогов я не знаю).

В шаблонах пишем так:
Code (php): скопировать код в буфер обмена
<div>
<?=L("Report spam")?>
</div>
...
<div>
<?=L("User %s is an idiot!", $userName)?>
</div>
(В данном примере ключом в словаре является прямо "User %s is an idiot!"; это идеология gettext, делать такие ключи, очень правильная.)

Определяем функцию L(), которая ищет по загруженному ранее PO-хранилищу, а потом при помощи php.net/func_get_args, php.net/call_user_func_array, php.net/sprintf формирует строку на нужном языке.
Back to top
View user's profile Send private message Send e-mail
Satyrius
Участник форума



Joined: 28 Mar 2006
Posts: 110
Карма: 2
   поощрить/наказать

Location: Москва

PostPosted: Tue Jan 16, 2007 1:51 pm (спустя 4 дня 3 часа 56 минут; написано за 1 минуту 52 секунды)
   Post subject:
Reply with quote

Идея библиотеки понятна. Но только я что-то не совсем понял как получать данные с формы? Делать что-то вроде
Code (php): скопировать код в буфер обмена
$data = $metaForm->getFormMeta()
а потом копаться в полученном массиве?
Back to top
View user's profile Send private message
Наталья Андриец
Участник форума



Joined: 14 Aug 2006
Posts: 35
Карма: 2
   поощрить/наказать

Location: Санкт-Петербург

PostPosted: Tue Jan 16, 2007 2:41 pm (спустя 50 минут; написано за 22 секунды)
   Post subject:
Reply with quote

Satyrius,
нет, они в массиве $_POST приходят, как обычно.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Tue Jan 16, 2007 3:34 pm (спустя 52 минуты; написано за 1 минуту 36 секунд)
   Post subject:
Reply with quote

На самом деле, можно как из $_POST брать, так и "копаться в массиве".

В массиве удобно копаться изнутри валидаторов или при организации цикла по метаданным (например, для вставки значений в БД полей, у которых прописан мета-атрибут meta:dbfield; логика может быть любой и зависит только от Вашей фантазии), в $_POST - во всех остальных случаях.
Back to top
View user's profile Send private message Send e-mail
Satyrius
Участник форума



Joined: 28 Mar 2006
Posts: 110
Карма: 2
   поощрить/наказать

Location: Москва

PostPosted: Tue Jan 16, 2007 10:45 pm (спустя 7 часов 11 минут; написано за 10 минут 2 секунды)
   Post subject:
Reply with quote

Дмитрий Котеров
Сегодня опробовал библиотеку на практике -- просто замечательно!

Также выскажу свое пожелание/предложение (правда оно уже звучало (forum.dklab.ru/viewtopic.php?p=122461#122461)):
Путник wrote:
meta:transform="trim capitalize"
Дмитрий Котеров wrote:
meta:transform можете сделать как расширение библиотеки HTML_MetaFormAction (производный класс). В базовой версии, я считаю, ему делать нечего.
Предложение очень даже хорошее, и данная возможность будет полезна. Библиотека сильна, назначение полям валидаторов идея простая и очень эфективная, избавляет от рутины вручную проверять пришедшие данные. Но остается еще один момент: после получения валидных данных мы уже обрабатываем и, например записываем их в БД. Перед этой операцией обычно применяется функция trim, производятся некоторые преобразования. Можно сделать возможность указания мета-атрибута полю, в котором будут указаны функции, обрабатывающие данные после их успешной валидации. Это позволит нам избавиться от лишнего кода при получении данных -- получаем валидные данные + уже преобразованные в тот вид в котором мы их будем использовать дальше.
Back to top
View user's profile Send private message
Наталья Андриец
Участник форума



Joined: 14 Aug 2006
Posts: 35
Карма: 2
   поощрить/наказать

Location: Санкт-Петербург

PostPosted: Wed Jan 17, 2007 6:36 pm (спустя 19 часов 51 минуту; написано за 3 минуты 6 секунд)
   Post subject: в форме редактирования не работает валидатор filled
Reply with quote

Возникла проблема, не знаю, с чем связанная: есть форма добавления пользователя, она же редактирования. На редактирования она заполняется при помощи HTML_FormPersister, валидуется с помощью meta:validator="filled" на заполненность полей. При добавлении все работает нормально. Но при редактировании, если удалить значение из обязательного поля, валидатор filled не срабатывает и форма сабмититься без сообщения об ошибке. Как с этим справиться, подскажите, пожалуйста?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Thu Jan 18, 2007 12:15 am (спустя 5 часов 38 минут; написано за 29 секунд)
   Post subject:
Reply with quote

Мало информации.
Скорее всего, Вы при редактировании вообще не обращаетесь к MetaFormAction::process().
Back to top
View user's profile Send private message Send e-mail
Наталья Андриец
Участник форума



Joined: 14 Aug 2006
Posts: 35
Карма: 2
   поощрить/наказать

Location: Санкт-Петербург

PostPosted: Thu Jan 18, 2007 12:22 am (спустя 6 минут; написано за 18 секунд)
   Post subject: да, наверное, в этом дело!
Reply with quote

Да, наверное, все дело в этом! Спасибо!!!
Back to top
View user's profile Send private message
Arpanx
Заглянувший



Joined: 05 Feb 2007
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Mon Feb 05, 2007 5:14 pm (спустя 18 дней 16 часов 52 минуты; написано за 5 минут 52 секунды)
   Post subject:
Reply with quote

Подскажите как использовать одновременно JsHttpRequest и HTML_MetaForm. Сделал пример. Форма с текстовым полем и кнопкой Submit и внизу подгружаю таблицу в DIV. Так вот по отдельности работает и обработка формы (валидация, заполнение) и подгрузка таблицы в DIV.
Code (html): скопировать код в буфер обмена
<input (december.com/html/4/element/input.html) type="button" value="Найти_1"  onclick="doLoad(this.form.INVENTAR.value)"> (december.com/html/4/element/.html)
<input (december.com/html/4/element/input.html) type="submit" value="Найти_2"> (december.com/html/4/element/.html)
Теперь пробую чтобы прошла проверка и загрузились данные в DIV. Пробую вот так. На секунду появляется DIV и тутже исчезает.
Code (html): скопировать код в буфер обмена
<input (december.com/html/4/element/input.html) type="submit" value="_3"  onclick="doLoad(this.form.INVENTAR.value)"> (december.com/html/4/element/.html)
Code (Apache config): скопировать код в буфер обмена
2007:15:49:22 +0200] "POST /index2.php HTTP/1.1" 200 1258
2007:15:49:22 +0200] "GET /lib/JsHttpRequest/JsHttpRequest.js HTTP/1.1" 304 -
2007:15:49:23 +0200] "POST /t_simple_loader.php?PHPSESSID=jkgnkutim9i2pu9d25aiidrsb6&JsHttpRequest=11706833637500-xml HTTP/1.1" 200 24569
Поделитесь примером. Спасибо.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Wed Feb 07, 2007 11:40 am (спустя 1 день 18 часов 25 минут; написано за 1 минуту 48 секунд)
   Post subject:
Reply with quote

При чем тут MetaForm, если Вы передаете через JsHttpRequest значение всего лишь одного поля? Он и не вызывается, вероятнее всего. Почему появляется и исчезает DIV - это уже Вам лучше знать, отлаживайте скрипт.

В принципе, MetaForm МОЖНО использовать вместе с JsHttpRequest, но только в режиме "отправка формы целиком" последнего. Я, правда, не проверял, но должно работать.
Back to top
View user's profile Send private message Send e-mail
Евгений_другой
Guest





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


PostPosted: Tue Feb 13, 2007 9:48 am (спустя 5 дней 22 часа 8 минут; написано за 3 минуты 4 секунды)
   Post subject:
Reply with quote

простите, я правильно понял что форма защищается от подделки?

на сайте:
------
вставляю в скрипт с формой
Code (php): скопировать код в буфер обмена
<?php ## t_metainfo_draw.php: draw the form with attached metadata.
include_once "../data/HTML_MetaFrom/lib/config.php";
include_once "../data/HTML_MetaFrom/HTML_FormPersister/lib/config.php";
include_once "../data/HTML_MetaFrom/lib/HTML/MetaForm.php";
// Create new MetaForm object (processor).
$metaForm =& new HTML_MetaForm('secret_digital_signature_YS0lTgit');
// Parse HTML output & extract form meta-information.
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$metaForm, 'process'));
?>
тут форма
вставляю в скрипт приемник формы
Code (php): скопировать код в буфер обмена
<?php ## t_meta_process.php: process metadata attached to form.
include_once "../data/HTML_MetaFrom/lib/config.php";
include_once "../data/HTML_MetaFrom/HTML_FormPersister/lib/config.php";
include_once "../data/HTML_MetaFrom/lib/HTML/MetaForm.php";
$metaForm =& new HTML_MetaForm('secret_digital_signature_YS0lTgit');
$metaForm->getFormMeta();
?>
тут вывод поста
-------
открываю форму на сайте, сохраняю как html на рабочий стол, правлю action формы, чтобы отправлялась на сайт
открываю форму с рабочего стола, отправляю и все выводится
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Tue Feb 13, 2007 10:55 am (спустя 1 час 6 минут; написано за 2 минуты 37 секунд)
   Post subject:
Reply with quote

Во-первых, проверку осуществляет MetaFormAction, а не MetaForm (читайте документацию внимательнее). Во-вторых, "подделка" - это вставка в форму полей, которых там быть не должно, либо передача данных, которые недопустимы. В Ваших же действиях ничего криминального нет: форма та же самая (и даже action совпадает, если его перевести в абсолютную форму http://домен/URI), а откуда она отправляется - с сайта или же с Рабочего стола - совершенно не важно.
Back to top
View user's profile Send private message Send e-mail
User21
Guest





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


PostPosted: Mon Feb 26, 2007 7:26 pm (спустя 13 дней 8 часов 31 минуту; написано за 1 минуту 13 секунд)
   Post subject:
Reply with quote

Хм, прошу прощения, видимо, ламерский вопрос задаю... но чем отличается элемент массива items от tree в результате работы $form_state = $metaFormAction->process();?

Похоже, эти элементы (массивы) идентичны?...
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Tue Feb 27, 2007 12:33 am (спустя 5 часов 6 минут; написано за 45 секунд)
   Post subject:
Reply with quote

Идентичны, если у Вас поля формы называются abc, def и т.д. А если abc[def] и abc[xyz], тогда в tree будет древовидное представление, а в items - "плоское". Попробуйте сами.
Back to top
View user's profile Send private message Send e-mail
User21
Guest





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


PostPosted: Tue Feb 27, 2007 1:56 am (спустя 1 час 22 минуты; написано за 7 секунд)
   Post subject:
Reply with quote

Я понял, спасибо!
Back to top
Nikita
Заглянувший



Joined: 22 Mar 2007
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Thu Mar 29, 2007 1:56 pm (спустя 1 месяц 2 дня 12 часов 39 секунд; написано за 1 минуту 51 секунду)
   Post subject:
Reply with quote

Подскажите, пожалуйста, как правильно использовать MetaForm для обработки двух и более форм на странице.
Такой подход не работает:
Code (php): скопировать код в буфер обмена
ob_start (www.php.net/ob_start)(array (www.php.net/array)('HTML_FormPersister', 'ob_formpersisterhandler'));
$metaForm =& new HTML_MetaForm('secret_digital_signature_YS0lTgit');
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$metaForm, 'process'));
$metaForm2 =& new HTML_MetaForm('secret_digital_signature_YS0lTgit');
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$metaForm2, 'process'));
$metaFormAction =& new HTML_MetaFormAction($metaForm);
$metaForm2Action =& new HTML_MetaFormAction($metaForm2);

switch ($metaFormAction->process()) {
//..
}

switch ($metaForm2Action->process()) {
//...
}
Если вызвать $metaForm->getFormMeta() и $metaForm2->getFormMeta(), то они выведут одно и то же.
Заранее спасибо.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Thu Mar 29, 2007 11:19 pm (спустя 9 часов 22 минуты; написано за 50 секунд)
   Post subject:
Reply with quote

И правильно, не нужно 2 метаформа, достаточно и одного. Вы просто называйте в них submit-кнопки по-разному, чтобы отличить одну форму от другой.
Back to top
View user's profile Send private message Send e-mail
Nikita
Заглянувший



Joined: 22 Mar 2007
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Fri Mar 30, 2007 12:02 am (спустя 42 минуты; написано за 6 минут 51 секунду)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
И правильно, не нужно 2 метаформа, достаточно и одного. Вы просто называйте в них submit-кнопки по-разному, чтобы отличить одну форму от другой.
Спасибо, Дмитрий. Я подсвечиваю поля форм таким образом (у элементов в этих двух формах разные id, с этим все ОК):
Code (php): скопировать код в буфер обмена
                    <?foreach ($metaFormAction->getErrors() as $e) {?>
                    var e = document.getElementById('<?=@$e['name']?>' + '_tr')
                    || document.getElementById('<?=@$e['meta']['tr']?>');
                    e.style.background="#FFBBBB";
                    <?}?>
Но в дополнение к этому я хотел вывести сообщение типа "Please fill fields marked with red." рядом с нужной формой.
Сразу не догадался, что определить рядом с какой формой выводить сообщение можно элементарно
Code (php): скопировать код в буфер обмена
<? if (($metaFormAction->getErrors() and isset (www.php.net/isset)($_POST['submit1']))) { ?>...
.
Вначале писал просто
Code (php): скопировать код в буфер обмена
<? if (($metaFormAction->getErrors()) { ?>...
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Wed Apr 25, 2007 10:43 am (спустя 26 дней 10 часов 41 минуту; написано за 1 минуту 37 секунд)
   Post subject:
Reply with quote

Code (html): скопировать код в буфер обмена
<input (december.com/html/4/element/input.html) type="hidden" name="HTML_MetaForm" value="..." /> (december.com/html/4/element/.html)
Нарушает валидность XHTML 1.1, так как вставляется сразу после элемента <form>. Нужно поместить инпут в блочный элемент и тогда валидатор будет "счастлив":
Code (html): скопировать код в буфер обмена
<div (december.com/html/4/element/div.html) style="display:none"> (december.com/html/4/element/.html)<input (december.com/html/4/element/input.html) type="hidden" name="HTML_MetaForm" value="..." /> (december.com/html/4/element/.html)</div>
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Wed Apr 25, 2007 11:51 am (спустя 1 час 7 минут; написано за 48 секунд)
   Post subject:
Reply with quote

Мне кажется, в некоторых браузерах элементы, помещенные в display:none, не посылаются при отправке формы. Может быть, лучше

position:absolute; visiblity:hidden

?
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Thu May 31, 2007 2:16 pm (спустя 1 месяц 6 дней 2 часа 25 минут; написано за 4 минуты 5 секунд)
   Post subject:
Reply with quote

Не знаю баг это или нет, но получается что возникает ошибка. Метод _checkDynamicField возвращает false и в результате $metaFormAction->process() возвращает NULL и сообщение об ошибке: "Bad FORM "action" attribute: expected %s, got %s!". Это происходит после второго прогона скрипта, когда пользователь нажимает кнопку Submit.

Скорее всего что-то нетак в обработке тега action (судя по сообщению об ошибке), когда там прописано имя файла. Вот код для проверки скрипта:
Code (php): скопировать код в буфер обмена
<?php
function dump()
{
        echo (www.php.net/echo) '<pre>';

        $num_args = func_num_args (www.php.net/func_num_args)();

        for ($i = 0; $i < $num_args; ++$i)
        {
                print_r (www.php.net/print_r)(func_get_arg (www.php.net/func_get_arg)($i));
                echo (www.php.net/echo) "\n\n";
        }

        echo (www.php.net/echo) '</pre>';
        exit (www.php.net/exit);
}

header (www.php.net/header)('Content-Type: text/html; charset=utf-8');

// Инициализация.
if (!defined (www.php.net/defined)("PATH_SEPARATOR"))
        define (www.php.net/define)("PATH_SEPARATOR", getenv (www.php.net/getenv)("COMSPEC")? ";" : ":");

ini_set (www.php.net/ini_set)("include_path", ini_get (www.php.net/ini_get)("include_path").PATH_SEPARATOR.str_replace('\\', '/', dirname (www.php.net/dirname)(__FILE__).'/PEAR'));

require_once('PEAR.php');
defined (www.php.net/defined)('PEAR_ERROR_RETURN') or die (www.php.net/die)('Не могу подключить PEAR.');

require_once 'HTML/FormPersister.php';
require_once 'HTML/MetaForm.php';
require_once "HTML/MetaFormAction.php";

$metaForm =& new HTML_MetaForm('avaasdfdasfbaw4#^f2');
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$metaForm, 'process'));

$metaFormAction =& new HTML_MetaFormAction($metaForm);

switch ($metaFormAction->process()) {
    case 'INIT':
        break;
       
    case 'doSend':
                break;
       
        // Возникли ошибки.
        case NULL:
                dump($metaFormAction->getErrors());
}

?>
<form action="<?= basename($_SERVER['PHP_SELF']) ?>" method="post">
<input type="text" name="test">
<input type="submit">
</form>
Ошибка похоже где-то здесь (метод _checkDynamicField):
Code (php): скопировать код в буфер обмена
        // All values must be in allowed list.
        // array_diff() documentation: two elements are considered
        // equal if and only if (string) $elem1 === (string) $elem2.
        if (array_diff (www.php.net/array_diff)($got, $allowed)) {
            $exp = count (www.php.net/count)($allowed) > 1? "(" . join (www.php.net/join)('|', $allowed) . ')' : "'{$allowed[0]}'";   
            $got = count (www.php.net/count)($got) > 1? "(" . join (www.php.net/join)(', ', $got) . ')' : "'{$got[0]}'";
            $error = array_merge (www.php.net/array_merge)((array (www.php.net/array))$error, array (www.php.net/array)($exp, $got));
            $this->validationError($name, $error);
                dump($got, $allowed);
            return false;
        }
dump - это моя функция. Она выдает вот что:
Code (php): скопировать код в буфер обмена
'/tester/index.php'

Array (www.php.net/array)
(
    [0] => index.php
)
Так и должно быть? Я что-то делаю нетак или это баг?
Back to top
Валера Ермолин
Guest





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


PostPosted: Fri Jun 15, 2007 7:55 pm (спустя 15 дней 5 часов 39 минут; написано за 3 минуты 9 секунд)
   Post subject:
Reply with quote

Доброго времени суток. Просмотрел весь форум, или не внимательный я, но не могу найти ответ на свой вопрос. Подскажите плиз. Можно ли менять проверяемое значение поля в функции валидаторе.
Пробовал так:
Code (php): скопировать код в буфер обмена
public function validator_length(&$val)
{
   $val = 'test';
       
   return true;
}
Спасибо.
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Sat Jun 16, 2007 5:50 pm (спустя 21 час 55 минут; написано за 18 секунд)
   Post subject:
Reply with quote

Менять нельзя. Валидатор - это исключительно функция проверки данных, а не их преобразования.
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 Previous  1, 2, 3, 4, 5  Next
Page 3 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