Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   разделение строки из куки на массивы (https://javascript.ru/forum/jquery/34483-razdelenie-stroki-iz-kuki-na-massivy.html)

Deff 07.01.2013 03:24

Не хватает кавычки
11 str+='<p class="item-'+i+'-'+arItem[j]+'">'+zJ[j]+'</p>\n

Deff 07.01.2013 03:25

Цитата:

Сообщение от mi.rafaylik
Весело мне будет, когда после внесения изменений я буду обратно в строку куки эти данные собирать .

Нет смысла собирать в куки - собирайте в длинную строку и Отправляйте Аяксом(*если не будет перехода на страницу - а если будет - чисто в скрытую форму

mi.rafaylik 07.01.2013 07:02

не в том суть повторного сбора в строку.
Данные отправляются не скрытым полем, а обычным через $_POST.
Мне нужно повторно собрать данные в строку для случая, если пользователь решит не отправлять форму, а вернётся в магазин и продолжит добавлять товары. Тогда произойдёт переход на другую страницу, и изменённые данные (например удаление какого-нибудь из товаров) не сохранятся.
Поэтому по событию нажатия любой кнопки удаления товара я собираю массивы в строку в то же состояние, из которого я их и доставал. такая вот камасутра )
Но сначала нужно поспать ))

Слегка изменил функцию разбора строки в массивы (в основном я поменял местами элементы массива, добавил комментарии между элементами и вывод новой суммы если к примеру количество больше одного):
var a = $.cookie("basket");
var b = a.replace(/;\s*$/,'').split(";");
function allItemsListConstruct (Z) {
	var str ='',zJ;
		for (var i=0; i<Z.length; i++){
			str+='<div>\r\n';
			zJ = Z[i].split(":");
			var itemPriceFinal = zJ[2] * zJ[1];
			str+=
			'<p class="item-name">'+zJ[0]+'</p> ('+
			'<p class="item-size">'+zJ[3]+'</p> '+
			'<p class="item-color">'+zJ[4]+'</p> '+
			'<p class="item-price">'+zJ[2]+'</p> грн.) - '+
			'<p class="item-copy">'+zJ[1]+'</p> шт. (' +
			'<p class="item-price-final">'+itemPriceFinal+'</p> грн.)'
			;
			str+='\r\n</div>\r\n'
		} return str;
}
var allItemsList = allItemsListConstruct (b);

Deff 07.01.2013 13:51

Цитата:

Сообщение от mi.rafaylik
(например удаление какого-нибудь из товаров) не сохранятся.

Это однозначно LocalStorage

function setValue(key,Value) {
    localStorage.setItem(key,Value)
alert('Записалось ... \n' + key+':'+Value)
}
//Записываем Данные
var   key='price', Value='Цена2';
setValue(key,Value)
var   key='size', Value='600'
setValue(key,Value)


function getValue(key) {
    return localStorage.getItem(key);;
}
//Читаем Данные
var   key='price';
alert(key+"="+getValue(key));
var   key='size';
alert(key+"="+getValue(key));

Можно перезагрузить страницу и запустить второй скрипт

mi.rafaylik 07.01.2013 15:59

Всё же я хочу сначала попробовать способ сбора массива в строку, т.к. данных будет немного (максимум 10 товаров, в записанном куки это не превысит и килобайта я думаю).
P.S. это не товары в магазине, а уже выбранные покупателем товары в корзине, поэтому длина строки будет небольшая.

Вот то, из чего я буду собирать в строку:
<div class="item">
<p class="item-array item-name">T-Shirt</p>
<p class="item-array item-size">размер S</p>
<p class="item-array item-color">цвет белый</p>
<p class="item-array item-price">170</p> грн.
<p class="item-array item-copy">4</p> шт.
</div>

<div class="item">
<p class="item-array item-name">Jeans</p>
<p class="item-array item-size">размер XS</p>
<p class="item-array item-color">цвет синий</p>
<p class="item-array item-price">420</p> грн.
<p class="item-array item-copy">2</p> шт.
</div>

и начало моих размышлений:
basketNew = new Array ($('.item-array').text()); // создание массива из элементов класса
// $.cookie("basket", basketNew); // запись в куки

