В редакциях 1С-Битрикс постарше, например “Малый бизнес”, есть стандартный компонент просмотренные товары. Рассмотрим ситуацию, когда у нас редакция “Стандарт”, а ваш каталог выполнен через компонент новостей.
Как записать переменную в $_COOKIE на PHP
Вы уже знаете про глобальные массивы, и наверняка слышали про массив $_SERVER, если не знаете, обязательно почитайте. Не то чтобы это было тем же самым, но вам это может пригодится, узнаете ниже почему.
$_COOKIE хранится в вашем браузере, срок хранения и имя переменной вы определяете сами. Чаще всего используется для сохранения “выбранной цветовой схемы” или любых других настроек уникальных для каждого пользователя.
Узнать содержимое массива можно как обычно:
<?print_r($_COOKIE);?>
Вполне может быть, что у вас там ничего не будет. Давайте запишем уже наконец-то свою первую куки переменную:
<? setcookie("NAME", "Value"); ?>
В этот раз давайте укажем больше параметров
<? setcookie("NAME", "Value", time()+86400, "/", "www.mydomain.com"); ?>
По порядку – имя переменной, значение, время жизни переменной, путь, домен.
Теперь важная особенность – путь мы записываем относительно корня сайта, чтобы сделать нашу переменную более мобильной, или я б даже сказал, глобальной. Она будет работать на всех страницах, и не будет записываться для какой-то конкретной страницы. Тут-то нам и пригодится глобальный массив СЕРВЕР – если вы не любите хардкодить (указывать динамические значения, статическими), то можно вытащить домен, а если нужен путь то и его (для нашей задачи не нужен).
Как записать просмотренные товары в куки 1С-Битрикс
Хватит теорий, займемся делом 🙂 Нам понадобится детальная страница новости, в нашей задачи это детальная страница товара. В коде детального шаблона есть $arResult[‘ID’] – он то нам и нужен.
<!-- COOKIE --> <? if (!isset($_COOKIE['PRODUCT_VIEW'])) { $value = $arResult['ID']; setcookie("NAME", "Value", time()+86400, "/", "www.mydomain.com"); } else { if (!strstr($_COOKIE['PRODUCT_VIEW'], $arResult['ID'])) { if (substr_count($_COOKIE['PRODUCT_VIEW'], ",") <= 2) { $value = $arResult['ID'].",".$_COOKIE['PRODUCT_VIEW']; } else { $explode_id = explode(",", $_COOKIE['PRODUCT_VIEW']); $value = $arResult['ID'].",".$explode_id[0].",".$explode_id[1].",".$explode_id[2]; } setcookie("PRODUCT_VIEW", $value,time()+86400, "/", "www.domain.com"); } } ?>
Идея довольно простая – мы записываем максимум 4 товара в массив, при этом удаляем последний, а если переменная пустая – записываем ID. Сам массив, состоящий из ID, представляет собой строку, в котором идет перечисление через запятую. Но это не значит что нельзя записать массив:
<? setcookie("PRODUCT_VIEW[1]", 123); setcookie("PRODUCT_VIEW[2]", 234); setcookie("PRODUCT_VIEW[3]", 345); ?>
Как вывести просмотренные товары записанные в COOKIE
Для начала прочитайте статью про то, как узнать список элементов. Покажу вам самый главный фрагмент кода, т.к. детальный шаблон и его свойства все равно у всех свои. К тому же если вы поняли о чем идет речь в статье 🙂 значит вы и сами сможете все реализовать:
<ul class="cat"> <? $iblock_id = 14; if (strstr($_COOKIE['PRODUCT_VIEW'], ",")) { $my_product_id = explode(",", $_COOKIE['PRODUCT_VIEW']); } else { $my_product_id[0] = $_COOKIE['PRODUCT_VIEW']; } for ($i=0; $i<count($my_product_id); $i++) { $my_elements = CIBlockElement::GetList ( false, Array("IBLOCK_ID" => $iblock_id, "ID" => $my_product_id[$i]), false, false, Array('ID', 'NAME', 'DETAIL_PAGE_URL', 'SHOW_COUNTER', 'DETAIL_PICTURE', 'PROPERTY_PRICE_METR') ); while ($ar_fields = $my_elements->GetNext()) { $mypicture = CFile::ResizeImageGet( $ar_fields["DETAIL_PICTURE"], array("width"=>"267", "height"=>"192"), BX_RESIZE_IMAGE_PROPORTIONAL, true ); ?> <li> <!-- ваш код --> </li> } } ?> </ul>
Вы сейчас наверное смотрите на цикл в цикле и думаете – WTF? 🙂 Все дело в том, что массив он сортирует в порядке возрастания, а сортировка arOrder, не позволяет нормально отсортировать товары перед выводом.
Подобное решение писалось относительно давно и я уверен, его можно переписать и улучшить в несколько раз, но это уже другая история 🙂
Пишу плагин на wp – надо запоминать в куки id записей custom post type (в моем случае product) Не подскажешь, как быть? голову сломал уже) Спасибо)
id записей? я так понимаю нужно записать в виде строки, например через запятую, а потом преобразовывать строку в массив через функцию implode.
ну и всё это записывать в куки – как работать с куками в статье есть 🙂
Добрый день! А как вывести определенное количество просмотренных товаров?
https://dev.1c-bitrix.ru/user_help/components/magazin/information_tovars/catalog_products_viewed.php – нужно разместить стандартный компонент и настроить его параметры
но я вывела просмотренные товары записанные в COOKIE
<?
$iblock_id = 5;
if (strstr($_COOKIE['PRODUCT_VIEW'], ",")) {
$my_product_id = explode(",", $_COOKIE['PRODUCT_VIEW']);
} else {
$my_product_id[0] = $_COOKIE['PRODUCT_VIEW'];
}
for ($i=0; $i $iblock_id, “ID” => $my_product_id[$i]),
false,
false,
Array(‘ID’, ‘NAME’, ‘DETAIL_PAGE_URL’, ‘SHOW_COUNTER’, ‘PREVIEW_PICTURE’, ‘PROPERTY_PRICE_METR’)
);
while ($ar_fields = $my_elements->GetNext()) {
?>
<a href="” class=”title-otziv1″>
если вы используете мой код, то просто замените в цикле count($my_product_id) на “5” – ограничит до 5