Bitrix

Сортировка по наличию товара

До сих пор в ядре CMS 1C-Битрикс не добавлена возможность сортировки по наличию товара на складе, т.е. не по количеству, а по наличию — факту того если ли товар на складе или он отсутствует. Пока на просьбу клиента, чтобы при любой сортировке выдачи каталога товаров те товары, которых нет на складе были в конце списка приходится решать с помощью нижепредставленного велосипеда.1. Нужно создать свойство в информационном блоке, где должна быть такая фильтрация — IS_AVAILABLE . Это свойство можно сделать просто символьного типа. Оно у нас будет принимать всего 2 значения: 0 — если товара нет на складе, 1- если товар есть на складе.

2. Нужно сделать так, чтобы при заведении нового товара или обновлении старого товара свойство IS_AVAILABLE автоматически обновлялось. Этого можно добиться, добавив такой код в файл /bitrix/php_interface/init.php (либо в файл /bitrix/php_interface/Ваш_идентификатор_сайта/init.php при использовании многосайтовости) .

AddEventHandler("catalog", "OnBeforeProductAdd", "OnBeforeIBlockElement");
AddEventHandler("catalog", "OnBeforeProductUpdate", "OnBeforeIBlockElement");
function OnBeforeIBlockElement($ID, $arFields = false)
{
if(is_array($ID))
{
$arFields = $ID;
$IS_AVAILABLE = $arFields["QUANTITY"] > 0? 1: 0;
$ELEMENT_ID = $arFields["ID"];
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array("IS_AVAILABLE" => $IS_AVAILABLE));
}
elseif(is_int($ID) && is_array($arFields) && isset($arFields["QUANTITY"]))
{
$IS_AVAILABLE = $arFields["QUANTITY"] > 0? 1: 0;
$ELEMENT_ID = $ID;
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array("IS_AVAILABLE" => $IS_AVAILABLE));
}
}

3. Нужно добавить сортировку в компонент bitrix:catalog.section и поставить ее первой. Сортировка должна быть по PROPERTY_IS_AVAILABLE , направление DESC.

4. Если у вас уже есть записанные товары и вы не хотите их пересохранять вручную, чтобы свойство перезаписалось, то нужно запустить примерно такой скрипт:

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
?>

<?
set_time_limit(0);
CModule::IncludeModule("iblock");

$arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM", "CATALOG_QUANTITY");
$arFilter = Array("IBLOCK_ID"=>1);
$res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>10000000), $arSelect);
while($ob = $res->GetNext())
{
$IS_AVAILABLE = $ob["CATALOG_QUANTITY"] > 0? 1: 0;
$ELEMENT_ID = $ob["ID"];
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array("IS_AVAILABLE" => $IS_AVAILABLE));
}
?>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

В этом скрипте вам нужно заменить в $arFilter = Array(«IBLOCK_ID»=>1);  идентификатор инфоблока, на тот, который должен быть у вас.

После этого у вас должна заработать эта сортировка.

К слову говоря, от пользователей платформы такая идея есть http://idea.1c-bitrix.ru/sortirovka-tovarov-po-nalichiyu-na-sklade/ , так что вполне возможно что функционал будет когда-либо выполнен штатным образом. Но пока можно действовать только указанным выше способом.

Отставить комментарий

Ваш электронный адрес не будет опубликован.Обязательные для заполнения поля отмечены *

четырнадцать + 11 =