Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Cookie, localStorage как сделать корзину? (https://javascript.ru/forum/dom-window/60670-cookie-localstorage-kak-sdelat-korzinu.html)

ivt22 13.01.2016 16:04

Cookie, localStorage как сделать корзину?
 
Добрый день, никак не могу разобраться как мне решить задачу, необходимо сделать что-то типо корзины товаров, но так что бы добавил товаров в корзину, перешел на другую страницу, а корзина с твоими товарами за тобой бегает и товары оттуда никуда не деваются, я пробовал Cookie, пробовал localStorage Вот тут даже пример есть http://incode.pro/javascript/sozdaem...alstorage.html
Но во всех вариантах, как только обновишь страницу или перейдешь на другую все данные из корзины пропадают, все Cookie очищаются и там уже нет ранее добавленных переменных, я думал каждое добавление товара записывать в файл с названием ввиде IP пользователя и потом при загрузке страницы читать этот файл и добавлять все товары обратно в корзину, так JavaScript не может ни создавать, ни записывать в файл ничего.

laimas 13.01.2016 16:52

Товар добавляется в корзину через сервер, то есть сервер должен знать об этом событии в любом случае, а значит и может их хранить у себя и выводить корзину на любой странице, а также записать и в Cookie клиенту, если надо. В localStorage может записать только клиент. Если у вас не сохраняется, значит не верно делалось. Код бы свой показали.

melst 13.01.2016 22:55

Я тоже сейчас над такой темой бьюсь. Я на jQuery делаю быструю корзину в определенном блоке на странице, чтоб без перезагрузки и делаю отдельную страницу корзины где уже просто PHP генерит.
Делаю файл обработчик, который срабатывает при нажатии "в корзину". Передается id товара и еще некоторые параметры с помощью ajax и в обработчике происходит выборка из БД и создание json. Json возвращается обратно в js и записывается в sessionStorage, а затем проверка по id на предмет повторений товаров и формирует быструю корзину. В обработчике данные остаются для последующего отображения на полноценной странице корзины.
Я примерно так придумал. Немного тов. Lemme помогает.

laimas 14.01.2016 11:34

Цитата:

Сообщение от melst
а затем проверка по id на предмет повторений товаров и формирует быструю корзину

О какой проверке речь и что значит "быстрая корзина"?

ivt22 14.01.2016 16:49

Цитата:

Сообщение от laimas (Сообщение 403608)
Товар добавляется в корзину через сервер, то есть сервер должен знать об этом событии в любом случае, а значит и может их хранить у себя и выводить корзину на любой странице, а также записать и в Cookie клиенту, если надо. В localStorage может записать только клиент. Если у вас не сохраняется, значит не верно делалось. Код бы свой показали.

http://incode.pro/javascript/sozdaem...alstorage.html

Так я вот это скопировал для примера

Или вот пытался пробовать
<a href="" onclick=setCookie("lastname", "Катя");>КУК</a>
	<a href="#" onclick=getcook();>||| Получить</a>


-----

function getcook()
  {
	alert(document.cookie);
  }
  
  //Установить Cookie
  function setCookie(name, value) {
    document.cookie = name + "=" + value;
  }


Кнопочкой КУК устанавливаю Cookie но если страницу обновить то тут же все исчезает. Видимо я как-то неправильно понял работу Cookie

laimas 14.01.2016 17:00

https://learn.javascript.ru/cookie

Но зачем именно куки? Если они устанавливаются только с параметром name, то это будут сессионные куки, которые не будут сохранены браузером после закрытия страницы. С тем же успехом сервер в свою сессию может записать данные корзины и выводить ее на страницах, ведь страницы все равно формирует он.

Другое дело, что куки используются для того, чтобы пользователь мог продолжить набор в корзину, спустя время, но тогда нужно устанавливать не сессионные куки.

melst 14.01.2016 21:48

Цитата:

Сообщение от laimas (Сообщение 403695)
О какой проверке речь и что значит "быстрая корзина"?

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

В обработчике так записываю id каждого товара.
session_start();
if (!isset($_SESSION['id'])) {
    $_SESSION['id'] = array();
   
}
array_push($_SESSION['id'], $id);

Кстати, я заметил, что $_SESSION и sessionStorage по разному избавляются от данных. Первое хранилище только по закрытию браузера, а второе по закрытию вкладки. Правильно?


PS Надо тоже об КУКАХ задуматься.

laimas 15.01.2016 06:34

$_SESSION не избавляется от данных, это просто суперглобальный массив. Избавиться от данных в нем, это только выполнить такую операцию. Что касается жизни сессии, то по умолчанию она равна 24 минутам, но это не означает, что именно по истечении этого времени ее не будет, она умрет, да, но сборщик мусора не обязательно удалит ее, он работает по своему алгоритму.

Как поступает браузер с файлом своей не знаю, да это и не важно. Гораздо важнее, что нет смысла использовать сессию на сервере и на клиенте, вы ведь ни в чем не выигрываете в этом случае. Более того, добавление товара, это обязательно хотя бы элементарная проверка его наличия, то есть это запрос сервера, серверу и хранить корзину. А учитывая, что у корзины два представления, и если речь идет о кратком ее представлении, и добавление товаров, это асинхронные запросы, то ответ сервера должен содержать информацию об этом представлении, которое нужно оперативно обновлять на клиенте. Все, больше клиенту ничего не надо.

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

melst 15.01.2016 09:18

Цитата:

Сообщение от laimas (Сообщение 403828)

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

А как быть с данными которые получены асинхронно при обновлении страницы или переходе на другую? Я sessionStorage только для этого использую. Если просто переход без добавления товара , то корзина берется из сессии клиента, если опять добавляется товар, то делается запрос. Как сделать по-другому я пока не знаю. Если только каждый раз запросы делать.

ivt22 15.01.2016 09:23

Цитата:

Сообщение от laimas (Сообщение 403770)
https://learn.javascript.ru/cookie

Но зачем именно куки? Если они устанавливаются только с параметром name, то это будут сессионные куки, которые не будут сохранены браузером после закрытия страницы. С тем же успехом сервер в свою сессию может записать данные корзины и выводить ее на страницах, ведь страницы все равно формирует он.

Другое дело, что куки используются для того, чтобы пользователь мог продолжить набор в корзину, спустя время, но тогда нужно устанавливать не сессионные куки.

а мне как раз нужно что-то, что сохранялось бы при обновлении страницы и при переходе на другую страницу, что бы я мог таскать список товаров за пользователем, я новичек и книжку по JavaScript только начал читать, а задачу мне срочно нужно как-то решить. Потому что срок пробной версии Битрикса заканчивается через 4 дня и если я не успею клиенту показать рабочий вариант, то он не оплатит Битрикс. И тогда месяц работы коту под хвост. Вот я и прошу помощи, потомучто самостоятельно я никак не успеваю разобраться.


Часовой пояс GMT +3, время: 23:51.