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

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



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

Location: Москва

PostPosted: Wed Jun 27, 2007 4:29 pm (написано за 6 минут 27 секунд)
   Post subject:
Reply with quote

Дмитрий, у меня есть предложение внести исправление в метод process() класса HTML_MetaFormAction.
Вместо проверки на существование метода:
Code (php): скопировать код в буфер обмена
// Check if we are subclassed. Function-based validators have priority.
if (!is_callable (www.php.net/is_callable)($func) && method_exists (www.php.net/method_exists)($this, $func)) {
    $func = array (www.php.net/array)(&$this, $func);
}
ввести проверку вида:
Code (php): скопировать код в буфер обмена
// Check if we are subclassed. Function-based validators have priority.
if (!is_callable (www.php.net/is_callable)($func) && is_callable (www.php.net/is_callable)(array (www.php.net/array)($this, $func))) {
    $func = array (www.php.net/array)(&$this, $func);
}
Это позволит для объявления валидаторов использовать метод __call() в потомке HTML_MetaFormAction.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Mon Jul 02, 2007 2:26 pm (спустя 4 дня 21 час 57 минут; написано за 8 секунд)
   Post subject:
Reply with quote

Макаров Артём wrote:
HTML_MetaFormAction
Да, хорошая идея. Сделал.
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Wed Jul 04, 2007 11:32 am (спустя 1 день 21 час 5 минут; написано за 2 минуты 1 секунду)
   Post subject:
Reply with quote

В "Internet Explorer 7.0" (в отличие от Mozilla Firefox и Opera) выдает следующую ошибку:

Bad FORM "action" attribute: expected %s, got %s!'/order/''test.ru/order/'
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Fri Jul 06, 2007 11:59 pm (спустя 2 дня 12 часов 26 минут; написано за 29 секунд)
   Post subject:
Reply with quote

Мало информации. Опишите проблему подробнее. Проверьте также, все ли кавычки в HTML закрыты.
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Mon Jul 09, 2007 11:24 am (спустя 2 дня 11 часов 25 минут; написано за 2 минуты 26 секунд)
   Post subject:
Reply with quote

Ошибку выдает независимо от атрибута action.
Каким бы он ни был: полный url, относительный url или вообще без атрибута action.
Back to top
Guest






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


PostPosted: Mon Jul 09, 2007 11:28 am (спустя 4 минуты; написано за 1 секунду)
   Post subject:
Reply with quote

Причем только в "Internet Explorer 7.0"
Back to top
Путник
Участник форума



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


PostPosted: Sat Aug 04, 2007 11:34 pm (спустя 26 дней 12 часов 6 минут; написано за 23 минуты 8 секунд)
   Post subject:
Reply with quote

Сегодня предприянл попытку интеграции HTML_MetaForm и HTML_FormPersister в фреймворк CodeIgniter 1.54. Так как не все заработало так, как должно, появилась куча вопросов, на которые, очень надеюсь, у участников этого формуа найдутся ответы.

Все четыре файла (FormPersister.php, SemiParser.php, MetaForm.php, MetaFormAction.php) поместил в папку application/libraries. Согласно требованиями CodeIgniter имя файла библиотеки должно совпадать с именем класса, поэтому переименовал все файлы, добавив префикс HTML_. Хочу использовать следующую схему обработки:
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);
Подключаю библиотеки:
Code (php): скопировать код в буфер обмена
$this->load->library('html_semiparser');
$this->load->library('html_formpersister');
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$this->html_semiparser, 'process'));
$this->html_semiparser->addObject($this->html_formpersister);
и получаю первую ошибку:
Fatal error: Cannot redeclare class html_semiparser in ...\application\libraries\HTML_SemiParser.php on line 63

Но оно и понятно, класс html_semiparser уже определен при вызове $this->load->library('html_semiparser'), поэтому строку 63 я просто закомментировал, после чего FormPersister заработал как надо. Ну или почти как надо. Автоматически не генерируется список select при использоватнии такой конструкции:
Code (html): скопировать код в буфер обмена
<select (december.com/html/4/element/select.html) name="vendors" id="vendors"> (december.com/html/4/element/.html)
<option (december.com/html/4/element/option.html) value=""> (december.com/html/4/element/.html)</option>
$data[vendors]
</select>
В функции контроллера в массив $data['vendors'] передается список производителей из базы данных. В чем причина такого поведения разобраться не удалось. Подскажите, в чем ошибка? Пришлось формировать список через foreach.
После подключения HTML_MetaForm
Code (php): скопировать код в буфер обмена
$this->load->library('html_metaform', 'my_secret_code');
$this->html_semiparser->addObject($this->html_metaform);
$this->load->library('html_metaformaction', $this->html_metaform);
обнаружилась все та же проблема с невозможностью переопределить классы html_semiparser, html_metaform, html_formpersister, для чего пришлось закомментировать строки, отвечающие за подключение этих классов в файлах HTML_MetaForm.php, HTML_MetaFormAction.php. Сообщения об ошибках больше не выводились, но обнаружился странный баг, проявляющийся в том, перестали запоминаться значения в списках select, т.е. при отправке формы значение сбрасывалось на установленное по умолчанию. И при вызове print_r($this->html_metaform->getFormMeta()) в результирующем массиве отсутсвуют значения select-полей. С text- и submit-полями таких проблем нет. Может ли быть это связано с тем, что второй из списков select генерируется с помощью JavaScript на основании данных из первого?

