Через использование функции, оставляем активным только самый новый по ID элемент в указанном инфоблоке, а все остальные активные элементы — деактивируем, обеспечивая «единственный активный» без ручного управления.
Код |
---|
<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
\Bitrix\Main\Loader::includeModule('iblock');
use Bitrix\Iblock\ElementTable;
/**
* Активирует самый свежий элемент в инфоблоке, деактивируя все остальные.
* @param int $iblockId ID инфоблока
*/
function activateLatestOnly(int $iblockId): void {
// Находим самый последний элемент по ID
$latest = ElementTable::getList([
'select' => ['ID'],
'filter' => ['=IBLOCK_ID' => $iblockId],
'order' => ['ID' => 'DESC'],
'limit' => 1,
])->fetch();
if (!$latest) {
echo "Нет элементов в инфоблоке $iblockId\n";
return;
}
$latestId = (int)$latest['ID'];
$el = new \CIBlockElement;
// Активируем последний элемент через официальный API
if ($el->Update($latestId, ['ACTIVE' => 'Y'])) {
echo "Элемент ID $latestId успешно активирован.\n";
} else {
echo "Ошибка активации элемента ID $latestId: " . implode(', ', $el->LAST_ERROR) . "\n";
return;
}
// Деактивируем все остальные активные элементы
$others = ElementTable::getList([
'select' => ['ID'],
'filter' => [
'=IBLOCK_ID' => $iblockId,
'=ACTIVE' => 'Y',
'!=ID' => $latestId
]
]);
$deactivatedCount = 0;
while ($element = $others->fetch()) {
if ($el->Update($element['ID'], ['ACTIVE' => 'N'])) {
$deactivatedCount++;
} else {
echo "Ошибка деактивации элемента ID {$element['ID']}: " . implode(', ', $el->LAST_ERROR) . "\n";
}
}
echo "Деактивировано элементов: $deactivatedCount\n";
}
// Пример вызова:
// activateLatestOnly(1); |
Раскомментируйте последнюю строку для вызова функции