Задача: все товары, которых нет в наличии, выводить в самом конце того или иного раздела + сортировка по цене. Причем нужно учитывать пагинацию: товары, которых нет в наличии, нужно выводить на последних страницах, а не в конце текущей. В общем, вот такая реализация:

1) Создаем дополнительное свойство:

1

нажимаем Применить, после записываем ID нового значения, в нашем случае это 29.

2

 

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 цены, по которой сортировать.

На этом все, должно работать Улыбка

Подписываемся на обновления блога по Email:

Введите адрес электронной почты



Метки: , ,

1 комментарий


  1. samizdam on 08 Апр 2013

    О Боже, а без такого изврата никак не реализовать? bitrix, bitrix….


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