Также не работает встроенный валидатор filled, хотя $this->html_metaform->getFormMeta() показывает, что он задан. Вызов print_r($this->html_metaformaction->getErrors()) возвращает пустой массив. В чем причина такого поведения HTML_MetaForm у меня нет ни малейших соображений.

Буду глубоко признателен за любые дельные советы, указания на ошибки etc...
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Sat Aug 04, 2007 11:58 pm (спустя 24 минуты; написано за 3 минуты 11 секунд)
   Post subject:
Reply with quote

Путник wrote:
Согласно требованиями CodeIgniter имя файла библиотеки должно совпадать с именем класса
Это очень плохо, т.к. противоречит более универсальным соглашениям по именованию PEAR. А Вы уверены, что Вам нужно подключать эти модули именно через load->library? Ведь другие модули PEAR Вы так не подключаете, верно (иначе бы никто, использующий CodeIgniter, не мог бы использовать PEAR)? А в них тот же стандарт кодирования.

Рекомендую Вам все-таки следовать стандартам PEAR, тогда ничего не надо будет комментировать.
Путник wrote:
Автоматически не генерируется список select при использоватнии такой конструкции
Проверьте, действительно ли эта переменная записывается в $GLOBALS. При автозаполнении option-ов сканируются только переменные из $GLOBALS.
Путник wrote:
Может ли быть это связано с тем, что второй из списков select генерируется с помощью JavaScript на основании данных из первого?
HTML_MetaForm "ничего не знает" про JavaScript. Соответственно, в values, полученных через него, этих значений может и не быть.
Но FormPersister должен работать.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Sun Aug 05, 2007 12:04 am (спустя 5 минут; написано за 56 секунд)
   Post subject:
Reply with quote

Кстати, учтите, что порядок подключения библиотек к SemiParser-у должен быть именно таким, как у Вас в первом примере: сначала MetaFrom, потом - FormPersister. В противном случае они будут друг с другом конфликтовать. Может быть, у Вас как раз порядок и перепутался?
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



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


PostPosted: Sun Aug 05, 2007 1:48 pm (спустя 13 часов 43 минуты; написано за 5 минут 33 секунды)
   Post subject:
Reply with quote

Попробовал подключить библиотеки в соответствии с правилами PEAR, согласно инструкциям, приведенным в этой статье codeigniter.com/wiki/PEAR_integration/. Теперь файлы библиотек остались без изменений и ничего не пришлось комментировать, но остались те же самые проблемы. После подключения MetaForm не сохраняется текущее значение в select, значения из select не попадает в результирующий массив данных, не происходит валидация формы. Последовательность подключения я вроде бы не нарушил. Вот мой код:
Code (php): скопировать код в буфер обмена
$this->load->library(array (www.php.net/array)('pearloader', 'session'));
$this->sp = $this->pearloader->load('HTML','SemiParser');
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$this->sp, 'process'));
$this->mf = $this->pearloader->load('HTML','MetaForm', '7424df571e6cab8160d808d3d19b14c3');
$this->sp->addObject($this->mf);
$this->fp = $this->pearloader->load('HTML','FormPersister');
$this->sp->addObject($this->fp);
$this->ma = $this->pearloader->load('HTML','MetaFormAction', $this->mf);

//
print_r (www.php.net/print_r)($this->mf->getFormMeta());
print_r (www.php.net/print_r)($this->ma->getErrors());
А так выглядит код формы:
Code (html): скопировать код в буфер обмена
<form (december.com/html/4/element/form.html) action="/find/" method="post"> (december.com/html/4/element/.html)

<label> (december.com/html/4/element/label.html)Марка:
<select (december.com/html/4/element/select.html) name="vendors" id="vendors" onChange="upload('vendors','models','/ajax/get_models/','Не выбрана марка','Загрузка данных')"> (december.com/html/4/element/.html)
<option (december.com/html/4/element/option.html) value=""> (december.com/html/4/element/.html)</option>
< (december.com/html/4/element/.html)?php foreach ($vendors as $key=> (december.com/html/4/element/.html)$val):?>
<option (december.com/html/4/element/option.html) value="<?=$key;?>"><?=$val;?></option>
<?php endforeach;?>
</select>
</label>

