Задача: все товары, которых нет в наличии, выводить в самом конце того или иного раздела + сортировка по цене. Причем нужно учитывать пагинацию: товары, которых нет в наличии, нужно выводить на последних страницах, а не в конце текущей. В общем, вот такая реализация:
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….