Битрикс – определяем новинки в каталоге

При помощи данного скрипта и API Bitrix можно определить какие из товаров являются новинками.

Как выставить товарам свойство “Новинка” в Битриксе?

Задача: Выставить у товаров флаг “Новинка” автоматически без участия пользователя.
Решение: Разбиваем на несколько шагов.
Шаг 1. Подключаем пролог и модуль инфоблоков:

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");

Шаг 2. Задаем стартовые параметры:

$iblockID = 33;
$propNewID = 1138;
$arOrder = ['ID' => 'DESC'];
$arFilter = ['IBLOCK_ID' => $iblockID, 'ACTIVE' => 'Y', 'PROPERTY_HIT' => $propNewID];
$arNavStartParams = ['nTopCount' => '10'];
$arSelectFields = ['ID', 'NAME'];
$arGroupBy = false;

Тут нужны некоторые пояснения – 33, это ID нашего инфоблока, 1138 – ID значения свойства тип список, где и определяется что этот товар является новинкой. Сортировка по ID по убыванию – таким образом все товары будут отсортированы по новизне.
‘PROPERTY_HIT’ => $propNewID – выбираем в базе товары отмеченные, как новинки
‘nTopCount’ => ’10’ – отмечать будем только 10 товаров

Шаг 3. Убираем у всех товаров флаг Новинка:

$dbRes = CIBlockElement::GetList($arOrder, $arFilter, $arGroupBy, $arNavStartParams, $arSelectFields);
while ($arRes = $dbRes->Fetch()) {
	CIBlockElement::SetPropertyValuesEx($arRes['ID'], $iblockID, array("HIT" => false));
}

Обратите внимание, что тут тоже сработает $arNavStartParams = [‘nTopCount’ => ’10’]; и флаг снимется только у 10 товаров.
Шаг 4. Задаем свойство Новинка для новых товаров:

$arFilter = ['IBLOCK_ID' => $iblockID, 'ACTIVE' => 'Y'];
$dbRes = CIBlockElement::GetList($arOrder, $arFilter, $arGroupBy, $arNavStartParams, $arSelectFields);
while ($arRes = $dbRes->Fetch()) {
	CIBlockElement::SetPropertyValuesEx($arRes['ID'], $iblockID, array("HIT" => $propNewID));
}

Вот таким вот образом можно выбрать в битриксе новые товары и отметить их специальном значком. Нужно проставить им соответствующее свойство 🙂 .
Код целиком:

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");

// Параметры
$iblockID = 33;
$propNewID = 1138;
$arOrder = ['ID' => 'DESC'];
$arFilter = ['IBLOCK_ID' => $iblockID, 'ACTIVE' => 'Y', 'PROPERTY_HIT' => $propNewID];
$arNavStartParams = ['nTopCount' => '10'];
$arSelectFields = ['ID', 'NAME'];
$arGroupBy = false;


// Ищем товары которые уже отмечены как новинки
$dbRes = CIBlockElement::GetList($arOrder, $arFilter, $arGroupBy, $arNavStartParams, $arSelectFields);
while ($arRes = $dbRes->Fetch()) {
	CIBlockElement::SetPropertyValuesEx($arRes['ID'], $iblockID, array("HIT" => false));
}


// Собираем актуальные новинки
$arFilter = ['IBLOCK_ID' => $iblockID, 'ACTIVE' => 'Y'];
$dbRes = CIBlockElement::GetList($arOrder, $arFilter, $arGroupBy, $arNavStartParams, $arSelectFields);
while ($arRes = $dbRes->Fetch()) {
	CIBlockElement::SetPropertyValuesEx($arRes['ID'], $iblockID, array("HIT" => $propNewID));
}

Что в скрипте можно улучшить? Можно собирать массив уже отмеченных новинок и если они совпадают с “новым списком”, то их не трогаем, и пропускаем в цикле.

автор: Dmitriy

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

Email: dmitriyribka@gmail.com

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *