| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > множество форм на странице |
| Автор: ksnk 14.7.2010, 15:15 |
| Нужны какие-то концептуальные идеи. Код сам напишу Есть странички, на которых странным образом может появляться неопределенное количество форм. Пользователь может в любой момент заполнить и послать на сервер любую форму. (Тупой пример - форма логина, форма поиска, форма голосования за многие вещи, обратная связь...) Требуется придумать схему, каким образом на стороне сервера определить какая из форм заполнена и обработать ее. Число форм, обслуживаемое приложением, велико. На страничке могут оказаться несколько из обслуживаемых форм. одновременно может быть открыто и заполнено(на разных вкладках) несколько разных форм. Каждая форма обрабатывается отдельным классом/функцией. Функция умна и сама знает какие поля у формы были и в состоянии проверить Варианты решения: -- Запоминать имена форм, выведенные на страничку в сессии и при выводе странички сначала проверить именно их. Imho, не очень правильно, так как сессии может и не быть и стартовать ее насильно не очень хочется. + страничка может висеть достаточно долгое время, сессия может и сдохнуть. -- указывать имя обработчика формы в адресной строке. Imho, не очень удобно пока, так как формы, преимущественно, должны после обработки вести на ту-же страничку, на которой они вводились. Таким образом, action у форм сейчас пустой action="". И этот адрес я вычисляю по REQUEST_URI -- в скрытое поле формы с определенным именем впихивать имя вызываемой функции myclass:myform. при получении такого параметра в реквесте, ищем класс myclass и его метод handle_myform и вызываем его - пусть разбирается... префикс handle_ перед классом нужен, чтобы ушлый хакер не смог вызвать вообще любую функцию системы, а только специально заточеную... Как вариант - указывать можно только имя класса и вызывать специальную функцию этого класса. Может еще какие идеи есть? |
| Автор: bars80080 14.7.2010, 20:27 |
в своё время страдал я целью всеобъемлющего кода, потом как-то дошло, что ничего универсального быть не может. в итоге пришёл к варианту класса по схеме. то есть пишем схему в виде массива (имя поле такое, тип поля такой, такие-то параметры), а класс строит по ней саму форму. то же самое для обработки, схема в виде массива, загружаем класс, он проверяет нужные поля и запихивает их в нужные таблицы то есть тут без всяких передаваемых имён обработчиков. просто проверяется, есть ли массив с таким именем или нет (массивы в сериализованном виде легко хранить в БД). если формы отправляются по одиночке, то самое простое - имя кнопки submit, если кнопка у каждой формы своя если форма одна на всё (имхо зря), то либо включать сектора по изменению поля некоторой подформы. включение - запись javascript'ом в скрытое поле номера сектора. если вопрос просто как узнать какие формы были отправлены, чтобы их потом обработать - так закидывать в скрытое поле имя и всё. опять же настаиваю на номерах и схемах, имхо, безопасней, проще и эффективнее ничего придумать нельзя |
| Автор: ksnk 21.7.2010, 09:40 |
| Остановился на варианте - скрытое поле формы. В это поле вписывается "имя" формы, которое по совместительству указывает на обрабатывающую эту форму процедуру. "имя" формы располагается в поле с характерным именем, так что расходы на обслуживание неожиданно свалившихся форм, вроде как минимальны... |
| Автор: Muerto 21.7.2010, 11:06 |
| ksnk, Тебе скрытые поля не нужны! Просто кнопку отправки называй по разному name=form1 name=form2 а можно вообще name=submit value=form1 value=form2 Такой фокус даже с одной формой можно делать, если хочешь её отсылать в разные места... |
| Автор: ksnk 21.7.2010, 11:59 |
| Muerto, Imho, добавить автоматом скрытое поле проще, чем поменять имя кнопки сабмита. Ибо она как правило, никак не названа, А когда названа - их несколько, а иногда и javascript'ом формы сабмитится... |
| Автор: Muerto 21.7.2010, 12:58 |
| ksnk, Ну зависит конечно от того что нужно... Большой плюс моего варианта в том что можно отправлять ту же форму в "разные места" Поставив несколько кнопок сабмита... |
| Автор: krasgames 23.7.2010, 13:19 |
| А мне надо написать так, как тут: http://vkontakte.ru/editProfile.php?act=addresses(по принципу). Именно самому. То есть не самому, а вы должны помочь |
| Автор: ksnk 23.7.2010, 15:59 |
| krasgames, тут не совсем мой случай Тут одна форма на страницу. А что не получается? открутить мафондизайн или что-то еще? |
| Автор: krasgames 23.7.2010, 17:25 |
| Я еще даже про алгоритм не знаю). Пишу на smarty. Вот, например,у меня в таблице нет строк, где имя юзера совпадает с сессионным. Тогда на странице редактирования tpl я вывожу в форме только одну совокупность полей, значения из которых заполнят строку. Ниже должна быть ссылка на добавление еще одной группы элементов. 1. Как сделать добавление еще одной группы элементов? 2. Как назвать элементы в разных группах? Если строки, принадлежащие пользователю, в той же таблице есть, то выводятся дополнительные группы (это можно сделать и loop'om без придумывания счетчиков и тп), они заполняются значениями ячеек из таблиц. При передаче данных в php-script каким-то образом (в зависимости от названия инсертов) должно производится считывание всех полей (а не только измененных, но может можно и упростить, но тогда это вам предлагать). 3. Как скрипт должен получить данные и как заполнить базу сразу несколькими строками? |
| Автор: krasgames 24.7.2010, 06:24 | ||||
Ну мне тоже. Просто это я перечисляю случаи.
Да без разницы, со смарти или без смарти. Те же php файлы, просто потом, в конце концов, отображаешь тпл и кидаешь туда все переменные. Мне вообще надо алгоритм, как это написать. |