<label>Модель:
<select name="models" id="models">
<?php if ($this->session->userdata('models')):?>
<?php foreach ($this->session->userdata('models') as $key=>$val):?>
<?php if ($this->input->post('models') == $key):?>
<option value="< (december.com/html/4/element/.html)?=$key;?> (december.com/html/4/element/.html)
" selected="selected">< (december.com/html/4/element/.html)?=$val;?> (december.com/html/4/element/.html)</option>
< (december.com/html/4/element/.html)?php else:?> (december.com/html/4/element/.html)
<option (december.com/html/4/element/option.html) value="<?=$key;?>"><?=$val;?></option>
<?php endif;?>
<?php endforeach;?>
<?php else:?>
<option value="">Выберите марку</option>
<?php endif;?>
</select>
</label>

<label>Цена:
<input name="price" type="text" meta:validator="filled"/>
</label>

<label>Год&nbsp;выпуска:
<input name="year" type="text" meta:validator="filled" />
</label>
<br /><br /><br /><br /><br /><br /><br />
<input type="submit" name="search" value="Найти">
</form>
Мозги кипят, но толку от этого не много :).
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



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


PostPosted: Sun Aug 05, 2007 4:40 pm (спустя 2 часа 52 минуты; написано за 2 минуты 30 секунд)
   Post subject:
Reply with quote

Все это очень странно.
Вот пример кода, использующего комбинацию библиотек и работающего правильно:
dklab.ru/lib/HTML_MetaForm/demo/test/HTML_MetaForm/t_combine.php
Code (php): скопировать код в буфер обмена
<?php
include_once "../../lib/config.php";
include_once "../../HTML_FormPersister/lib/config.php";
include_once "HTML/FormPersister.php";
include_once "HTML/MetaForm.php";
include_once "HTML/MetaFormAction.php";

$SemiParser =& new HTML_SemiParser();
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$SemiParser, 'process'));

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

$FormPersister =& new HTML_FormPersister();
$SemiParser->addObject($FormPersister);

$metaFormAction =& new HTML_MetaFormAction($MetaForm);
$metaFormAction->process();
?>

<form method="POST">
  <label for="t">Anything</label>:
  <input type="text" name="test" id="t" meta:validator="filled"><br>
  Select:
  <select name="sel">
    <option value="a">aaa</option>
    <option value="b">bbb</option>
  </select><br>
  <input type="submit" name="doSend" value="Send!">
</form>
<pre>
Errors: <?print_r (www.php.net/print_r)($metaFormAction->getErrors())?>
</pre>
После отправки формы значение в SELECT сохраняется, валидатор тоже вызывается.
Попробуйте запустить его у себя и посмотреть, что получится.

Кстати, обратите внимание, что у меня в примере везде используется =&, а в Вашем примере это не так. Возможно, в этом дело? И я не уверен, что в Вашем случае даже =& поможет, т.к. не факт, что $this->pearloader->load возвращает именно ссылку, а не копию объекта. Попробуйте, что ли, подключать эти модули стандартным для PHP способом, через require_once, а не через выдуманный авторами CodeIgniter окольный подход.
Back to top
View user's profile Send private message Send e-mail
Rin
Участник форума



Joined: 01 Jun 2005
Posts: 515
Карма: 182
   поощрить/наказать

Location: Москва

PostPosted: Thu Aug 09, 2007 2:32 pm (спустя 3 дня 21 час 51 минуту; написано за 9 минут 13 секунд)
   Post subject:
Reply with quote

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

У меня есть предложения.
1) Отказаться от \s в рег. выражениях, т.к. он может разбить код UTF-8.
Подробности: forum.dklab.ru/viewtopic.php?p=136718

2) Для тага <textarea> добавить функциональность автоматического вычисления области редактирования текста по значению и ширине.
Синтаксис: meta:rows="<min_rows>-<max_rows>" или meta:rows="auto".
Подробности: forum.dklab.ru/viewtopic.php?t=18765
Quote:
Как задавать JavaScript-валидаторы? Это можно делать, например, объявив функцию validator_js_filled(), которая просто через echo печатает JavaScript-код проверки. Или же все-таки собирать все валидаторы в отдельном файле, который MetaForm будет просматривать для определения, имеется ли JS-валидатор для поля или нет (при этом метаданные поля передаются в валидатор в виде JS-массива, т.е. так, что с ними можно работать непосредственно из JS). Я еще окончательно не решил, как удобнее.
По-возможности "кода в коде" лучше избегать.
А то приходится заморачиваться с квотированием слешей и кавычек.
Back to top
View user's profile Send private message Send e-mail
Наталья Андриец
Участник форума



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

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

PostPosted: Sun Sep 09, 2007 11:32 pm (спустя 1 месяц 9 часов 22 секунды; написано за 6 минут 49 секунд)
   Post subject: есть ли возможность подружить библиотеку с Zend Framework
