Как реализовать вложенность?

saa

Guest
Как реализовать вложенность?

Вопрос собсно в том, как лучше реализовать вложенность диалогов(форм)?

Вижу несколько вариантов:
1. Запоминать $_SERVER['HTTP_REFERRER'] в переменных пользователя скрипом формы, сравнивая его на дубляжи, затем после обработки возвращатся на него. (Как то убого имхо).
2. Передавать форме GET' ом адрес откуда ее вызвали, затем класть его в hidden поле на форму. (Наиболее приемлымый, на мой взгляд, вариант, если не учитывать некрасивость урла)
3. Организовать некую стековую структуру, обрабатываемую в соответствии с поведением пользователя (гиморно помоему).

Подскажите пожалуйста, может есть какой нибудь еще более прямой механизм?
Например, для кнопки cancel я использую javascript:history.back(). Наверное это не очень правильно?

P.S. Проект чисто интранетовский (СУБД). Волен выбирать любые технические требования программы (javascript, cookies и т.п.)
 

saa

Guest
Сессии в первом и втором вариантах?
Конкретнее, если можно.
 

Markush

Guest
Re: Как реализовать вложенность?

Автор оригинала: saa
3. Организовать некую стековую структуру, обрабатываемую в соответствии с поведением пользователя (гиморно помоему).
Гиморно и не только по твоему... Имхо сессии проще всего...
 

IL78

Guest
saa, честно говоря, я довольно плохо представляю структуру твоих вложенных диалогов. Однако, на мой взгляд, в сессии можно без лишних сложностей хранить не только последовательность прохода пользователя по диалогам, но и сами данные из предыдущих форм и манипулировать ими как угодно. А конкретика зависит от специфики задачи...
 

saa

Guest
Что значит сессии? Что, в механизме сессий есть некая history которая запоминает где побывал пользователь? Вопрос в простоте/ быстроте/ универсальности решения (конкретного), которое пусть хоть сессии, хоть яваскрипт использует мне все равно.

-~{}~ 09.07.04 00:06:

Автор оригинала: IL78
... Однако, на мой взгляд, в сессии можно без лишних сложностей хранить не только последовательность прохода пользователя по диалогам, но и сами данные из предыдущих форм и манипулировать ими как угодно.
А если пользователь нарушает последовательность прохода?

-~{}~ 09.07.04 00:38:

Поясню некоторые моменты:
1. Есть два файла form1.php и form2.php
2. Из form1.php можно вызвать form2.php (button'ом).
3. При нажатии на ОК в form2.php данные заносятся в базу и осуществляется возврат к form1.php. При нажатии Cancel осуществляется просто возврат к form1.php.
4. Все формы генерятся PEAR::HTML_QuickForm.
5. Пользователи - тупые.
 

IL78

Guest
Из form1.php можно вызвать form2.php...
При нажатии на ОК в form2.php данные заносятся в базу и осуществляется возврат к form1.php.
Данные, введенные в form2.php, как-то влияют на состояние form1.php? Если нет, какое значение имеет последовательность ввода? (что-то я начинаю плоховато соображать...)
 

saa

Guest
Автор оригинала: IL78
Данные, введенные в form2.php, как-то влияют на состояние form1.php? Если нет, какое значение имеет последовательность ввода? (что-то я начинаю плоховато соображать...)
Да, влияют. По сути form2.php предназначен для добавления элементов в выпадающий список.
 

IL78

Guest
Что значит сессии?
http://phpfaq.ru/sessions - все расписано.
Имхо, для данной задачи сессии в самый раз. Элементы списка из form2.php можно записать в сессию и использовать в form1.php независимо от того, с какой страницы юзер на нее пришел...
 

saa

Guest
В первом посте, в вариантах 1 и 3, собсно, и используется механизм сессий. Я осведомлен о его возможностях. Однако речь идет о реализации конкретного алгоритма возврата из подчиненной формы.

-~{}~ 09.07.04 14:44:

Вопрос, вобщем, остается открытым, мужики помогите чем можете плз. Я уже начинаю подумывать о написании javascript'а для передачи адреса POST'ом в подчиненную форму...:(. Неужели пхп не располагает какими то более изящными способами?

-~{}~ 09.07.04 18:15:

Проанализировал я ситуацию и вот что понял. Пользоваться реферрером в данном случае противопоказано, потому как файл формы могут запросить откуда угодно т.о. нарушив любую последовательность. Следовательно реализовать данный механизм можно только передавая обратный адрес из вызывающей формы. Помимо простого GET'а в голову больше нормальных вариантов не приходит (не делать же POST javascript'ом, хотя, мож кто занет как это сделать?), следовательно придется мирится с корявостью урла. А потом возвращатся по значению скрытого поля на форме.
:( вот такие пироги. И никаких сессий.

P.S. Забыл сказать, javascript:history.back() - это _неправильно_ для Cancel.

-~{}~ 09.07.04 19:01:

Да! а от корявости урла можно избавится тем же js подставляя в строку адреса усеченный урл. Тока как это сделать - не знаю :( может кто подскажет готовый js код? Не рублю в нем нифига.

P.P.S Сижу я тут - сам с собой разговариваю... :)
 

neko

tеam neko
P.P.S Сижу я тут - сам с собой разговариваю...
а это потому что ты никого не слушаешь, зачем с тобой разговаривать.

сказали уже -- сессии решают проблему замечательно.

Что, в механизме сессий есть некая history которая запоминает где побывал пользователь?
в механизме сессий, неповеришь, есть механизм для сохранения любых данных.
в т.ч. и о том где побывал пользователь.
пользователь заходит в форму в сессионную переменную что-то пишется.
заходит в другую форму -- из переменной что-то читается.

какие сложности?
 

saa

Guest
Автор оригинала: neko
а это потому что ты никого не слушаешь, зачем с тобой разговаривать.
_Ничего_ не было толком сказано. Ни одного _алгоритмического_ решения не было предложено. Слушать то и нечего.

заходит в другую форму -- из переменной что-то читается.

Какие сложности?
Сложности в "что-то". Писать туда реферрер прикажешь? А если два реферрера будут указывать друг на друга? Так и будем: кликнул на cancel - попал на form1.php, хочешь от него избавится - опаньки :confused:: form2.php ) ... А иногда реферрер указывает на самого себя...
Подумай над задачкой детально, а не просто "сессии... точка". Или мы тут учим малышей маны читать? (sorry offtop)

P.S. А про history, эт я образно. Сессии - большой самообман в данном случае.
 

IL78

Guest
saa, по-моему я уже предлагал - пиши в сессию сами данные, которые пользователь введет в form2.php. И потом вытягивай их из сессии и используй везде, где надо, не особо задумываясь о том, откуда пользователь на данную страницу попал.
Если же для тебя принципиальна именно последовательность, никто не мешает тебе хранить в сессиях ту самую стекоподобную структуру (а-ля вариант 3 из твоего первого поста).
 

saa

Guest
Дело тут не в данных и не в том, где их хранить (они у меня в БД хранятся), а в том, как(куда) вернуться из подчиненной формы.

-~{}~ 10.07.04 03:21:

Да, для меня принципиальна последовательность.
 

IL78

Guest
В таком случае по-моему ты сам уже нашел решение - создать массив, аналогичный history в JScript. Хранить его, по-моему, проще всего тоже в сессии.
 

saa

Guest
Это первое решение, которое мне пришло в голову вовремя реализации этого проекта. Однако, когда я его применил, оказалось, что оно супер глючное. Потому как возможны зацикливания в этой history.
 

IL78

Guest
мое видение решения:

1) массив вида "номер в последовательности прохода" => "URL страницы с формой" (хранить в сессии, пополнять при первом заходе на каждую форму);
2) запомнить номер текущей формы (тоже в сессии);
3) для создания ссылки перехода к предыдущей форме выбрать элемент этого массива с номером, на единицу меньшим текущего.

