Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Вёрстка веб-сайтов > добавить в корзину, остаться на той же странице


Автор: Forza 26.9.2004, 14:53
В продолжении http://forum.vingrad.ru/index.php?showtopic=29873 в веб-программировании, т.е. о том, как остаться на той же самой веб-странице после выполнения запроса, по параметрам которого изначально не догадаться, с какой страницы он был отправлен.

Теперь немного другая ситуация:
Есть инет-магазин. В нём товары могут выводиться в едином каталоге, в каталогах по категориям, в результатах поиска и т.д. Из всех этих типов страниц товар может быть добавлен в корзину. После нажатия на «добавление в корзину» надо:
а) добавить товар в корзину на сервере
б) пересчитать корзину
в) вывести ту же самую страницу, с которой товар был добавлен, с обновлённой информацией о корзине (кол-во товаров и общая стоимость).

Раньше для возвращения на ту же страницу использовал print redirect (referer()).

Теперь ищу альтернативу. Вариантов много:

а) В урл добавления товара (“choice=add;id=1”) добавить параметр source_query, в который записать текущие параметры запроса (escape (query_string())), а потом после обработки добавления товара делать на него переход, добавив те параметры запроса к основному урлу - print redirect (url().”?”.unescape (param (“source_query”))). Плюс – независимость от JavaScript, минус – полный рефреш страницы, хранение параметра source_query в каждом из 100 урлов добавления товара (увеличение размера страницы на 5-10 кб).

б) Использовать единую форму для вывода текущей страницы каталога. В ней будет один хидден, хранящий текущий урл, а каждая кнопка добавления товара в корзину будет сабмитом с определённым именем. Плюс – не надо хранить 100 копий урла, минус – передача данных в урле не в виде “choice=add;id=1”, а в виде “add1.x=1;add1.y=2” (или использование хидденов choice, id и джаваскрипта для приведения урла к виду “choice=add;id=1”).

в) Повесить на каждую кнопку «добавления в корзину» JavaScript-обработчик клика, который будет в невидимом фрейме добавлять товар в корзину на сервере (Perl), а потом рефрешить текущую страницу (JS). Плюс - урл текущей странице вообще запоминать не надо. Минус – обязательное использование JavaScript (или его уже никто не отключает в настройках броузеров?).

г) Повесить на каждую кнопку «добавления в корзину» JavaScript-обработчик клика, который будет в невидимом фрейме добавлять товар в корзину на сервере, а потом обновлять (через innerHTML) строку с информацией о текущем состоянии корзины. Плюс – не надо рефрешить страницу. Минус – а все ли броузеры поддерживают innerHTML для слоёв или параграфов? Нетскейп, по-моему, не поддерживает.

д) Записывать в переменную сессии очередной урл, если он связан с выводом списка товаров (а не, например, добавление или удаление), и делать на него переход, если было получен запрос на добавление товара в корзину. Плюс - нет JavaScript, не надо сохранять текущий урл где-то на странице. Минус - необходимость в рефреше страницы.

По-моему, мой вопрос достаточно банальный для современных веб-приложений, и поэтому, наверное, на основе опыта уже должно быть выработана оптимальная реализация этого. С интересом ознакомлюсь с ней и (optional) аргументами в её пользу

Автор: Zandr 27.9.2004, 17:56
Про реализацию - не ко мне, а вот продолжать использовать Referer не стоит (по крайней мере не возлагать на него особые надежды)... Эта вещь передается браузерами, причем опционально. У меня на сайте первоначально авторизация включала проверку Referer'а. А у работодателя, к которому я приходил на собеседование, его Mozilla этот параметр не возвращала.... В общем не взяли на работу smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)