Но массив не получился, т.к. данные просто склеились. Выглядит это вот так:
T-Shirtразмер Sцвет белый1704Jeansразмер XSцвет синий4202

а должно так, где элементы каждого товара разделены двоеточием, а товары разделены точкой с запятой:
T-Shirt:размер S:цвет белый:170:4;Jeans:размер XS:цвет синий:420:2;

То есть нужно создать массив из всех <div class="item"></div> с разделителем ";",
в каждом из которых будет массив из дочерних <p class="item-array item-price"></p> с разделителем ":".

Deff 07.01.2013 17:06

Цитата:

Сообщение от mi.rafaylik
то есть в localStorage записывается не один массив со всеми товарами, а значение каждого указанного мной элемента (если он изменён) ?

Ну вы ведь кликаете по каждому товару ?

А для сбора всего массива и отсылки суммарного на сервер или перепарса на странице - есть методы доступа к localStorage
Либо пишите/читает строку в один ключ
По ключам (по опыту удобнее)
В Один ключ - это подобие куков, но каждый раз при добавке - смене товара придется распаковывать данные, (в куках таже проблема, с заменой - добавкой товара,
Сбор по ключам и объединение для отсылки или распарса на странице
(- ксать для распарса на очередной странице - даже не надо объединять,
Главное чтобы нулевой ключ(заранее известный) - имел массив всех ключей, нужных для перебора

jokersoft 07.01.2013 17:48

ТЗ нечеткое.
Я так понял, в итоге нужна строка, а не массив. Хотя я советовал бы думать о будущем и о юзабилити. И оперировать таки с массивом, а не со строкой. Но ладно, пусть будет строка.
Итак, пишем сразу строку

var str = ''; //инициализируем пустую строку

$('div.item').each(function(){
$(this).children('p').each(function(){
str += $(this).html() + ":";//пишем хар-ку товара + ":"
});
str += ";"//отделяем товар + ";"
});

ЗЫ: да, знаю, в конце будем получать не ";", а ":;", но если дальше правильно парсить - не имеет значения и не стоит лишней строки кода здесь.

Deff 07.01.2013 17:54

jokersoft,
:) Cобствна вопрос - (не юзал jQuery.cocie)
Во всех ли браузерах воспринимает произвольные символы в данных для куков (В обычных куках, к примеру - русские(в FF) не воспринимаются, перевод в ескейп последовательность - может превысить длину кука в ИЕ(она возрастет примерно раза в 4

mi.rafaylik 07.01.2013 18:18

Адаптировал код jokersoft:
var strCookie = ''; //инициализируем пустую строку

$('div.item').each(function(){
	$(this).children('p:eq(0)').each(function(){ strCookie += $(this).html() + ":"; }); // количество характеристик всегда будет 5
	$(this).children('p:eq(1)').each(function(){ strCookie += $(this).html() + ":"; });
	$(this).children('p:eq(2)').each(function(){ strCookie += $(this).html() + ":"; });
	$(this).children('p:eq(3)').each(function(){ strCookie += $(this).html() + ":"; });
	$(this).children('p:eq(4)').each(function(){ strCookie += $(this).html(); }); // таким образом я убрал последний ":" в каждом товаре
	strCookie += ";" //отделяем товар + ";"
});

Результат получился такой:
T-Shirt:размер S:цвет белый:170:4;;;Jeans:размер XS:цвет синий:420:2;;;Shoes:размер 41:цвет хаки:560:1;;;

Это работает, но лишние разделители при следующих запросах строки из куки будут создавать пустые товары..
Сейчас после каждого товара разделитель не один ";" а их столько, сколько и товаров всего :/
Подскажите как правильно парсить, чтобы привести строку в такой вид:
T-Shirt:размер S:цвет белый:170:4;Jeans:размер XS:цвет синий:420:2;Shoes:размер 41:цвет хаки:560:1;

P.S. в следующих сообщениях уже исправил )

Deff 07.01.2013 18:24

mi.rafaylik,
1. Составьте список используемых браузеров( с версиями для ИЕ
2. Приведите полный вид максимально длинной строки заказов отправляемой на сервер
3. Если использовать не куки - то способ отправки через форму - подойдёт ?


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