Октябрь 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;
// что-то делаем
}
}