Dmitry Koteroff
Guest
Устойчивые значения полей формы
Задача следующая. Пусть есть скрипт с формой, action которой — ссылка на этот же скрипт. Форма большая. Если пользователь ошибся при вводе какого-то значения, скрипт должен показать ту же самую форму (с сообщением об ошибке), но не сбрасывать уже введенные значения.
Тщетно я искал PHP-код, который бы это реализовывал на достаточном уровне. Здесь самое сложное — это обработка select-ов, checkbox-ов с name вида "abc[d][]", multiple-select-ов. Ну и поэтому решил написать свой. В перспективе собираюсь отправить его в PEAR.
Прошу мастеров PHP оценить идею и немножко высказаться (интересует, как кто "выкручивается" без этого).
http://php.dklab.ru/FormPersister/t_formpersister.php
Сейчас поддерживается:
— парсинг HTML для выделения и корректировки всех тэгов формы (скорость не замерял, но теоретически должно работать очень быстро, особенно если полей формы меньше 50; накладных расходов практически нет).
— автоматическая простановка width, height у <img>, если не указаны;
— простановка action у <form> (по умолчанию — $SCRIPT_NAME);
— поддержка устойчивых полей:
— input: text, password, checkbox, radio, hidden;
— textarea;
— select, select multiple;
— <input type=submit confirm="Вы точно уверены?"> ...
— поддержка имен полей вида a[c];
— поддержка автомассивов-полей, например:
<input type=checkbox name=chk[] value=1>
<input type=checkbox name=chk[] value=2>
<input type=checkbox name=chk[] value=3>
— поддержка значений по умолчанию для все полей, например:
<input type=checkbox name=chk[] value=2 default="on">
<input type=text name=txt default="default text">
<input type=radio name=rad value=val1 default="val1">
— поддержка "реверсивных" множественных полей, например
<select name=sel[] multiple flip>
<option value=a>aaa
<option value=b selected>bbb
<option value=c selected>ccc
</select>
В скрипт придет:
array(
b => 1,
с => 1
)
Если бы не было flip, пришло бы:
array(b,c)
Реализуется через пост-обработку $_GET, $_POST и т.д.
— поддержка атрибута label у всех элементов (выводит текст рядом, щелчок на котором равносилен щелчку на элементе; удобен для флажков);
— поддержка значений, разделенных ";", например:
<select name=sel[] multiple default="a,c">
<option value=a>aaa
<option value=b>bbb
<option value=c>ccc
</select>
Наверное, наилучший метод использования всего этого — ob_start() с сотоварищами.
К недостаткам можно отнести достаточно примитивный (зато быстрый) парсер HTML. Пока что внутри тэгов нельзя использлвать ">" и "<" — а то заглючит. Например, нельзя: <img src=i.gif alt="2>1">, зато вместо него можно писать <img src=i.gif alt="2>1">.
Вот вариант с фильтрацией выходного потока:
http://php.dklab.ru/FormPersister/t_handler.php
Исходники:
http://php.dklab.ru/FormPersister/HTML/
(Оригинал этого сообщения вот тут:
http://xpoint.ru/cgi-bin/forum.cgi?action=thread&id=18338. Запостил, а потом вдруг сообразил, что здесь-то будет этой теме лучше.)
Задача следующая. Пусть есть скрипт с формой, action которой — ссылка на этот же скрипт. Форма большая. Если пользователь ошибся при вводе какого-то значения, скрипт должен показать ту же самую форму (с сообщением об ошибке), но не сбрасывать уже введенные значения.
Тщетно я искал PHP-код, который бы это реализовывал на достаточном уровне. Здесь самое сложное — это обработка select-ов, checkbox-ов с name вида "abc[d][]", multiple-select-ов. Ну и поэтому решил написать свой. В перспективе собираюсь отправить его в PEAR.
Прошу мастеров PHP оценить идею и немножко высказаться (интересует, как кто "выкручивается" без этого).
http://php.dklab.ru/FormPersister/t_formpersister.php
Сейчас поддерживается:
— парсинг HTML для выделения и корректировки всех тэгов формы (скорость не замерял, но теоретически должно работать очень быстро, особенно если полей формы меньше 50; накладных расходов практически нет).
— автоматическая простановка width, height у <img>, если не указаны;
— простановка action у <form> (по умолчанию — $SCRIPT_NAME);
— поддержка устойчивых полей:
— input: text, password, checkbox, radio, hidden;
— textarea;
— select, select multiple;
— <input type=submit confirm="Вы точно уверены?"> ...
— поддержка имен полей вида a[c];
— поддержка автомассивов-полей, например:
<input type=checkbox name=chk[] value=1>
<input type=checkbox name=chk[] value=2>
<input type=checkbox name=chk[] value=3>
— поддержка значений по умолчанию для все полей, например:
<input type=checkbox name=chk[] value=2 default="on">
<input type=text name=txt default="default text">
<input type=radio name=rad value=val1 default="val1">
— поддержка "реверсивных" множественных полей, например
<select name=sel[] multiple flip>
<option value=a>aaa
<option value=b selected>bbb
<option value=c selected>ccc
</select>
В скрипт придет:
array(
b => 1,
с => 1
)
Если бы не было flip, пришло бы:
array(b,c)
Реализуется через пост-обработку $_GET, $_POST и т.д.
— поддержка атрибута label у всех элементов (выводит текст рядом, щелчок на котором равносилен щелчку на элементе; удобен для флажков);
— поддержка значений, разделенных ";", например:
<select name=sel[] multiple default="a,c">
<option value=a>aaa
<option value=b>bbb
<option value=c>ccc
</select>
Наверное, наилучший метод использования всего этого — ob_start() с сотоварищами.
К недостаткам можно отнести достаточно примитивный (зато быстрый) парсер HTML. Пока что внутри тэгов нельзя использлвать ">" и "<" — а то заглючит. Например, нельзя: <img src=i.gif alt="2>1">, зато вместо него можно писать <img src=i.gif alt="2>1">.
Вот вариант с фильтрацией выходного потока:
http://php.dklab.ru/FormPersister/t_handler.php
Исходники:
http://php.dklab.ru/FormPersister/HTML/
(Оригинал этого сообщения вот тут:
http://xpoint.ru/cgi-bin/forum.cgi?action=thread&id=18338. Запостил, а потом вдруг сообразил, что здесь-то будет этой теме лучше.)