Если понадобится - можно будет по аналогии реализовать дополнительные ссылки перехода назад/вперед на сколько угодно шагов.

Что в такой схеме реализации "псевдо-history" может зациклиться, честно говоря, не вижу.
 

neko

tеam neko
я думаю проблема как это частенько бывает в том, что автор вопроса задачу сформулировать не в состоянии.
либо ищет упрощений там, где и так уже проще некуда.

я так и не увидел полного списка условий, при которых производятся какие-то переходы

а все просто:
1. человек засабмитил форму
2. сервер сохранил в сессию флаг, который нам говорит о том, что человек в этой форме был и его засабмитил.
все.
куда бы он дальше не полез в пределах твоего сайта, в сессии будет хранится этот факт.
если в сессии флага на какую-то форму нет, то значит он ее не заполнял.
куда уж проще?

если ты хочешь получить готовый алгоритм, опиши подробно все условия, фонт помощи работает круглосуточно.
но подробно - это подробно.

а не так как ты это до сих пор делал "поясняю детали"
 

saa

Guest
Да, возможно условия были не лучшим образом сформированы.
Итак, идея в следующем - необходимо реализовать систему навигации по "сайту" (хотя вобщем-то это не сайт, а СУБД с Web-интерфейсом) при помощи кнопок на формах. В минимальном варианте предлагаю рассмотреть следующий частный случай. Допустим существует форма (form1.php) с выпадающим списком сотрудников, рядом с которым кнопка "Добавить сотрудника". Список сотрудников считывается из таблицы "сотрудники" БД. Кнопка "Добавить сотрудника" должна сделать переход на форму "Добавление сотрудника" (form2.php). После обработки введнных данных (добавления их в БД) скрипт form2.php должен возвращать пользователя к form1.php. Тоже самое(но без добавления данных в БД) должно приоисходить при нажатии на кнопку "Отмена" на этой форме(form2.php). Вызывать form2.php могут и другие формы содержащие списки сотрудников. Пользователю разрешается пользоваться любыми кнопками (back, forward, reload) и вводить адреса в адресной строке. В минимуме решение должно обеспечивать хотя бы один уровень вложенности форм. В максимуме - должно позволять реализовывать сложные древовидные структуры интерфейсных зависимостей. Вся задача сводится к передаче урла "вызывающей" формы, хранению этого урла и возврат из подчиненной формы по этому урлу. Формы могут в случае невалидности введенных данных заставлять пользователя заполнять их повторно.
Сами формы реализованы при помощи бибоиотеки HTML_QuickForm.
 
Сверху