Reply with quote

Добрый день!
Прошлась поиском, но не нашла ответа на вопрос: "Как подружить библиотеку MetaForm и FormPersister с ZendFramework?" Не могли бы вы пояснить, возможно ли это в принципе, и если возможно, то как (дайте хотя бы наводку, пожалуйста). Проблема в том, что при отладке выводит $metaFormAction->process() INIT, но форму не грузит, т.е. не рендерит вид от контроллера
Немного упрощу, чтобы было понятно, что делаю:
Code (any language): скопировать код в буфер обмена
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Tue Sep 11, 2007 8:05 pm (спустя 1 день 20 часов 32 минуты; написано за 42 секунды)
   Post subject:
Reply with quote

Что значит "не рендерит вид от контроллера"?
Вы все обработчики потоков назначили правильно?

Попробуйте сделать print_r(ob_list_handlers()) и посмотреть, какие обработчики и где назначены.
Back to top
View user's profile Send private message Send e-mail
Наталья Андриец
Участник форума



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

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

PostPosted: Sat Sep 15, 2007 2:28 pm (спустя 3 дня 18 часов 22 минуты; написано за 4 минуты 30 секунд)
   Post subject:
Reply with quote

Дмитрий, спасибо! Отработала Вашу наводку и нашла ошибку. Были неправильно подключены файлы. Я их через Zend_Loader подключала, а надо было напрямую.
Back to top
View user's profile Send private message
Наталья Андриец
Участник форума



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

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

PostPosted: Sun Sep 16, 2007 9:52 pm (спустя 1 день 7 часов 24 минуты; написано за 4 минуты 37 секунд)
   Post subject: Formpersister и HTML_MetaForm
Reply with quote

Добрый день! Продолжаю попытки подружить Zend Framework и библиотеки FormPersister и HTML_MetaForm. Подскажите, пожалуйста, чем может быть вызвана такая ошибка: Field "%s" (%s) contains non-existed value(s): expected %s, got %s! ? У меня есть селекты, заполняемые FormPersister'ом, - корректно заполняемые. Проблема похоже в том, что null приходит из функции _checkDynamicField, куда не передается список allowed-значений. Почему это может происходить? Раньше, когда я использовала библиотеки без фреймворка, таких засад не возникало и все работало корректно.

Что-то похожее уже было выше про CodeIgniter. Возможно, нашлось решение проблемы?
Библиотеки подключены так:
Code (php): скопировать код в буфер обмена
include_once "HTML/FormPersister.php";
include_once "HTML/MetaForm.php";
include_once "HTML/MetaFormAction.php";
include_once "HTML/SemiParser.php";

ob_start (www.php.net/ob_start)(array (www.php.net/array)('HTML_FormPersister', 'ob_formPersisterHandler'));
$metaForm =& new HTML_MetaForm('mysecretecode');
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$metaForm, 'process'));
$metaFormAction =& new HTML_MetaFormAction($metaForm);
Back to top
View user's profile Send private message
Наталья Андриец
Участник форума



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

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

PostPosted: Sun Sep 16, 2007 9:57 pm (спустя 4 минуты; написано за 57 секунд)
   Post subject: сама же и решила ))))
Reply with quote

Надо было подключать так:
Code (php): скопировать код в буфер обмена
include_once "HTML/FormPersister.php";
include_once "HTML/MetaForm.php";
include_once "HTML/MetaFormAction.php";
include_once "HTML/SemiParser.php";

$metaForm =& new HTML_MetaForm('mysecretecode');
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$metaForm, 'process'));
$metaFormAction =& new HTML_MetaFormAction($metaForm);

ob_start (www.php.net/ob_start)(array (www.php.net/array)('HTML_FormPersister', 'ob_formPersisterHandler'));
Оставляю и предыдущий пост - вдруг кому-то поможет.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Mon Sep 17, 2007 10:23 pm (спустя 1 день 25 минут; написано за 49 секунд)
   Post subject:
Reply with quote

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

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

$FormPersister =& new HTML_FormPersister();
$SemiParser->addObject($FormPersister);
В этом случае HTML-код парсится всего один раз, а не дважды, как в случае двукратного использования ob_start().
Back to top
View user's profile Send private message Send e-mail
alexkunin
Участник форума



Joined: 25 Feb 2006
Posts: 113
Карма: 11
   поощрить/наказать


PostPosted: Thu Sep 20, 2007 3:34 am (спустя 2 дня 5 часов 11 минут; написано за 2 минуты 23 секунды)
   Post subject:
Reply with quote

