Типы цен и цены на товары

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

Сентябрь 21, 2018

Теги: ORM, Магазин

Работа с типами цен модуля "Торговый каталог" при помощи классов "\Bitrix\Catalog\GroupTable", "\Bitrix\Catalog\GroupLangTable", "\Bitrix\Catalog\GroupAccessTable", "\Bitrix\Catalog\PriceTable".

"\Bitrix\Catalog\GroupTable": Таблица типов цен
"\Bitrix\Catalog\GroupLangTable": Таблица языковых параметров типов цен
"\Bitrix\Catalog\GroupAccessTable": Таблица прав доступа к типам цен
"\Bitrix\Catalog\PriceTable": Таблица непосредственно цен на товары, но использовать вместо него нужно "\Bitrix\Catalog\Model\Price", иначе в некоторых местах цена может не обновиться

Выборка всех типов цен:


$rsGroup \Bitrix\Catalog\GroupTable::getList();


while(
$arGroup=$rsGroup->fetch())
{
    
print_r($arGroup);
}

/*
Array
(
    [ID] => 1
    [NAME] => base_price
    [BASE] => Y
    [SORT] => 100
    [XML_ID] => base_price
    [TIMESTAMP_X] => Bitrix\Main\Type\DateTime Object
        (
            [value:protected] => DateTime Object
                (
                    [date] => 2018-09-13 01:27:38.000000
                    [timezone_type] => 3
                    [timezone] => Europe/Moscow
                )

        )

    [MODIFIED_BY] => 1
    [DATE_CREATE] => Bitrix\Main\Type\DateTime Object
        (
            [value:protected] => DateTime Object
                (
                    [date] => 2017-08-04 17:13:40.000000
                    [timezone_type] => 3
                    [timezone] => Europe/Moscow
                )

        )

    [CREATED_BY] => 1
)
Array
(
    [ID] => 2
    [NAME] => action_price
    [BASE] => N
    [SORT] => 1001
    [XML_ID] => action_price
    [TIMESTAMP_X] => Bitrix\Main\Type\DateTime Object
        (
            [value:protected] => DateTime Object
                (
                    [date] => 2017-12-27 16:40:30.000000
                    [timezone_type] => 3
                    [timezone] => Europe/Moscow
                )

        )

    [MODIFIED_BY] => 1
    [DATE_CREATE] => Bitrix\Main\Type\DateTime Object
        (
            [value:protected] => DateTime Object
                (
                    [date] => 2017-11-08 18:12:20.000000
                    [timezone_type] => 3
                    [timezone] => Europe/Moscow
                )

        )

    [CREATED_BY] => 1
)
*/

Выборка языкозависимого названия типа цены с XML_ID='base_price' (дополнительно выбираем ID и XML_ID из основной таблицы типов цен):


$rsGroup \Bitrix\Catalog\GroupLangTable::getList(array(

    
'filter' => array('LANG'=>LANGUAGE_ID,'CATALOG_GROUP.XML_ID'=>'base_price'),
    
'select' => array('NAME','XML_ID'=>'CATALOG_GROUP.XML_ID''CATALOG_GROUP_ID')
));

if(
$arGroup=$rsGroup->fetch())
{
    
print_r($arGroup);
}

/*
Array
(
    [NAME] => Цена из 1С
    [XML_ID] => bace_price
    [CATALOG_GROUP_ID] => 1
)
*/

Выбираем ID групп пользователей, которым доступна цена с XML_ID='base_price':


$rsGroup \Bitrix\Catalog\GroupAccessTable::getList(array(

    
'filter' => array('ACCESS'=>'Y','CATALOG_GROUP.XML_ID'=>'base_price'),
    
'select' => array('GROUP_ID')
));

while(
$arGroup=$rsGroup->fetch())
{
    
print_r($arGroup);
}

/*
Array
(
    [GROUP_ID] => 1
)
Array
(
    [GROUP_ID] => 2
)
Array
(
    [GROUP_ID] => 3
)
Array
(
    [GROUP_ID] => 4
)
*/

Выборка цены типа XML_ID='base_price' товара с ID=15547:


$rsPrice \Bitrix\Catalog\Model\Price::getList(array(

    
'filter'=>array('CATALOG_GROUP.XML_ID'=>'base_price','PRODUCT_ID'=>15547)
));

while(
$arPrice=$rsPrice->fetch())
{
    
print_r($arPrice);
}

/*
Array
(
    [ID] => 29146
    [PRODUCT_ID] => 15547
    [EXTRA_ID] => 
    [CATALOG_GROUP_ID] => 1
    [PRICE] => 1350.00
    [CURRENCY] => RUB
    [TIMESTAMP_X] => Bitrix\Main\Type\DateTime Object
        (
            [value:protected] => DateTime Object
                (
                    [date] => 2018-09-20 15:07:20.000000
                    [timezone_type] => 3
                    [timezone] => Europe/Moscow
                )

        )

    [QUANTITY_FROM] => 
    [QUANTITY_TO] => 
    [TMP_ID] => 
    [PRICE_SCALE] => 1350.000000000000
)
*/

Функция обновления цены определенного типа у товара:


function savePrice($catalogGroupId,$price,$productId,$currency='RUB')

{
    if(!
$catalogGroupId || !$productId || !$currency)
        return array(
"Неверно заданы параметры");

    
$rsP \Bitrix\Catalog\Model\Price::getList(array(
        
'filter' => array('CATALOG_GROUP_ID'=>$catalogGroupId,'PRODUCT_ID'=>$productId),
    ));

    if(
$arP=$rsP->fetch())
    {
        if(
$price)
        {
            
$result \Bitrix\Catalog\Model\Price::update($arP['ID'],array(
                
'PRICE'=>$price,
                
'PRICE_SCALE'=>$price,
                
'CURRENCY'=>$currency,
            ));
        }
        else
        {
            
$result \Bitrix\Catalog\Model\Price::delete($arP['ID']);
        }
    }
    else
    {
        
$result \Bitrix\Catalog\Model\Price::add(array(
            
'CATALOG_GROUP_ID'=>$catalogGroupId,
            
'PRODUCT_ID'=>$productId,
            
'PRICE'=>$price,
            
'PRICE_SCALE'=>$price,
            
'CURRENCY'=>$currency,
        ));            
    }
    
    if(
$result->isSuccess()) 
    {
        return 
true;
    }
    else
    {
        return 
$result->getErrorMessages();
    }
}

Выборка из таблицы цен с фильтром и выборкой по товару и элементу инфоблока:


$priceResult \Bitrix\Catalog\PriceTable::getList([

    
'order' => [
        
'PRICE'=>'ASC'
    
],
    
'filter' => [
        
'ELEMENT.IBLOCK_ID' => 10,
        
'ELEMENT.ACTIVE' => 'Y',
        
'PRODUCT.AVAILABLE' => 'Y',
    ],
    
'limit' => 1,
    
'select' => [
        
'*',
        
'NAME' => 'ELEMENT.NAME',
        
'XML_ID' => 'ELEMENT.XML_ID',
    ],
]);
        
$price $priceResult->fetch();

См. также:

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