24 Січень 2012
2 287
Рубрика: код

Последние просмотренные товары в Shop-Script

Покупая движок Shop-Script, заодно покупайте напильник — он вам точно понадобится. Сегодня, друзья, хочу поднять этот бокал.. нет, не то :). Сегодня, хочу поделиться с вами скриптом, который бы показывал посетителю последние просмотренные им товары в вашем магазине. Приступим?

Так как лезть в базы данных и php оооочень не хотелось, я предлагаю вам решение на js. Оно, конечно, не самое гибкое и, вероятно, вы найдёте в нём ошибки, но скрипт работает на браузерной стороне, не нагружая сервер, к тому же, очень прост в установке и работе и проверен в боях.

Для работы скрипта нам понадобятся две библиотеки: jquery (она в ss уже обычно установлена) и jquery.storage — локальное хранилище данных в браузере, где мы будем сохранять просмотренные товары и откуда брать данные для отображения.

Суть работы такова: если открыта страница с товаром, скрипт сохраняет её урл и заголовок в локальное хранилище. Чтобы не дублировать запись при обновлении страницы перед записью скрипт проверяет последний записанный элемент. Если он совпадает с текущим, запись не производим. А, чтобы не перегружать массив данными, мы будем обрезать запись из локального хранилища. Ограничим её, к примеру, до 700 символов. Этого хватит, а если нет, сделайте больше.

Подключаем и настраиваем

Для начала подключаем jquery.storage, скачав его отсюда:

<script src="jquery.Storage.js"></script>

Чтобы данные читались корректно, нам нужно залезть в smarty-темплейт нашего магазина и внести  небольшие правки. Зачем это нужно? Чтобы отличить страницу с товаром от любой другой, мы можем делать фильтр по урлу или поступить проще: в блок с названием товара добавить атрибут id=’pr_name’, который может быть только на странице товара. И если элемент с этим атрибутом присутствует, значит, открыта страница товара. Итак, ищем файл:

/published/SC/html/scripts/templates/frontend/product_name.html

и в нём заголовок h1, который меняем на следующее:

<h1 id="pr_name" rel="{$product_info.name}=={$product_info.productID}">{$product_info.name|escape:'html'}</h1>

Мы добавили идентификатор заголовку товара и в атрибуте rel указали разделённые двумя знаками «=» данные: название товара для записи в массив и его номер для ссылки.

Почему так: в ss можно указывать так называемый slug для товаров, по-нашему, красивый урл. Вместо /product/2240/ получая /product/kalendar-mohsen/. Чтобы избежать путаницы и лишних символов, мы записываем в локальное хранилище только номер товара.

Теперь создадим в любом месте сайта что-нибудь типа etc.js, где будет скрипт просмотра и записи. Не забудьте также подключить этот файл в html. Содержимое его будет делиться на две части: запись и вывод. Первая часть:

$(document).ready(function(){
var pr = $("#pr_name").attr("rel"); // pr = name==url;
if (pr) {
var last_seen = $.Storage.get('last_seen');
if (!last_seen) { last_seen = ""; }

/* обрезаем длинную строку */

var pr_len = last_seen.length;
if (pr_len > 700) {
last_seen = last_seen.substr(0,700); // здесь при необходимости можно сделать больше
}

/* узнаём последний просмотренный */

crnt = pr.split('==');
crnt = crnt[1]; //url текущего товара

lst = last_seen.split("||");
lst = lst[0]; // первый элемент
lst = lst.split("==");
lst = lst[1]; // url последнего просмотренного

if (lst != crnt) {
last_seen = pr + "||" + last_seen;
$.Storage.set( 'last_seen', last_seen);
}
}

Теперь просмотренные товары сохраняются и осталось только вывести их. Здесь я разленился и покажу простой вывод в виде ненумерованного списка, управлять которым вы сможете через css. Итак, просмотр.

$(document).ready(function(){
$("#last_seen_show").html("<ul></ul>");
var last_seen = $.Storage.get('last_seen');
last_seen = last_seen.split("||");
var res = 0;

$.each(last_seen, function(){
if ( res > '7' ) { return false; } /* счётчик */
crnt = $(this)[0].split("==");
if ( !crnt[1] ) { return false; }
$("#last_seen_show ul").append("<li><a href='/product/" + crnt[1] + "/'>" + crnt[0] + "</a></li>");
res += 1;
});
return false;
});

В блоке #last_seen_show мы и будем видеть последние просмотренные товары. Например, вы можете его вставить в боковую панель или в футер под товаром. Или же показывать по клику, как мы сделали в панельке на мебельном.

Не забудьте после внесения правок в темплейт почистить кэш вашего магазина в installer, иначе будете долго ругаться, мол ничего не работает.

А ваши вопросы задавайте в письмах ко мне в деревню или же в комментариях. Люблю, целую, всем успехов!

PS: якщо ви говорите україською, питайте краще так ;)

Вариант №2

Updated 2012-12-18: добавил второй вариант с проверкой наличия товаров в списке. Автор Александр предложил такой вариант: если товар уже находится в списке просмотренных, его туда не добавлять. Вы можете выбрать тот вариант, который вам больше нравится. Переписан именно первый блок, блок записи в хранилище. А блок вывода списка товаров остался прежним.

$(document).ready(function(){
var pr = $("#pr_name").attr("rel"); // pr = name==url;
if (pr) {
var last_seen = $.Storage.get('last_seen');
if (!last_seen) { last_seen = ""; }
/* обрезаем длинную строку */
var pr_len = last_seen.length;
if (pr_len > 700) {
last_seen = last_seen.substr(0,700); // здесь при необходимости можно сделать больше
}
/* запись в хранилище, при условии что текущего товара в нем нет */
lst = last_seen.split("||"); // выделяем строку, соответствующую формату переменной pr
var temp = []; // временная переменная, индикатор наличия в хранилище текущего товара
$(lst).each(function() //перебор хранилища
{
if ($(this)[0] == pr) //если в хранилище уже есть строка, соответствующая текущему товару ...
temp.push(this)[0]; // ...записываем ее в переменную temp
});
if (temp == "") // если временная переменная пустая - текущего товара нет в хранилище....
{
last_seen = pr + "||" + last_seen;
$.Storage.set( 'last_seen', last_seen); //.... записываем его в хранилище
}
}
});

Буду рад вашим отзывам и предложением по доработке скрипта.

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

Тепер я хочу бачити коментарі 11