Дмитрий, в тексте статьи в листинге 11 установка об-хендлеров идет в таком порядке:
Code (php): скопировать код в буфер обмена
ob_start (www.php.net/ob_start)(array (www.php.net/array)('HTML_FormPersister', 'ob_formpersisterhandler'));
...
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$metaForm, 'process'));
А нужно ровно наоборот, иначе <select>moyaGlobalnayaPeremennaya</select> не отработает вовремя, и этот комбобокс не появится в getFormMeta. Я взял и сделал прямо по написанному, а потом минут 20 искал место захоронения собаки.
Back to top
View user's profile Send private message Send e-mail
mus
Участник форума



Joined: 06 Mar 2005
Posts: 130
Карма: -10
   поощрить/наказать


PostPosted: Sun Sep 23, 2007 3:30 pm (спустя 3 дня 11 часов 56 минут; написано за 2 минуты 18 секунд)
   Post subject:
Reply with quote

Такой вопрос: существует ли возможность валидировать сразу всю форму? То есть в валидатор передавалась бы переменная-массив всей формы и уже внутри проводилась бы вся необходимая валидация. Просто подчас возникает надобность, к примеру, сверить пароль и подтверждение пароля или проверить два поля на заполненность хотя бы одного из них (такова, подчас, бывает логика приложения). Так было бы гораздо удобнее писать различные валидаторы, действующие по умолчанию, это сократило бы исходные код проверок форм и т.д.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Wed Sep 26, 2007 4:31 pm (спустя 3 дня 1 час 49 секунд; написано за 2 минуты 38 секунд)
   Post subject:
Reply with quote

mus
1. Для сверки пароля с подтверждением можно делать так:
Code (php): скопировать код в буфер обмена
function validator_equal($value, $currentElement)
{
    $toField = @$currentElement['equal_to_field'];
    if (!$toField) return array (www.php.net/array)('validator_equal: Attribute meta:equal_to_field required!');
    $metas = $GLOBALS['Framework']->metaForm->getFormMeta();
    $toValue = $metas['items'][$toField]['value'];
    return $toValue == $value;
}
<input type=password name="Password">
<input type=password name="Password2" meta:validator="equal" meta:equal_to_field="Password">

2. Если нужны проверки всей формы, их нужно делать вручную. Автоматику тут никак не получится использовать, т.к. все формы разные, писать для них функции-валидаторы нет смысла. Вы можете вызывать $MetaFormAction->validationError() вручную для поля, которое хотите подсветить. Например:
Code (php): скопировать код в буфер обмена
            if (!connect($_POST['host'], $_POST['port'])){
                $MetaFormAction->validationError('host', 'err_unable_connect');
                break;
            }
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Mon Oct 22, 2007 3:34 pm (спустя 25 дней 23 часа 2 минуты; написано за 2 минуты 44 секунды)
   Post subject:
Reply with quote

Спасибо за вашу библиотеку. Я новичок в ООП, и хотел бы спросить, как добавить расширение класса MetaFormAction, чтобы добавить возможность не только проверки, но и форматирования данных, введенных пользователем. Вы писали об этом тут forum.dklab.ru/viewtopic.php?p=122474#122474. Мне кажется очень удобным после обработки формы получить массив данных, полностью готовых для записи в БД.
Back to top
Дмитрий Котеров
Администратор



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


PostPosted: Tue Oct 30, 2007 1:37 pm (спустя 7 дней 22 часа 3 минуты; написано за 41 секунду)
   Post subject:
Reply with quote

Ни в коем случае нельзя так делать, т.к. это задача принципиально другого уровня абстракции. Надо отделять мух от котлет все-таки. Касарю - кесарево и т.д.
Back to top
View user's profile Send private message Send e-mail
Guest






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


PostPosted: Thu Nov 08, 2007 7:52 pm (спустя 9 дней 6 часов 15 минут; написано за 10 минут 58 секунд)
   Post subject:
Reply with quote

Хорошо, несколько перефразирую свой предыдущий вопрос по поводу преобразование данных в формах. Конечно, можно сказать, что запись данных в БД - это котлеты. Но вот другой пример. Пользователь заполняет поля формы и указывает свои имя и фамилию. Оно может сделать это, например, таким образом "иМЯ" "фаМилИЯ", или просто "имя" "фамилия". Допустим, случается ошибка валидации каких-то других полей и пользователю снова возвращается форма, но уже заполненная ранее введенными данными. И, как мне кажется, было бы очень удобно, чтобы эти данные были преобразованы к нормальному виду, задуманному создателем сайта, например "Имя" "Фамилия". То же можно сказать и про электронную почту, номера телефонов и т.п.

Кроме того (может, конечно, я делаю совершенно неправильно) я обычно передаю в фунцию массив данных из POST, а не значения отдельных полей (т.к. последних может быть очень много), и этот массив очень удобно записывается в БД, например, используя DbSimple и плэйсхолдер ?a, без написания много-многострочного SQL кода. Таким образом, описав структуру формы всего лишь один раз и в одном месте - шаблоне формы, мог бы гарантированно и без лишнего кода получить отформатированныи и безопасные данные.

