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 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com

Email: dmitriyribka@gmail.com

7 коментаря

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

      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″>

Залишити коментар до Ирина Скасувати коментар