Добавляем товарам новое свойство типа Число, например, CART_COUNT:
Добавляем обработчик события добавления в корзину. Используем событие D7 OnAfterAdd:
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler("sale", "\Bitrix\Sale\Internals\Basket::OnAfterAdd", ['CustomEventHandlers', 'increaseCartCounter']);
class CustomEventHandlers
{
function increaseCartCounter(\Bitrix\Main\Entity\Event $event)
{
\Bitrix\Main\Loader::includeModule('iblock');
$fields = $event->getParameter('fields');
$catalogIblockId = 1; // IBLOCK_ID каталога
$currentCount = \CIBlockElement::GetProperty($catalogIblockId, $fields['PRODUCT_ID'], [], ["CODE" => "CART_COUNT"])->fetch();
\CIBlockElement::SetPropertyValuesEx($fields['PRODUCT_ID'], $catalogIblockId, ['CART_COUNT' => $currentCount['VALUE'] + 1]);
}
}
По желанию можно заполнить свойство каким-то начальным значением. Например, посчитаем какие товары лежат в настоящее время в корзинах пользователей:
\Bitrix\Main\Loader::includeModule("iblock");
\Bitrix\Main\Loader::includeModule("sale");
$catalogIblockId = 1; // IBLOCK_ID каталога
$counts = \Bitrix\Sale\Internals\BasketTable::getList([
'filter' => [
'=ORDER_ID' => null,
'LID' => 's1'
],
'select' => ['PRODUCT_ID', 'RT_CNT'],
'group' => ['PRODUCT_ID'],
'runtime' => [
new \Bitrix\Main\Entity\ExpressionField('RT_CNT', 'COUNT(*)'],
)
]);
while ($count = $counts->fetch()) {
\CIBlockElement::SetPropertyValuesEx($count['PRODUCT_ID'], $catalogIblockId, ['CART_COUNT' => $count['RT_CNT']]);
}
Теперь можно использовать свойство CART_COUNT для сортировки, например, в catalog.section:
...
"ELEMENT_SORT_FIELD" => "PROPERTY_CART_COUNT",
"ELEMENT_SORT_ORDER" => "DESC",
...