Задача: все товары, которых нет в наличии, выводить в самом конце того или иного раздела + сортировка по цене. Причем нужно учитывать пагинацию: товары, которых нет в наличии, нужно выводить на последних страницах, а не в конце текущей. В общем, вот такая реализация:
1) Создаем дополнительное свойство:
нажимаем Применить, после записываем ID нового значения, в нашем случае это 29.
2) Теперь нам нужно автоматизировать это свойство. Я решил для этого использовать Events битрикса. В /bitrix/php_interface/init.php вставляем сие безобразие:
AddEventHandler("catalog", "OnProductAdd", "UpdateProperyInStock");
AddEventHandler("catalog", "OnProductUpdate", "UpdateProperyInStock");
function UpdateProperyInStock($ID, $arFields)
{
if($arFields['QUANTITY'] != 0)
{
CIBlockElement::SetPropertyValuesEx(
$ID,
false,
array('IN_STOCK' =>
array( 'VALUE' => '29' ),
)
);
}
else
{
CIBlockElement::SetPropertyValuesEx(
$ID,
false,
array('IN_STOCK' =>
array( 'VALUE' => '' ),
)
);
}
}
Вместо 29 вставляем ID своего значения.
3) Теперь, если открыть товар и пересохранить через админку, то наше новое свойство примит нужное значение исходя из наличия товара на складе. Если пересохранять каждый каждый товар, то на этом можно и закончить работу со свойством. В моем случае это был магазин с 3к товаров. Работать руками – не вариант. Пишем скрипт для этих нужд.
<?
$_SERVER["DOCUMENT_ROOT"] = dirname(__FILE__);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule('iblock');
CModule::IncludeModule('catalog');
$bs = new CIBlockElement;
$arFilter = array(
'IBLOCK_ID'=>27
);
$obElement = $bs->GetList(Array("SORT"=>"ASC"),$arFilter);
while( $arElement = $obElement->GetNext() )
{
$arRes = CCatalogProduct::GetByIDEx($arElement['ID']);
if($arRes['PRODUCT']['QUANTITY'] != 0)
{
CIBlockElement::SetPropertyValuesEx(
$arElement['ID'],
false,
array('IN_STOCK' =>
array( 'VALUE' => '29' ),
)
);
}
else
{
CIBlockElement::SetPropertyValuesEx(
$arElement['ID'],
false,
array('IN_STOCK' =>
array( 'VALUE' => '' ),
)
);
}
}
Ложим его в корень сайта, запускаем через консоль (если таковой нет, пилите скрипт, чтобы он обрабатывал не все товары сразу, а “пачками”).
4) Теперь сама сортировка. Рассматриваем вариант, когда уже компонент catalog.section кастомизирован. Открываем /bitrix/components/folder/catalog.section/component.php. В районе 460-480 строк находим переменную $arSort, изменяем/добавляем:
$arSort = array(
"PROPERTY_IN_STOCK_VALUE" => "yes",
"CATALOG_PRICE_6" => "ASC",
);
CATALOG_PRICE_6 – ID цены, по которой сортировать.
На этом все, должно работать ![]()
О Боже, а без такого изврата никак не реализовать? bitrix, bitrix….