Работа с товарами каталога

Модуль расширенного управления меню для битрикс

Октябрь 18, 2018

Теги: ORM, Хранение данных, Магазин

Работа с товарами каталога с помощью класса "\Bitrix\Catalog\ProductTable".

Получение информации о товаре каталога (тип, количество и др.) с идентификатором в переменной $productId:


$result \Bitrix\Catalog\ProductTable::getList(array(

    
'filter' => array('=ID'=>$productId),
));

if(
$product=$result->fetch())
{
    
print_r($product);
}

/*
Array
(
    [ID] => 18651
    [QUANTITY] => 25
    [QUANTITY_TRACE] => Y
    [WEIGHT] => 0
    [TIMESTAMP_X] => Bitrix\Main\Type\DateTime Object
        (
            [value:protected] => DateTime Object
                (
                    [date] => 2018-10-17 21:27:39.000000
                    [timezone_type] => 3
                    [timezone] => Europe/Moscow
                )

        )

    [PRICE_TYPE] => S
    [RECUR_SCHEME_LENGTH] => 
    [RECUR_SCHEME_TYPE] => D
    [TRIAL_PRICE_ID] => 
    [WITHOUT_ORDER] => N
    [SELECT_BEST_PRICE] => N
    [VAT_ID] => 
    [VAT_INCLUDED] => Y
    [CAN_BUY_ZERO] => N
    [NEGATIVE_AMOUNT_TRACE] => N
    [TMP_ID] => 
    [PURCHASING_PRICE] => 
    [PURCHASING_CURRENCY] => 
    [BARCODE_MULTI] => N
    [QUANTITY_RESERVED] => 0
    [SUBSCRIBE] => Y
    [WIDTH] => 
    [LENGTH] => 
    [HEIGHT] => 
    [MEASURE] => 5
    [TYPE] => 1
    [AVAILABLE] => Y
    [BUNDLE] => N
)

предустановленные константы:

STATUS_YES = 'Y';
STATUS_NO = 'N';
STATUS_DEFAULT = 'D';

TYPE_PRODUCT = 1; // простой товар
TYPE_SET = 2; // набор
TYPE_SKU = 3; // товар с предложениями
TYPE_OFFER = 4; // предложение
TYPE_FREE_OFFER = 5;
TYPE_EMPTY_SKU = 6;

PAYMENT_TYPE_SINGLE = 'S';
PAYMENT_TYPE_REGULAR = 'R';
PAYMENT_TYPE_TRIAL = 'T';

PAYMENT_PERIOD_HOUR = 'H';
PAYMENT_PERIOD_DAY = 'D';
PAYMENT_PERIOD_WEEK = 'W';
PAYMENT_PERIOD_MONTH = 'M';
PAYMENT_PERIOD_QUART = 'Q';
PAYMENT_PERIOD_SEMIYEAR = 'S';
PAYMENT_PERIOD_YEAR = 'Y';
PAYMENT_PERIOD_DOUBLE_YEAR = 'T';

PRICE_MODE_SIMPLE = 'S';
PRICE_MODE_QUANTITY = 'Q';
PRICE_MODE_RATIO = 'R';
*/

Выборка дополнительно информации из элемента инфоблока, связанного с этим товаром (название, символьный код):


$result \Bitrix\Catalog\ProductTable::getList(array(

    
'filter' => array('=ID'=>$productId),
    
'select' => array('ID','QUANTITY','NAME'=>'IBLOCK_ELEMENT.NAME','CODE'=>'IBLOCK_ELEMENT.CODE'),
));

if(
$product=$result->fetch())
{
    
print_r($product);
}

/*
Array
(
    [ID] => 18651
    [QUANTITY] => 25
    [NAME] => Название товара
    [CODE] => nazvanie-tovara
)
*/

Обновляем поле "QUANTITY" из переменной $quantity товара с идентификатором в переменной $productId с автоматическим обновлением поля "AVAILABLE" ("Доступность"):


$productResult \Bitrix\Catalog\ProductTable::getList(array(

    
'filter' => array('=ID'=>$productId),
    
'select' => array('QUANTITY_TRACE','CAN_BUY_ZERO'),
));
if(
$product=$productResult->fetch())
{
    
$product['QUANTITY'] = $quantity;
    
\Bitrix\Catalog\ProductTable::update($productId,array(
        
'QUANTITY'=>$quantity,
        
'AVAILABLE'=>\Bitrix\Catalog\ProductTable::calculateAvailable($product),
    ));    
}

Пример обработчика события (делаем что-то при изменении поля "QUANTITY"):


namespace Partner;


$eventManager \Bitrix\Main\EventManager::getInstance();

$eventManager->addEventHandler('catalog''\Bitrix\Catalog\Product::onAfterAdd''\Partner\Handlers::productChange');
$eventManager->addEventHandler('catalog''\Bitrix\Catalog\Product::onAfterUpdate''\Partner\Handlers::productChange');

class 
Handlers
{    
    function 
productChange(\Bitrix\Main\Entity\Event $event)
    {
        
$id $event->getParameter("id");
        if(
is_array($id))
            
$id $id["ID"];
        if(!
$id)
            return;
        
$fields $event->getParameter("fields");

        if(!
is_array($fields) || !array_key_exists('QUANTITY'$fields))
            return;

        
// что-то делаем
    
}
}

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


namespace Partner;


$eventManager \Bitrix\Main\EventManager::getInstance();

$eventManager->addEventHandlerCompatible('catalog''OnProductAdd''\Partner\Handlers::productChangeCompatible');
$eventManager->addEventHandlerCompatible('catalog''OnProductUpdate''\Partner\Handlers::productChangeCompatible');

class 
Handlers
{    
    function 
productChangeCompatible($id,$fields)
    {
        if(!
$id || !array_key_exists('QUANTITY'$fields))
            return;

        
// что-то делаем
    
}
}

См. также:

← Переход к списку