При работе с интернет-магазином на 1С-Битрикс иногда возникает задача автоматически задать цену товаров — например, взять её из определённого свойства инфоблока или подгрузить из внешнего источника. В этой статье разберём, как написать подобный скрипт и какие методы d7 для этого использовать.
Устанавливаем цену из свойства инфоблока
Предположим, есть инфоблок, где в свойстве «Цена» (например, CUSTOM_PRICE) хранится стоимость товара и ее нужно установить в качестве базовой цены для всех элементов.
Для работы с элементами используется класс \Bitrix\Iblock\Elements\ElementIBLOCKCODETable, где IBLOCKCODE — Символьный код API. Он устанавливается в настройках инфоблока. Для примера наш код будет mycatalog и, название класса, соответственно, \Bitrix\Iblock\Elements\ElementMycatalogTable.
<?php
require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
$catalogGroupId = 1; // id типа цены
try {
$elements = \Bitrix\Iblock\Elements\ElementMyCatalogTable::getList([
'select' => ['ID', 'NAME', 'CUSTOM_PRICE', 'PRICE.ID'],
'filter' => [],
'runtime' => [
(new Bitrix\Main\ORM\Fields\Relations\Reference(
"PRICE",
Bitrix\Catalog\PriceTable::class,
Bitrix\Main\Entity\Query\Join::on("this.ID", "ref.PRODUCT_ID")
->where("ref.CATALOG_GROUP_ID", "=", $catalogGroupId)
))->configureJoinType(
\Bitrix\Main\ORM\Query\Join::TYPE_LEFT,
)
]
])->fetchCollection();
foreach ($elements as $element) {
$price = $element->get('PRICE');
$newPriceValue = $element->getCustomPrice()?->getValue();
if (!is_null($newPriceValue)) {
// обновляем текущую цену или добавляем новую
if (is_object($price)) {
$result = \Bitrix\Catalog\Model\Price::update($price->getId(), ['PRICE' => $newPriceValue]);
} else {
$result = \Bitrix\Catalog\Model\Price::add([
'PRODUCT_ID' => $element->getId(),
'CATALOG_GROUP_ID' => $catalogGroupId,
'CURRENCY' => 'RUB', // валюту по умолчанию можно получить через \Bitrix\Currency\CurrencyManager::getBaseCurrency()
'PRICE' => $newPriceValue,
]);
}
if (!$result->isSuccess()) {
echo sprintf(
"Ошибка при обновлении элемента %s: %s\n",
$element->getName(),
implode(', ', $result->getErrorMessages())
);
}
}
}
} catch (Throwable $e) {
echo "Непредвиденная ошибка " . $e->getMessage();
}
require($_SERVER["DOCUMENT_ROOT"] . '/bitrix/modules/main/include/epilog_after.php');
Кратко разберем, что же здесь происходит:
- Выбираем все элементы из инфоблока my_catalog. В select явно добавлено свойство CUSTOM_PRICE, из которого мы будем устанавливать цену
- В примере фильтр пустой и предполагаем, что обновлять будем сразу все элементы. В реальности можно как угодно ограничить выборку
- В секции runtime мы джойним таблицу с текущими ценами элементов. При этом используется LEFT JOIN, чтобы при отсутствии цены элемент инфоблока все равно попал в выборку. Также мы ограничиваем join типом цены, по которой будем обновлять.
- Пробегаемся по всем элементам и обновляем цену, если она уже есть или добавляем, если ее ранее не было
Больше статей и материалов по web-разработке в tg-канале - подписывайтесь!
Подписаться в telegram