| Надо сперва определится в чем содержать записи корзины и какие.
Содержание записей в базе имеет выгоды, но и не меньше имеет минусов.
Сессия - время ее жизни подвластно вам, правда плохо, что его изменение глобальное и нельзя выставить индивидуально для каждого пользователя.
Cookie - позволяет вообще не дергать сервер попусту, и в паре с сессией вполне обеспечит весь функционал.
Проверка существует товар или нет, чтобы выдать клиенту разрешение на добавление товара, операция излишняя на сам момент добавления, ведь не факт, что сервер ответит мгновенно. И вместо добавления товара в корзину получим нервотрепку, особенно, если добавление товара анимированное, когда копия изображения товара перемещается в корзину.
Какой смысл выставлять на страницах товар, который нельзя поместить в корзину - товары которых нет в наличии на складе? Такие товары либо можно заказать, а значит они существуют, и серверу разобраться в том какие товары отослать клиенту, а какие сохранить как заказ не сложно. Либо такие товары на страницах отсутствуют.
Если я захочу сделать вам фиктивный заказ из "мусора", неужели я буду сидеть на вашей странице и чего-то там править чтобы получить фикцию? Я просто составлю фиктивный список товаров и зашлю его вам, при этом мне совсем не требуется даже браузер. Из этого следует, что действительно покупателя проверять "на честность" необходимости нет. Если все таки делать проверку, то сессия поможет - при выводе товаров на странице в сессии можно держать слепок этих товаров - массив их идентификаторов, и тогда запрос на проверку будет происходить меньшей кровью.
Что нужно для того чтобы поместить товар в корзину? По большому счету только его идентификатор. Вы же выводите на страницах практически всю информацию о товаре - идентификатор, цена, наименование, и описание, по крайней мере краткое. Этой информации достаточно, чтобы формировать корзину на стороне клиента (для текущей страницы) без участия сервера, причем для обеих представлений ее - краткой и полной. Полная информация о корзине, это ведь только добавление возможности ее редактирования, и если корзина формируется на клиенте, то и в этой операции сервер не участвует.
Вывод товаров на страницу всегда должен сопровождаться проверкой наличия корзины (для текущей страницы у клиента, это делает клиентский сценарий), то есть товаров уже выбранных пользователем, и такие товары должны отмечаться на страницах - помещено в корзину, и сколько помещено, если возможно не единичное добавление товара.
Вот при смене страниц с товарами и можно производить проверку наличия товаров, которые помещены в корзину, а еще лучше делать такое один раз - при формировании заказа. И уже от результатов проверки делайте выводы, обманывают вас, и что делать при этом, или действительно покупка. При этом, если кроме покупки есть возможность заказа товара, которого временно нет в наличии, то эти позиции сохраняются в базе - корзине пользователя, и служат для отметки товаров на страницах - "заказано" и т.д...
Товары, которые есть в наличии, помещаются в таблицу заказов, после чего уже сервер удаляет cookie-корзину клиента.
Для добавления информации о товаре в корзину совсем не требуются какие-то особые элементы управления, как то ссылки, элементы формы. Поле input потребуется, если добавлять можно несколько штук одного и того же товарах, в остальных случаях можно воспользоваться любыми DOM-элементами станицы - иконками корзины, которые меняют стиль свой - добавить/добавлено, текстовыми элементами. При этом, элементы добавить/добавлено могут иметь id товар непосредственно в цифровом виде, а общий родитель всех элементов, описывающих товар, этот же id с буквенным префиксом. Это позволит легко сформировать id родителя, и выбрать в его дочерних элементах дополнительную информацию о товаре - цена, описание, фото.
Javascript не оперирует ассоциативными массивами, но работает с объектами. При добавлении товара создается объект (если еще не создавался), в котором id товара является свойством объекта, а его значением массив, индексы которого описывают цену товара, описание, ссылку на фото. При каждом добавлении товара осуществляется обход этого объекта, просчитывается количество товаров и общая цена за них для краткого отображения корзины.
Вывод полной информации о корзине также обеспечивает клиентский скрипт - обходом объекта строится таблица с товарами с добавлением элементов редактирования - например, чекбоксов "удалить" и кнопок (ссылок), типа "удалить выбранные", "очистить корзину" и "оформить заказ". Асинхронный запрос на сервер может потребоваться в том случае, если покупатель может иметь скидки, бонусы, и т.п.. | |