Я здесь это офигенно. Создайте гибкую / прогрессивно улучшенную корзину для покупок.
Не авторизован
План A) Если используется веб-хранилище, используйте его (хранилище сеансов / локальное хранилище), зная, что ВСЕ данные корзины покупателя могут быть объединены в таблицу базы данных отслеживающей корзины (с отметками времени и идентификаторами сеансов) с использованием AJAX тоже. Синхронизация и сокращение - это ключ (клиент, таблица отслеживания). Нет серверной сессии хранения отдельных данных корзины не требуется.
Если браузер закрывается, корзину можно восстановить. Изящное закрытие браузера должно привести к вызову AJAX, который удаляет таблицу отслеживания.
Корзина отслеживания не является авторитетной (используется для воздействия / резервирования запасов), поскольку она не представляет идентифицированного клиента на грани оплаты. Только если клиент нажмет check-out , предметы в корзине отслеживания будут иметь значение с точки зрения инвентаря (однако, это еще не все).
План Б) В противном случае вернитесь к логике только для файлов cookie сеанса. Используйте AJAX для чтения / записи данных в централизованной таблице отслеживания корзины. Клиент никогда не сохраняет отдельные данные корзины и не хранится в данных сеанса (управляемых базой данных или нет). Пока клиент не вошел в систему, данные его корзины находятся только в централизованной корзине отслеживания.
Если браузер закрывается, клиентская корзина навсегда теряется. Если браузер корректно закрывается, элементы также будут удалены из таблицы отслеживания с помощью вызова AJAX. В противном случае старые данные корзины в базе данных удаляются с отметками времени активности.
Альтернативный план B) Реализация постоянного клиентского решения с использованием стандартных зашифрованных файлов cookie. Таким образом, независимо от того, корректно ли закрывается браузер, можно повторно установить клиентскую корзину и обновить таблицу отслеживания. Это помогло бы старым пользовательским агентам и избавило бы их от разочарования за счет дополнительных программ и тестирования.
Примечание: Вы должны предвидеть и обрабатывать реальность того, что идентификаторы сеансов будут меняться в течение всего срока сеанса. Если вы хотите избежать фиксации сеанса, вы не можете использовать один и тот же идентификатор сеанса снова и снова для каждого HTTP-запроса. Следовательно, вы должны ОБНОВЛЯТЬ идентификатор сеанса в главной таблице отслеживания при каждом запросе. * Это может быть много обновлений, если многие пользователи не вошли в систему и у них много продуктов в корзинах.
авторизован
Когда клиент входит в систему, вы копируете содержимое его корзины отслеживания в свою собственную таблицу корзины покупок (обычная таблица, а не в сеансе). Теперь в игру-оболочку будут играть клиент, данные таблицы корзины и основная корзина отслеживания. Содержимое корзины пользователя теперь является постоянным независимо от агента пользователя.
Таблица корзины покупателя пользователя еще не является авторитетной.
Только когда пользователи нажимают кнопку «Проверить», содержимое корзины пользователя влияет на доступность инвентаря. Только после покупки фактический запас уменьшится.
Эта последняя строка поднимает важный вопрос. Есть разница между тем, что есть в наличии, и тем, что есть в наличии. Из-за одновременного использования веб-сайта любое количество людей может положить один и тот же товар в свою корзину, пока он не станет недоступным.
Если в наличии 10 книг по Linux, 20 человек могут положить 1 копию в корзину. Первые десять не являются проблемой, но должна ли вторая десятка отображаться сообщение ПРОДАНО? Нет. Что, если 15 человек уйдут, скажем, не обращая внимания, но никогда не опустошат свою тележку? Все должны видеть В НАЛИЧИИ, но только те, кто нажал оформить заказ , должны повлиять на доступность . Те, кто платит, должны влиять на инвентарь .
Таким образом, при настройке таблиц продуктов обязательно укажите два поля для отслеживания продуктов: доступность и количество . Они связаны, но в смысле электронной коммерции они не одинаковы.
Заключительное примечание: В сценарии с веб-сервером с балансировкой нагрузки (пользователи Amazon Web Service, вероятно, согласятся с этим), более вероятно, что сеансы будут обрабатываться базой данных, поскольку это проще централизовать данные. Хотя возможно иметь сетевое, централизованное и основанное на файлах хранилище сеансов / NFS в решении типа NAS, это может быть нецелесообразным или оптимальным (задержка, проблемы с блокировкой файлов).