Ни для кого не секрет, что большинство онлайн магазинов используют cookie для хранения корзины товаров, однако для разработчиков часто бывает открытием, что куксы можно писать методом javascript. Я негодую, когда для добавления товара в корзину мне нужно покинуть страницу; недоумеваю когда при клике грузится аякс который только и делает что ставит куксу; и совсем бешусь, после действий в корзине, когда для того чтобы пересчитать сумму мне нужно перезагрузить страницу кнопкой "пересчёт". Поэтому, с моей лёгкой руки, вот уже более 3х лет, все магазины сделанные в нашей компании %companyname% на движке %cmsname%, для разнообразных целей используют яваскриптовую запись данных в cookie.
JS-код, для записи кукс, найти в интернете просто, немного сложнее написать код для чтения массива. Чтобы было понятно что это, я приведу пример.
Для того чтобы проще было обрабатывать установленные куксы в php, они ставятся примерно в таком виде: "shop_incart[2345]=123;", где shop_incart[2345] - имя куксы, которое php сам преобразует в массив $shop_incart. Иногда для работы с этими данными в яваскриптах, нам необходимо распарсить их в массив. Для этого я написала следующую функцию:
function read_cookie_array(name) {
var cookies = { };
if (document.cookie && document.cookie != '') {
var split = document.cookie.split(';');
for (var i = 0; i < split.length; i++) {
var name_value = split[i].split("=");
name_value[0] = name_value[0].replace(/^ /, '');
name_value[0]=decodeURIComponent(name_value[0]);
name_value[1]=decodeURIComponent(name_value[1]);
if(name_value[0].substring(0,name.length+1)==name+'['){
name_value[0]=name_value[0].substring(name.length+1,name_value[0].indexOf(']'));
cookies[name_value[0]] = name_value[1];
}
}
}
return cookies;
}
Теперь, чтобы получить массив нужных значений из cookie, достаточно вызвать функцию, примерно так:
var cart_items=read_cookie_array('shop_incart');
Ну, и напоследок выложу ещё несколько функций для работы с куксами в яваскриптах. Обратите внимание на вызов escape(value) при помещении значения в куксу, это важно!
function createCookie(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else var expires = "";
document.cookie = name+"="+escape(value)+expires+"; path=/";
}
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return unescape(c.substring(nameEQ.length,c.length));
}
return null;
}
function eraseCookie(name) {
createCookie(name,"",-1);
}
function get_all_cookies() {
var cookies = { };
if (document.cookie && document.cookie != '') {
var split = document.cookie.split(';');
for (var i = 0; i < split.length; i++) {
var name_value = split[i].split("=");
name_value[0] = name_value[0].replace(/^ /, '');
cookies[decodeURIComponent(name_value[0])] = decodeURIComponent(name_value[1]);
}
}
return cookies;
}
Ссылки по теме:
Полезная статья про escape: Comparing escape(), encodeURI(), and encodeURIComponent().
Часть функций изначально были написаны Питером Кохом - http://www.quirksmode.org/js/cookies.html.
Всегда рада комментариям.


Комментарии:
dubrowsky (Николай Дубровский)
13.11.2010 06:07:46
dubrowsky (Николай Дубровский)
13.11.2010 06:08:48
Елена Лунная
14.11.2010 04:35:53