Фильтрация по наличию на складах - uniqcle/Bitrix GitHub Wiki
Умный фильтр Битрикса не поддерживает фильтрацию по складам (потому как работает только со свойствами элементов). Следовательно, чтобы добавить в возможность фильтровать товар по наличию на складах, нужно добавить соответствующие свойства в карточку элемента. Для этого напишем обработчик в init.php, который при изменении количества товара на складе будет проставлять нужные свойства в карточку элемента.
Примерный код:
AddEventHandler("catalog", "OnStoreProductUpdate", Array("MyClass", "NalichieNaSkladah"));
class MyClass
{
// создаем обработчик события
function NalichieNaSkladah($ID,$arFields)
{
if($ID>0)
{
$elem = $arFields[PRODUCT_ID];
CModule::IncludeModule('catalog'); //
$in_nal = NULL;
$out_nal = NULL;
$arFilter = Array("PRODUCT_ID"=>$elem, '>PRODUCT_AMOUNT' => 0);
$arSelectFields = Array( "ID", "ACTIVE", "TITLE", "PHONE", "SCHEDULE", "ADDRESS", "DESCRIPTION",
"GPS_N", "GPS_S", "IMAGE_ID", "DATE_CREATE", "DATE_MODIFY", "USER_ID", "XML_ID", "PRODUCT_AMOUNT");
$res = CCatalogStore::GetList(Array(),$arFilter,false,false,$arSelectFields);
while ($arRes = $res->GetNext()) {
$STORE_LIST[]=$arRes['ID']; // получим данные о наличии на складах данного товара
}
$in_store = array(12, 13, 14, 16); // проверяем на наличие на "своих складах"
foreach ($in_store as $value) {
$in_nal = in_array($value, $STORE_LIST);
if($in_nal === TRUE){
$nal_prop_array[] = 20204; // добавляем в массив свойство "свои склады"
break;
}
}
$out_store = array(1,2,3,4,5,6,7,8,9,10,11); // проверяем на наличие на "чужих складах"
foreach ($out_store as $value) {
$out_nal = in_array($value, $STORE_LIST);
if($out_nal === TRUE){
$nal_prop_array[] = 20203; // добавляем в массив свойство "чужие склады"
break;
}
}
if($out_nal=== NULL && $in_nal === NULL){
$nal_prop_array[] = 20205; // добавляем в массив свойство "нет на складе"
}
CIBlockElement::SetPropertyValuesEx($elem, 12, array(5197 => $nal_prop_array)); // запишем свойство
}
else
{
echo '<pre>', print_r('Ошибка изменения элемента'), '</pre>';
}
}
}