Или вы считаете, что более рационально разбирать данные из POST, обрабатывать их в соответствии с еще где-то определенными правилами, а уже потом записывать в БД?
Back to top
Путник
Участник форума



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


PostPosted: Wed Nov 21, 2007 8:16 pm (спустя 13 дней 23 минуты; написано за 6 минут 46 секунд)
   Post subject:
Reply with quote

Обнаружил странное явление при совместном использовании MetaForm и FormPersister по отношению к элементу select. Если подключить библиотеки внутри класса, не работает валидация для элемента select:
Code (php): скопировать код в буфер обмена
$this->mf =& new HTML_MetaForm('secret_digital_signature_YS0lTgit');
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$this->mf, 'process'));
// Turn on FormPersister for all HTML forms.
ob_start (www.php.net/ob_start)(array (www.php.net/array)('HTML_FormPersister', 'ob_formpersisterhandler'));
// Now process the form (if posted).
$this->ma =& new HTML_MetaFormAction($this->mf);
А если вызвать библиотеки таким образом (как рекомендовалось выше, для повышения производительности):
Code (php): скопировать код в буфер обмена
$this->sp =& new HTML_SemiParser();
ob_start (www.php.net/ob_start)(array (www.php.net/array)(&$this->sp, 'process'));
$this->mf =& new HTML_MetaForm('secret_secret');
$this->sp->addObject($this->mf);
$this->fp =& new HTML_FormPersister();
$this->sp->addObject($this->fp);
$this->ma =& new HTML_MetaFormAction($this->mf);
то помимо того, что не запускаются валидаторы для select, еще и не сохраняется выбранное значение. Кстати, в примере, идущем в составе библиотеки (t_combine.php) также не запускается валидатор для select, но, хоть значения сохраняются.

Пожалуйста, подскажите, как правильно использовать эти библиотеки внутри моих классов, чтобы избежать описанных выше проблем? Ведь со всеми другими элементами форм ничего плохого не происходит, все работает на ура.
Back to top
View user's profile Send private message Send e-mail
alexkunin
Участник форума



Joined: 25 Feb 2006
Posts: 113
Карма: 11
   поощрить/наказать


PostPosted: Wed Nov 21, 2007 8:22 pm (спустя 5 минут; написано за 47 секунд)
   Post subject:
Reply with quote

