Сентябрь 21, 2018
Работа с типами цен модуля "Торговый каталог" при помощи классов "\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();