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

Работа с товарами каталога с помощью класса «\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;



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

}

}

Вливайтесь в общениеДобавить комментарий