Устойчивые значения полей формы

  • Автор темы Dmitry Koteroff
  • Дата начала

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&gt;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. Запостил, а потом вдруг сообразил, что здесь-то будет этой теме лучше.)
 

ONK

Пассивист PHPСluba
Лично я написал к своему парсёру шаблонов расширение
в которм есть методы такого плана:

$obj->input_text('var_name',$var_value,'max_l'....);

Есть набор из двух дестков основных функций с помощью которых я могу создавать формы любого типа, види, с любыми элементами. Для этих функций есть отдельный файл с общим шаблоном формы и всех её элементов, а так-же несколько вариантов оформления таблиц этих форм (можно изменять в конструкторе объекта с помощью соответствующих параметров).

В результате в скрипте достаточно вызвать несколько методов объекта, передать им необходимые значения вызвать функцию генерирующую html код

echo $obj->show();

И форма готова.

Проверка введённых данных это дело конкретного скрипта.

При нахождении ошибочных значений в переданных из формы данных, скрипт просто создаёт новую форму с использованием пришедших значений для заполнения полей.
Очень удобно и просто, ускоряет разработку приложений, избавляет от случайных ошибок и тд и тп. Уменьшает размер самого скрипта до неприлично малых размеров.


В принепе это без особых трудов можно написать под любой более менее нормальный парсёр шаблонов если привык к нему и хорошо умееш с ним обращаться.
 

tony2001

TeaM PHPClub
идея сделать "универсальный обработчик/построитель форм"?
честно говоря, лично мне подобная универсальность просто не нужна.
в частности, мне хватает подобного шаблона (используется Смарти):
PHP:
<input type="text" name="lead[lastname]" value="{$lead.lastname}">
...
<select name="lead[sex]">
                            <option value="f" {if $lead.sex == 'f' }selected{/if}>female</>
                            <option value="m" {if $lead.sex == 'm' }selected{/if}>male</>
</select>
 
Сверху