1С-Битрикс Просмотренные товары при помощи $_COOKIE

В редакциях 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, не позволяет нормально отсортировать товары перед выводом.

Подобное решение писалось относительно давно и я уверен, его можно переписать и улучшить в несколько раз, но это уже другая история 🙂

автор: Dmitriy

Занимаюсь веб-разработкой с 2011 года. Посмотреть некоторые из моих работ, а также узнать чуть больше обо мне, вы можете на forwww.ru.

Какие услуги предоставляю:
- Создание сайтов, шаблонов и компонентов на 1С-Битрикс;
- Разработка функционала с нуля и доработка кода на уже созданных проектах;
- Адаптивная вёрстка макетов и натяжка на Битрикс;
- Парсинг файлов и выгрузка на сайт (форматы - CSV, XML, XLSX, JSON)
- Интеграции со сторонними сервисами по API;
- Многоязычные версии и многое другое.

Если у вас остались вопросы, свяжитесь со мной любым удобным для вас способом или оставьте комментарий внизу.
E-mail: dmitriyribka@gmail.com
Skype: cinemacreaterus

7 комментария

  1. Пишу плагин на wp — надо запоминать в куки id записей custom post type (в моем случае product) Не подскажешь, как быть? голову сломал уже) Спасибо)

    1. id записей? я так понимаю нужно записать в виде строки, например через запятую, а потом преобразовывать строку в массив через функцию implode.

  2. Добрый день! А как вывести определенное количество просмотренных товаров?

      1. но я вывела просмотренные товары записанные в 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″>

        1. если вы используете мой код, то просто замените в цикле count($my_product_id) на «5» — ограничит до 5

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *