Для того, чтобы в интернет-магазине или в большом каталоге посетителю сайта было комфортнее, добавьте функцию просмотра последних просмотренных объектов.
Установка:
1. Содержимое прилагаемого файла вставьте в /netcat/modules/default/function.inc.php, не нарушая структуру PHP-кода.
2. В полном просмотре объекта (товара) поставьте такой вызов (например, в самый конец):
Код:<? addToRecentlyView($f_RowID) ?>
При использовании компонентов 4-й версии, синтаксис другой:
Код:".opt(addToRecentlyView($f_RowID),"")."
3. В компоненте, в котором хранятся Ваши объекты (товары) создайте новый шаблон "Вы смотрели", в системных настройках которого напишите:
Код:$query_where="1";
$recently=getRecentlyView(); // получили массив с ID недавно просмотренных объектов
if(count($recently)) { // если что-то есть - делаем выборку
$ignore_sub=$ignore_cc=1;
$glist=join(",",$recently);
$query_where .= " and a.Message_ID in ($glist)";
$query_order="FIELD(Message_ID,$glist)";
}
else $query_where = "1<0"; // если ничего не смотрели, то и выводить ничего не нужно
Готово! Смотреть список ранее просмотренных объектов (товаров) нужно с помощью шаблона "Вы смотрели", который вы создали.
Например, можно создать некий раздел, допустим, "Просмотренные товары", добавить туда ваш товарный компонент, а шаблон вывода указать в настройках инфоблока не стандартный, а "Вы смотрели". И тогда при заходе на сайте в этот раздел, будет показываться список недавно просмотренных товаров.
Также можно вызывать этот шаблон через s_list_class($sss,$ccc,"&nc_ctpl=XXX")
где $sss - номер раздела, $ccc - номер инфоблока в этом разделе, а XXX - номер, присвоенный шаблону "Вы смотрели". В этом случае отобразить информацию о просмотренных товарах можно в любом месте сайта - например, в боковой колонке макета дизайна или в виде "карусели".
Функция предназначена для NetCat версии не ниже 5.0, редакция любая.
UPD 2013/11/13: Добавлена проверка magic_quotes_gpc для совместимости с разными настройками хостеров.
Комментарии 21
На обновления системы, я так понимаю, данная вставка кода в файл function.inc.php не должна никак повлиять? Т.е. обновляя систему, данная функция будет работать?
Да, файл /netcat/modules/default/function.inc.php никогда не портится при установке официальных обновлений NetCat. Поэтому можете смело вставлять туда любые полезности как по мере надобности, так и впрок :-)
Решение не работает. В подробном выводе объекта в месте вставки кода ".addToRecentlyView($f_RowID)." (компонент 57 v.4) [S]вываливается[/S] отображается ошибка Array.
".opt(addToRecentlyView($f_RowID),"")." - тогда Array выводиться не будет.
Но, вообще-то, запоминание просмотренных объектов должно работать несмотря на вывод этой надписи!
Проверьте, поставив куда-нибудь в системные настройки компонента, такую команду:
print_r(getRecentlyView());
- должна будет показать массив с ID запомненных объектов.
последней строкой print_r(getRecentlyView());
на странице отображается
Array ( )
".opt(addToRecentlyView($f_RowID),"")." - действительно, Array не отображается.
Создал новый шаблон компонента на основе 57. В системные настройки которого дописал:
[CODE]
$query_where="1";
$recently=getRecentlyView(); // получили массив с ID недавно просмотренных объектов
if(count($recently)) { // если что-то есть - делаем выборку
$ignore_sub=$ignore_cc=1;
$glist=join(",",$recently);
$query_where .= " and a.Message_ID in ($glist)";
$query_order="FIELD(Message_ID,$glist)";
}
else $query_where = "1<0"; // если ничего не смотрели, то и выводить ничего не нужно[/CODE]
Создал новый раздел "Вы смотрели" добавил к нему 57 компонент и выбрал созданный шаблон компонента.
Сначала посмотрел три товара, потом перехожу в раздел "Вы смотрели" Там пусто.
Просмотр информации о странице, а именно куков показывает переменную recently
c соержимым a%3A1%3A%7Bi%3A0%3Bs%3A3%3A%22363%22%3B%7D (т.е. a:1:{i:0;s:4:"1985";}). Таких переменных три, и у каждой своё содержимое.
Что-то делаю не так?
[CODE]<a href='?rhist=1'>Очистить историю</a>
[/CODE]
в системных настройках:
[CODE]if($rhist) {
setcookie ("recently", "", time() - 3600);
}[/CODE]
Как-то так. :-)
Таким макаром тоже не удаляется))
[CODE]if($rhist) {
setcookie ("recently", "");
}[/CODE]
А как впринципе эту recently печеньку удалить? У меня стоит проверка, если в кукисах есть эта переменная, то раздел вы смотрели активен, если этой печеньки нет, то раздел скрыт от глаз.
Можно попробовать тогда такой код:
[CODE]
if($rhist) {
setcookie ('recently', '', time() - 3600,'/');
}
[/CODE]
Обратите внимание, что в адресной строке должно стоять ?rhist=1
Появилась идея на вашей базе написать код сравнения товаров)))
Если установить галку в чекбокс, он записывает id товара в печеньку. Потом переходим в раздел сравнения и смотрим, чем же отличаются товары. Вот только ума не приложу как заставить отмеченный чекбокс записывать в куку на вашем примере "Истории просмотров". Есть идеи?
Только я делал не чекбоксом, а картинку-звездочку дизайнер нарисовал, но сути это не меняет. Запоминание в куку можно делать с помощью плагина jquery.cookie.js, через onclick-событие. Но я не вижу смысла запоминать эту информацию в COOKIE. SESSION по-моему ощутимо удобнее и безопаснее.
Тогда вам надо исправить одну строчку в системных настройках компонента, вот таким образом:[CODE]
$query_order="FIELD([COLOR=FF0000]a.[/COLOR]Message_ID,$glist)";
[/CODE]
а если в каталоге нужно вывести в Отображение объекта. например снизу, как поступить?
<?=nc_objects_list($sub,$cc,"nc_ctpl=2345")?>
где 2345 - номер этого самого шаблона. У вас номер будет свой, конечно.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '20) AND sub.`Catalogue_ID` = '1' AND a.`Checked` = 1 ORDER BY FIELD(Message_ID' at line 5
на другом сайте работает, разобравться не могу