Шпаргалка. Деактивация товаров у которых нет ни одного активного торгового предложения
Запись от 19.11.2014
В ходе определенной синхронизации были необходимо деактивировать товары, у которых нет ни одного активного оффера. Для этого был написан простой скрипт, который хотелось бы сохранить на всякий случай здесь
$arProds = Array(); // Массив со всеми товарами
$resOffers = CIBlockElement::GetList( // Делаем выборку офероф
Array(),
Array('IBLOCK_ID' => $IBLOCK_OFFERS_ID),
false,
false,
Array('IBLOCK_ID', 'ID', 'ACTIVE', 'PROPERTY_CML2_LINK.ID')
);
while($arOffer = $resOffers->GetNext()) { // Записываем активность офферов товара в массив $arProds
$iProdId = $arOffer['PROPERTY_CML2_LINK_ID'];
$iOfferId = $arOffer['ID'];
$arProds[$iProdId][$iOfferId] = $arOffer['ACTIVE'];
}
$arProdsToDeact = Array(); // Массив товаров для деактивации
foreach($arProds as $iProdId=>$arOffers) { // Перебор всех товаров
$bDeact = true; // По умолчанию товар декативируем
foreach($arOffers as $iOfferId=>$sOfferActive) { // Но саначала посмотрим оферы товара
if($sOfferActive == "Y") { // Если хоть один активен
$bDeact = false; // Отменяем деактивацию
break; // И выходим из перебора офероф
}
}
if($bDeact) { // Если товар все таки нужно деактивировать
$arProdsToDeact[] = $iProdId; // Запишем его в массив $arProdsToDeact
}
}
$elProd = new CIBlockElement;
$arProd = Array('ACTIVE' => 'N'); // Каждому указываем новое значение активности
foreach($arProdsToDeact as $keyProd=>$iProdId) { // Пройдем массив товаров для деактивации по порядку
$res = $elProd->Update($iProdId, $arProd); // И обновляем
}