При помощи данного скрипта и 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)); }
Что в скрипте можно улучшить? Можно собирать массив уже отмеченных новинок и если они совпадают с “новым списком”, то их не трогаем, и пропускаем в цикле.