Путник, ваша проблема похожа на мою. Решение описано несколькими постами выше (forum.dklab.ru/viewtopic.php?p=141874#141874). Надеюсь, поможет.
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



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


PostPosted: Wed Nov 21, 2007 8:39 pm (спустя 17 минут; написано за 1 минуту 32 секунды)
   Post subject:
Reply with quote

alexkunin, спасибо, и правда помогло. И валидаторы стали запускаться, и значения сохраняются! Только вот где-тут вроде писали, что заполнять форму, а потом ее подписывать вроде бы как небезопасно...
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



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


PostPosted: Thu Nov 22, 2007 3:37 pm (спустя 18 часов 58 минут; написано за 5 минут 4 секунды)
   Post subject:
Reply with quote

Мои знания ООП очень небольшие, поэтому обращаюсь к участникам формуа с просьбой. Пожалуйста, подскажите, как написать собственный класс-расширение для HTML_MetaForm_Action, который бы позволил реализовать модификацию получаемых из формы переменных (trim, ucfirst, strtolower etc...)? Из предыдущих сообщений видно, что Дмитрию Котерову эта идея почему-то сильно не нравится, но мне кажется, что очень удобно всего лишь один раз задать все параметы для формы, а потом спокойно получать безопасные и отформатированные данные.
Back to top
View user's profile Send private message Send e-mail
alexkunin
Участник форума



Joined: 25 Feb 2006
Posts: 113
Карма: 11
   поощрить/наказать


PostPosted: Thu Nov 22, 2007 3:52 pm (спустя 15 минут; написано за 8 минут 35 секунд)
   Post subject:
Reply with quote

Мне кажется, что Дмитрию эта идея не нравится потому, что функциональность эта к форме имеет несколько отдаленное отношение. Кроме того (лично мое мнение) чрезмерно умные формы могут очень раздражать. Вы врядли сможете предусмотреть все возможные варианты. Например, корректная регулярка для проверки e-mail имеет длину в несколько сот байт - когда-то видел, как раз в статье о чрезмерно умных формах. А фамилии бывают очень разные: какой-нибудь Юх, Мамин-Сибиряк, даже МакЛауд. Оно вам нужно?

Trim и другие подобные преобразования выглядят значительно более полезными. Но - ИМХО - было бы лучше подобные незначительные модификации делать уже перед самой вставкой в базу. Тем более, что так оно и получится, если пользователь с первого раза верно введет все данные. Иначе человек может очень стать очень раздражительным из-за постоянных мелких придирок вашего формообработчика. А если в этой же форме будет поле с паролем + подтверждение... Такое я мог бы простить только веб-интерфейсу банка.

P.S. А вот и регулярка (www.ex-parrot.com/~pdw/Mail-RFC822-Address.html). Я немного "недогнул": она более шести килобайт.
Back to top
View user's profile Send private message Send e-mail
Путник
Участник форума



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


PostPosted: Thu Nov 22, 2007 4:04 pm (спустя 11 минут; написано за 4 минуты 47 секунд)
   Post subject:
Reply with quote

Я не совсем то имел ввиду. Хотелось бы иметь возможность написать meta:modify="trim, strtolower" и получть соответственно обработанную переменную, а не просить пользователя писать только маленькими буквами и без пробелов в начале и конце. К валидации это не имеет никакого отношения, и пользователь никаких сообщений получать не должен. Это просто дополнительный MetaFormAction, который бы позвоил написать,например, так add_record_to_database($_POST), и повторно не заморачиваться с преобразованием каждой переменной к задуманному виду.
Back to top
View user's profile Send private message Send e-mail
Anarki
Заглянувший



Joined: 20 Aug 2005
Posts: 5
Карма: 2
   поощрить/наказать


PostPosted: Sun Dec 02, 2007 2:44 pm (спустя 9 дней 22 часа 40 минут; написано за 7 минут 49 секунд)
   Post subject: Re: есть ли возможность подружить библиотеку с Zend Framework
Reply with quote

Наталья Андриец wrote:
Добрый день!
Прошлась поиском, но не нашла ответа на вопрос: "Как подружить библиотеку MetaForm и FormPersister с ZendFramework?" Не могли бы вы пояснить, возможно ли это в принципе, и если возможно, то как (дайте хотя бы наводку, пожалуйста).
Недавно столкнулся с такой задачей, решил через плагины (anarkiblog.com/php/prikruchivaem-html_metaform-k-zend-framework/) .
Back to top
View user's profile Send private message
mus
Участник форума



Joined: 06 Mar 2005
Posts: 130
Карма: -10
   поощрить/наказать


PostPosted: Mon Dec 03, 2007 2:47 am (спустя 12 часов 3 минуты; написано за 43 секунды)
   Post subject:
Reply with quote

Quote:
file: поле выбора файла для закачки (функционально отличается от поля text только тем, что атрибут value содержит ассоциативный массив с информацией о закачанном файле).
Ничего подобного. У меня возвращается просто название файла. Ассоциативного массива нет... (((((
Получается, баг...
Back to top
View user's profile Send private message
Павло
Guest





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


PostPosted: Wed Dec 05, 2007 1:53 pm (спустя 2 дня 11 часов 5 минут; написано за 3 минуты 53 секунды)
   Post subject: Парсинг html форм
Reply with quote

Возможно ли с помощью данной библиотеки просто распрасить html форму??
пусть на вход подается просто урл страницы а скрипт выделяет оттуда все между <form> и </form>
и выводит в виде массива название полей и их типы к примеру
я пытался заюзать www.phpclasses.org/browse/package/1583.html
но он криво работает а разработчик не отзывается
сам в пхп пока слаб
помогите пожалуйста если можете
ася 200-5-9-2-854 helick@mail.ru
Back to top
Anarki
Заглянувший



Joined: 20 Aug 2005
Posts: 5
Карма: 2
   поощрить/наказать


PostPosted: Mon Dec 10, 2007 10:25 pm (спустя 5 дней 8 часов 32 минуты; написано за 4 минуты 27 секунд)
   Post subject: Странное поведение
Reply with quote

Вообщем, при использовании HTML_MetaForm + скрипт Javascript Dependent Selects происходит вот что - проверяются не все select. и в $metaForm->getFormMeta() нет валидаторов для двух селектов, хотя при просмотре исходного кода( в браузере) они убираются.
Код js библиотеки можно взять отсюда:
www.javascripttoolbox.com/lib/dynamicoptionlist/source.php
Пробовал на версии HTML_MetaForm из SVN то же самое.
Пример в атаче(попробуйте повыбирайте различные значения)

Я думаю, это от того, что парсер не разбирает такое:
Code (html): скопировать код в буфер обмена
<select (december.com/html/4/element/select.html) ...>
<script (december.com/html/4/element/script.html)...></script>
</select>



index.zip
 Description:
Пример

Download
 Filename:  index.zip
 Filesize:  1.42 KB
 Downloaded:  604 Time(s)

Back to top
View user's profile Send private message
begemot.
Guest





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


PostPosted: Sat Dec 22, 2007 5:38 pm (спустя 11 дней 19 часов 12 минут; написано за 51 секунду)
   Post subject:
Reply with quote

Здравствуйте.

Скажите, пожалуйста, появился ли перевод информации по этой многообещающей библиотеке на английский язык?
Back to top
Алексей432
Guest





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


PostPosted: Tue Jan 08, 2008 5:50 pm (спустя 17 дней 11 минут; написано за 57 секунд)
   Post subject:
Reply with quote

Подскажите, что за ошибка -
Code (php): скопировать код в буфер обмена
Array (www.php.net/array)
(
    [0] => Array (www.php.net/array)
        (
            [name] =>
            [message] => Array (www.php.net/array)
                (
                    [0] => Hidden field "%s" required for POST form!
                    [1] => HTML_MetaForm
                )

            [validator] =>
            [meta] =>
        )

)
Back to top
Алексей Михайлов
Guest





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


PostPosted: Tue Apr 08, 2008 11:18 pm (спустя 3 месяца 5 часов 28 минут; написано за 4 минуты 22 секунды)
   Post subject:
Reply with quote

Если на странице несколько форм, то при сабмите нужно отправлять браузер на нужный участок страницы. Делается это через указание якоря в action формы. Например, так
Code (html): скопировать код в буфер обмена
<a (december.com/html/4/element/a.html) name="thisform"> (december.com/html/4/element/.html)test form</a>
<form (december.com/html/4/element/form.html) name="test" method="post" action="#thisform"> (december.com/html/4/element/.html)
Но в этом случае не проходит проверка формы следующим кодом
Code (php): скопировать код в буфер обмена
if (!$this->_checkDynamicField(
            @$metas[$this->MFA_ATTR_DYNAMIC], $metas['original']// allowed values
            $this->metaForm->MF_REQUEST_URI,                       // got values
            $this->MFA_ERRORS['bad_form_action'],                  // error message
            array (www.php.net/array)(&$this->metaForm, '_getUriByUrl')                // allowed value modifier
        )) return null;
Как правильно и корректно решить данную проблему?
Back to top
geroy
Заглянувший



Joined: 03 Aug 2008
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Sun Aug 03, 2008 1:58 pm (спустя 3 месяца 24 дня 14 часов 39 минут; написано за 4 минуты 41 секунду)
   Post subject:
Reply with quote

Давно использую HTML_MetaForm - очень радует, однако при большом количестве элементов формы (например список всех городов в <select> или нечто подобное), мета-подпись становится также очень громоздкой. Возможно ли несколько её уменьшить?...

И ещё острый вопрос: недавно переставили систему на сервере и HTML_MetaForm перестал работать. Локально всё ок.
Все мысли сводятся к тому, что не работает ob_start()... Но решить проблему не получается - в логах всё тихо, в настройках ob_start() должен работать тоже. Может это оффтоп, но не знаю куда податься.. Прошу помощи.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



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


PostPosted: Tue Aug 19, 2008 12:22 am (спустя 15 дней 10 часов 23 минуты; написано за 1 минуту 13 секунд)
   Post subject:
Reply with quote

1. Там есть переменная $metaForm->MF_USE_VALUES = false; если так сделать, то в метаданных передаются только ключи, а вместо значений идет null. Это сильно экономит место.
2. А Вы попробуйте вручную metaform вызвать, а не через ob-обработчик:

ob_start();
code;
$s = ob_get_clean();
run_metaform($s);

Вдруг какая-то ошибка выведется...
Back to top
View user's profile Send private message Send e-mail
Борис Гаврилов
Guest





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


PostPosted: Tue Aug 26, 2008 11:27 am (спустя 7 дней 11 часов 5 минут; написано за 6 минут 39 секунд)
   Post subject:
Reply with quote

Здравствуйте!
Спасибо! Очень давно использую ваше решение. И только сейчас возник вопрос. Я использую несколько кнопок SUBMIT в одной форме, названием этих кнопок является одноименный массив с разными ключами do_action[$id] к примеру. И действие при нажатии на SUBMIT с названием массива не происходит. Пример кода:
Code (any language): скопировать код в буфер обмена
На всякий случай листинг файла do_action.php
Code (any language): скопировать код в буфер обмена
<?
//pokazqvaem znachenija vseh polei
if (isset($_POST['show_all']))
{
        foreach($_POST as $current_key=>$current_value)
        {
                if (strpos($current_key, "value_") !== false)
                {
                        $id=str_replace("value_", "", $current_key);
                        echo $id."=".$current_value."<br/>";
                }
        }
}

//pokazqvaem znachenie polja s odinakovqm indeksom po otnosheniju k SUBMIT
if (isset($_POST['do_action']))
{
        foreach ($_POST['do_action'] as $current_key=>$current_value)
        {
                $id=$current_key;
                echo $id."=".$current_value;
        }
}
?>
Подскажите пожалуйста как правильно указать название или тут что-то другое в случае case 'do_action': когда названием SUBMIT является массив. Пробовал case 'do_action[]': и как только не пробовал, ничего не выходит.
P.S. структура формы и элементов должна оставаться та же..
Back to top
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 4 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