- Update
- Описание и параметры
- Параметры вызова
- Возвращаемые значения
- Примеры использования
- Пользовательские комментарии
- Как обновить в торговом каталоге коэффициент единицы измерения?
- SOS! очень странный глюк или фича.
- CCatalogProduct
- Методы класса
- Пользовательские комментарии
- Заполнение габаритов товара, после обмена с 1С, из свойств элемента инфоблока.
- Заполняем параметры из свойств
- Дополнение: Если 1С выгружает габариты в множественное свойство «Реквизиты»
Update
Описание и параметры
Метод обновляет параметры товара, относящиеся к товару как к таковому. Нестатический метод.
Параметры вызова
| Параметр | Описание |
|---|---|
| ID | Код товара. |
| arFields | Ассоциативный массив, ключами которого являются названия параметров товара, а значениями — новые значения параметров. Допустимые ключи: |
ключи, независящие от типа товаров:
- QUANTITY — доступное количество товара;
- QUANTITY_RESERVED — зарезервированное количество;
- QUANTITY_TRACE — флаг (Y/N/D)* «включить количественный учет» (до версии 12.5.0 параметр назывался «уменьшать ли количество при заказе»);
ключи для обычных товаров:
- CAN_BUY_ZERO — флаг (Y/N/D)* «разрешить покупку при отсутствии товара»;
- NEGATIVE_AMOUNT_TRACE — флаг (Y/N/D)* «разрешить отрицательное количество товара»;
- SUBSCRIBE — флаг (Y/N/D)* «разрешить подписку при отсутствии товара»;
- PURCHASING_PRICE — закупочная цена;
- PURCHASING_CURRENCY — валюта закупочной цены;
WEIGHT — вес единицы товара;
- WIDTH — ширина товара (в мм);
- LENGTH — длина товара (в мм);
- HEIGHT — высота товара (в мм);
- MEASURE — ID единицы измерения;
- BARCODE_MULTI — (Y/N) определяет каждый ли экземпляр товара имеет собственный штрихкод;
ключи для продажи контента:
- PRICE_TYPE — тип цены (S — одноразовый платеж, R — регулярные платежи, T — пробная подписка);
- RECUR_SCHEME_TYPE — тип периода подписки («H» — час, «D» — сутки, «W» — неделя, «M» — месяц, «Q» — квартал, «S» — полугодие, «Y» — год);
- RECUR_SCHEME_LENGTH — длина периода подписки;
- TRIAL_PRICE_ID — код товара, для которого данный товар является пробным;
- WITHOUT_ORDER — флаг «Продление подписки без оформления заказа».
Возвращаемые значения
Возвращает true в случае успешного обновления параметров и false в противном случае.
Примеры использования
Обновление зарезервированного количества товара
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.
Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
Источник
Как обновить в торговом каталоге коэффициент единицы измерения?
Здравствуйте, перерыл весь интернет, и так не смог найти внятного, рабочего ответа, как обновить, или как добавить данный коэффициент.
При добавление товара параметр RATIO не работает
При обновление так же не работает
Пробовал следующие методы, и они тоже не работают:
Так как же все таки обновить, или добавить коэффициент?
- Вопрос задан более двух лет назад
- 2771 просмотр
Нашел ответ на свой вопрос, для того что бы изменить данный коэффициент необходимо его в начале добавить через функцию:
Выше код выдаст нам необходимый ID для обновления коэффициента через функцию:
Если же ID коэффициента есть, его можно узнать через функцию:
ProductTable::update должен возвращать объект класса Result. Посмотрите что в нём
Bitrix\Main\ORM\Data\UpdateResult Object
(
[affectedRowsCount:protected] =>
[primary:protected] =>
[wereErrorsChecked:protected] =>
[object:protected] =>
[isSuccess:protected] =>
[errors:protected] => Bitrix\Main\ErrorCollection Object
(
[values:protected] => Array
(
[0] => Bitrix\Main\ORM\EntityError Object
(
[code:protected] => BX_ERROR
[message:protected] => There is no data to update.
[customData:protected] =>
)
)
)
[data:protected] => Array
(
)
)
Источник
SOS! очень странный глюк или фича.
Всем привет!
Итак. У нас магазин одежды товаров с торговыми предложениями.
Включили количественный учет и резервирование при оформлении заказа.
первый недоработка Битрикса в том, что при изменении остатков по торговым предложениям (и доступного количества), не меняются остатки у товара (и доступное количество). ХОТЯ! настройка у комплексного компонента catalog и у catalog:section скрывать товары, у которых нет остатков есть!!
ну да ладно, код я нашла и он заработал. Но вот что обнаружила и никак не могу с этим справится.
Смотрим код, там все просто.
//change ostatki of goods
AddEventHandler(«catalog», «OnStoreProductUpdate»,»MyOnStoreProductSave» ;
AddEventHandler(«catalog», «OnStoreProductAdd»,»MyOnStoreProductSave» ;
function MyOnStoreProductSave($id, $arFields)<
$allAmount = $arFields[‘AMOUNT’];
if(CModule::IncludeModule(‘catalog’) & CModule::IncludeModule(‘iblock’))<
//Получаем информацию о товаре привязанном к данному приложению, вмести с этим проверяем не является ли это товаром.
$arProductInfo = CCatalogSKU::GetProductInfo($arFields[‘PRODUCT_ID’] ;
if(is_array($arProductInfo))<
//Получаем данные о инфоблоке Торговых предложений
$arOffersInfo = CCatalogSKU::GetInfoByProductIBlock($arProductInfo[‘IBLOCK_ID’] ;
$arFilter = Array(
‘IBLOCK_ID’=>$arOffersInfo[‘IBLOCK_ID’],
«PROPERTY_».$arOffersInfo[‘SKU_PROPERTY_ID’]=>$arProductInfo[‘ID’],
«!ID»=>$arFields[‘PRODUCT_ID’]
);
//Получаем список торговых предложений.
$obOffersList = CIBlockElement::GetList(Array(«SORT»=>»ASC» ,$arFilter,false,false,array());
$arOffers = array();
while($arOffers = $obOffersList->Fetch())<
//Получаем данные об остатках на складе для торгового предложения.
$obStoreOffer = CCatalogStoreProduct::GetList(array(), array(‘STORE_ID’=>$arFields[‘STORE_ID’], ‘PRODUCT_ID’ =>$arOffers[‘ID’] , false,false,array());
while($arStore = $obStoreOffer->Fetch()) <
$arAllStore[] = $arStore;
$allAmount = $allAmount + $arStore[‘AMOUNT’];
>
>
//Получаем данные о складе товара и формируем массив для обновления данных.
$obStoreProduct = CCatalogStoreProduct::GetList(array(), array(‘STORE_ID’=>$arFields[‘STORE_ID’], ‘PRODUCT_ID’ =>$arProductInfo[‘ID’] , false,false,array());
$arFieldsProduct = array (
‘PRODUCT_ID’ => $arProductInfo[‘ID’],
‘STORE_ID’ => $arFields[‘STORE_ID’],
‘AMOUNT’ => $allAmount,
);
//Обновляем склады у товара
$result = FALSE;
if($arStoreProduct = $obStoreProduct->Fetch()) <
$result = CCatalogStoreProduct::Update($arStoreProduct[«ID»],$arFieldsProduct);
>else <
$result = CCatalogStoreProduct::Add($arFieldsProduct);
>
//Если обновились склады, обновляем доступное количество у товара=сумма остатков по всем складам у товара
if($result) <
$obStoreProduct = CCatalogStoreProduct::GetList(array(), array(‘PRODUCT_ID’ =>$arProductInfo[‘ID’] , false,false,array());
while($arStoreProduct = $obStoreProduct->Fetch()) <
$allAmountProduct = $allAmountProduct + $arStoreProduct[‘AMOUNT’];
>
$arFieldsProduct = array(
«QUANTITY» => $allAmountProduct,
);
$arr= CCatalogProduct::GetByIDEx( $arProductInfo[‘ID’] ;
AddMessage2Log($arr);
AddMessage2Log(«res-«.$res.»id — «.$arProductInfo[‘ID’].» count — «.$allAmountProduct);
Смотрим самый конец $res=CCatalogProduct::Update ($arProductInfo[‘ID’],$arFieldsProduct);
Эта штука не корректно работает или я никак не пойму почему так происходит.
Поведение.
Если у товара пусто в поле доступное количество, то эта функция не работает. Если я руками через админку пишу доступное количество, то после этого момента функция начинает работать.
Ищу дальше.
Вызвала
$arr= CCatalogProduct::GetByIDEx( $arProductInfo[‘ID’] ;
AddMessage2Log($arr);
чтобы проверить, что же там такое и все раскрылось.
В первый раз когда пусто в доступном количестве и функция не срабатывает, педшые среди прочих возвращает ‘PRODUCT’ => false
Когда я руками вставила, и после этого все начало работать в параметре я уже вижу
‘PRODUCT’ =>
array (
‘ID’ => 32884,
‘QUANTITY’ => ‘196’,
‘QUANTITY_RESERVED’ => ‘0’,
‘QUANTITY_TRACE’ => ‘Y’,
‘QUANTITY_TRACE_ORIG’ => ‘D’,
‘WEIGHT’ => ‘0’,
‘WIDTH’ => ‘0’,
‘LENGTH’ => ‘0’,
‘HEIGHT’ => ‘0’,
‘MEASURE’ => ‘5’,
‘VAT_ID’ => ‘0’,
‘VAT_INCLUDED’ => ‘N’,
‘CAN_BUY_ZERO’ => ‘N’,
‘CAN_BUY_ZERO_ORIG’ => ‘D’,
‘NEGATIVE_AMOUNT_TRACE’ => ‘N’,
‘NEGATIVE_AMOUNT_TRACE_ORIG’ => ‘D’,
‘PRICE_TYPE’ => ‘S’,
‘RECUR_SCHEME_TYPE’ => ‘D’,
‘RECUR_SCHEME_LENGTH’ => ‘0’,
‘TRIAL_PRICE_ID’ => NULL,
‘WITHOUT_ORDER’ => ‘N’,
‘SELECT_BEST_PRICE’ => ‘Y’,
‘TMP_ID’ => NULL,
‘PURCHASING_PRICE’ => ‘0.00’,
‘PURCHASING_CURRENCY’ => ‘RUB’,
‘BARCODE_MULTI’ => ‘N’,
‘TIMESTAMP_X’ => ‘23.09.2014 11:18:14’,
‘SUBSCRIBE’ => ‘Y’,
‘SUBSCRIBE_ORIG’ => ‘D’,
‘TYPE’ => ‘1’,
),
)
и $res=CCatalogProduct::Update конечно уже срабатывает.
Прошу объяснить и подсказать, как сделать чтобы всегда product стоял.
Источник
CCatalogProduct
Методы класса
| Метод | Описание | С версии |
|---|---|---|
| Add | Метод добавляет (или обновляет) параметры товара к элементу каталога. | 3.3.5 (устарел с 17.6.0) |
| clearUsedCurrency | Метод указывает, что для расчета наименьшей цены в методе CCatalogProduct::GetOptimalPrice необходимо использовать базовую валюту. | 15.0.2 |
| CountPriceWithDiscount | Метод применяет к цене price в валюте currency наибольшую скидку из массива arDiscounts. | 4.0.4 |
| Delete | Метод удаляет из элемента каталога свойства, относящиеся к товару. | 3.3.5 (устарел с 17.6.0) |
| GetList | Метод возвращает результат выборки записей товаров в соответствии со своими параметрами. | 3.3.5 (устарел с 17.6.0) |
| GetByIDEx | Метод по коду товара ID возвращает все параметры этого товара, включая относящиеся к товару как к элементу информационного блока. | 3.3.5 |
| GetByID | Метод по коду товара ID возвращает массив параметров товара (которые относятся к товару как к таковому). | 3.3.5 |
| GetNearestQuantityPrice | Метод по коду товара ID возвращает количество товара, доступное для покупки. | 4.0.4 |
| GetOptimalPrice | Метод возвращает параметры наименьшей цены товара productID в количестве quantity для посетителя, входящего в группы пользователей arUserGroups. | 4.0.4 |
| getUsedCurrency | Метод возвращает текущую валюту, в которой считается наименьшая цена в методе CCatalogProduct::GetOptimalPrice. | 15.0.2 |
| IsExistProduct | Метод проверяет наличие информации о товаре с кодом intID. | 14.0.1 |
| QuantityTracer | Уменьшает количество на складе товара с кодом PRODUCT_ID на величину DELTA_QUANTITY, если указанное количество есть на складе и у товара установлен флаг «уменьшать количество товара при заказе». | 3.3.5 |
| Update | Метод обновляет параметры товара, относящиеся к товару как к таковому. | 3.3.5 (устарел с 17.6.0) |
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.
Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
Источник
Заполнение габаритов товара, после обмена с 1С, из свойств элемента инфоблока.
Если Ваш интернет-магазин интегрирован с 1С, скорее всего столкнулись с такой проблемой: 1С не умеет выгружать параметры товара: Вес, Ширина, Высота, Глубина.
Но эти параметры нужны для служб доставки, таких как Почта России, DHL и прочих. И желательно, что бы они были именно в параметрах товара модуля торгового каталога.
Заполнить их достаточно просто, для этого понадобиться создать дополнительные реквизиты в 1С с этими параметрами и воспользоваться методом API CCatalogProduct::Update
Заполняем параметры из свойств
Итак: мы создали доп реквизиты Вес, Ширина, Высота, Глубина в 1С, заполнили их и обменялись с сайтом. Теперь на сайте есть свойства ATT_WEIGHT, ATT_WIDTH, ATT_HEIGHT, ATT_LENGTH
Пишем простенький скрипт, который просто получит все элементы из инфоблока с каталогом (в примере, его с отбором данных свойств.
Если запустить этот скрипт, просто получим вывод всех товаров каталога с указанием ID элемента и наших свойств.
Зная эти свойства, просто загоняем их значения в стандартные поля торгового каталога, методом CCatalogProduct::Update
В примере, вывод с небольшой свисто-перделкой- он выводит уведомление об установке параметров. Можно этого не делать, просто вывести echo ‘Параметры успешно установлены’;
Данный скрипт, подразумевает, что Вы будете запускать его в ручную, по необходимости. Это оптимально, если в каталоге не высокая текучка товаров и параметры товаров не меняются постоянно.
Само собой, можете добавить его в init.php дабы скрипт срабатывал на событиях
OnAfterIBlockElementUpdate — обновление элемента
OnAfterIBlockElementAdd — добавление элемента
Что повысит время обмена с 1С и в целом, нагрузку на сервер. Лучше повесить скрипт на агента, что бы срабатывал с некоторой переодичностью (раз в сутки, например). На врядли габариты товаров меняются постоянно и при каждом обмене.
Дополнение: Если 1С выгружает габариты в множественное свойство «Реквизиты»
Если ваша 1С выгружает габариты товаров в множественное свойство «Реквизиты» (пример на скрине):
Можно также получить данные цифры методом CIBlockElement::GetProperty а дальше заполнить штатные поля товара способом выше
Пример кода (в данном случае, нужно было еще и перевести сантиметры в миллиметры):
Небольшое пояснение к происходяему в скрипте:
- От метода CIBlockElement::GetList нам нужен только ID товара. Поэтому используем Fetch (работает быстрее).
- Методом CIBlockElement::GetProperty получили значения свойства CML2_TRAITS и наполниили ими массив $VALUES.
- В массив $arFields передали элементы массива $VALUES со значениями габаритов (рапечатайте print_r($VALUES), что бы увидеть свои).
- Массив $VALUES принудительно создается именно в нутри цикла, что бы очищался при каждой итерации
Источник